diff --git a/.github/workflows/blockchain-contracts-abi.yml b/.github/workflows/blockchain-contracts-abi.yml index 2bcdb3fa..ca9e37f8 100644 --- a/.github/workflows/blockchain-contracts-abi.yml +++ b/.github/workflows/blockchain-contracts-abi.yml @@ -16,14 +16,14 @@ jobs: name: Check Blockchain Contract ABI staleness runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: submodules: recursive - name: Install rust uses: dtolnay/rust-toolchain@master with: - toolchain: '1.86' # keep in sync with rust/lit-node/rust-toolchain.toml + toolchain: '1.91' # keep in sync with rust/lit-node/rust-toolchain.toml components: rustfmt - name: Run Contract Updates diff --git a/.github/workflows/blockchain-contracts.yml b/.github/workflows/blockchain-contracts.yml index 79398803..e33b2c28 100644 --- a/.github/workflows/blockchain-contracts.yml +++ b/.github/workflows/blockchain-contracts.yml @@ -24,7 +24,7 @@ jobs: runs-on: warp-ubuntu-latest-x64-8x # change to LargeRunner to run on github. Change to self-hosted to run on our own runner. Change to buildjet-8vcpu-ubuntu-2204 to run on buildjet with 8 cpus steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: submodules: recursive - name: Use Node.js @@ -51,7 +51,7 @@ jobs: runs-on: warp-ubuntu-latest-x64-8x # change to LargeRunner to run on github. Change to self-hosted to run on our own runner. Change to buildjet-8vcpu-ubuntu-2204 to run on buildjet with 8 cpus steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: submodules: recursive - name: Use Node.js @@ -78,7 +78,7 @@ jobs: runs-on: LargeRunner # change to LargeRunner to run on github. Change to self-hosted to run on our own runner. Change to buildjet-8vcpu-ubuntu-2204 to run on buildjet with 8 cpus steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: submodules: recursive - name: Use Node.js diff --git a/.github/workflows/blockchain-prettier.yml b/.github/workflows/blockchain-prettier.yml index b90fa2c1..a816cb8a 100644 --- a/.github/workflows/blockchain-prettier.yml +++ b/.github/workflows/blockchain-prettier.yml @@ -16,7 +16,7 @@ jobs: prettier_check: runs-on: warp-ubuntu-latest-x64-2x # change to LargeRunner to run on github. Change to self-hosted to run on our own runner. Change to buildjet-8vcpu-ubuntu-2204 to run on buildjet with 8 cpus steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Use Node.js uses: WarpBuilds/setup-node@v4 with: diff --git a/.github/workflows/delete-buildjet-cache.yml b/.github/workflows/delete-buildjet-cache.yml index 8516ddb1..e751c509 100644 --- a/.github/workflows/delete-buildjet-cache.yml +++ b/.github/workflows/delete-buildjet-cache.yml @@ -11,7 +11,7 @@ jobs: runs-on: warp-ubuntu-latest-x64-2x steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - uses: buildjet/cache-delete@v1 with: cache_key: ${{ inputs.cache_key }} diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index 63b8fc06..cd399e52 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -23,7 +23,7 @@ jobs: fi - name: Checkout Repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ inputs.release_branch || github.ref }} fetch-depth: 0 diff --git a/.github/workflows/deploy-lit-node-monitor.yml b/.github/workflows/deploy-lit-node-monitor.yml index acee0394..1b67e018 100644 --- a/.github/workflows/deploy-lit-node-monitor.yml +++ b/.github/workflows/deploy-lit-node-monitor.yml @@ -45,7 +45,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 # Install Rust Nightly Toolchain, with Clippy & Rustfmt - name: Install nightly Rust diff --git a/.github/workflows/deploy-release-ui.yml b/.github/workflows/deploy-release-ui.yml index cd127883..69bdad49 100644 --- a/.github/workflows/deploy-release-ui.yml +++ b/.github/workflows/deploy-release-ui.yml @@ -36,7 +36,7 @@ jobs: steps: - name: Checkout UI Code from lit-ansible - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: repository: 'LIT-Protocol/lit-ansible' path: 'lit-ansible' @@ -45,10 +45,10 @@ jobs: # When triggered manually, use the branch specified in the input. ref: ${{ github.event.inputs.source_branch || 'master' }} - - name: Checkout Release Data from lit-assets - uses: actions/checkout@v5 + - name: Checkout Release Data from lit-peer + uses: actions/checkout@v6 with: - repository: 'LIT-Protocol/lit-assets' + repository: 'LIT-Protocol/lit-peer' ref: 'releases-info' path: 'lit-ansible/release-data-store' @@ -58,7 +58,7 @@ jobs: node-version: '20' - name: Cache Node Modules - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: lit-ansible/infrastructure/release-info-store/node_modules key: ${{ runner.os }}-node-${{ hashFiles('lit-ansible/infrastructure/release-info-store/package-lock.json') }} diff --git a/.github/workflows/docker-ubuntu2204-image.yml b/.github/workflows/docker-ubuntu2204-image.yml index c92e306d..06e9904d 100644 --- a/.github/workflows/docker-ubuntu2204-image.yml +++ b/.github/workflows/docker-ubuntu2204-image.yml @@ -12,7 +12,7 @@ jobs: build: runs-on: LargeRunner steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - id: pre-step shell: bash run: echo "release-version=$(date +%s)" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/lint-workflow-files.yml b/.github/workflows/lint-workflow-files.yml index 997b84b6..3cfde2ba 100644 --- a/.github/workflows/lint-workflow-files.yml +++ b/.github/workflows/lint-workflow-files.yml @@ -10,12 +10,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Download actionlint run: | curl -sfL https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash | bash -s -- latest ${{ github.workspace }} - name: Run actionlint - run: ${{ github.workspace }}/actionlint -ignore 'label ".+" is unknown' + run: ${{ github.workspace }}/actionlint -ignore 'label ".+" is unknown' -ignore '"false" is always evaluated to false.' env: # Part of what actionlint does under the hood is to use the Shellcheck tool to lint against where we use the run field to specify shell commands to run. # Silence the following shellcheck errors since they are not too applicable. diff --git a/.github/workflows/list-changed-files.yml b/.github/workflows/list-changed-files.yml index 7e4ad837..b90ddead 100644 --- a/.github/workflows/list-changed-files.yml +++ b/.github/workflows/list-changed-files.yml @@ -34,7 +34,7 @@ jobs: uses: tj-actions/branch-names@v9 - name: Make sure we checked out develop, so we can get it's sha - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ steps.branch-name.outputs.base_ref_branch }} @@ -58,7 +58,7 @@ jobs: blockchain_changed: ${{ steps.changed-files-yaml.outputs.blockchain_any_modified }} steps: - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Print base sha run: | diff --git a/.github/workflows/rust-cargo-fetch.yml b/.github/workflows/rust-cargo-fetch.yml index 64408408..7877f144 100644 --- a/.github/workflows/rust-cargo-fetch.yml +++ b/.github/workflows/rust-cargo-fetch.yml @@ -18,7 +18,7 @@ jobs: name: Verify Cargo Dependencies runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Install rust uses: dtolnay/rust-toolchain@master diff --git a/.github/workflows/rust-lit-actions.yml b/.github/workflows/rust-lit-actions.yml index ce1b83d3..2202c8dd 100644 --- a/.github/workflows/rust-lit-actions.yml +++ b/.github/workflows/rust-lit-actions.yml @@ -36,11 +36,11 @@ jobs: rm -rf ../../lit-assets mkdir -p ${{ github.workspace }} - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install rust uses: dtolnay/rust-toolchain@master with: - toolchain: '1.86' # keep in sync with rust/lit-node/rust-toolchain.toml + toolchain: '1.91' # keep in sync with rust/lit-node/rust-toolchain.toml components: rustfmt clippy rust-src - name: Install tools uses: taiki-e/install-action@v2 diff --git a/.github/workflows/rust-lit-core.yml b/.github/workflows/rust-lit-core.yml index 59e7bb68..8bf3486a 100644 --- a/.github/workflows/rust-lit-core.yml +++ b/.github/workflows/rust-lit-core.yml @@ -36,11 +36,11 @@ jobs: rm -rf ../../lit-assets mkdir -p ${{ github.workspace }} - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install rust uses: dtolnay/rust-toolchain@master with: - toolchain: "1.86" # keep in sync with rust/lit-core/rust-toolchain.toml + toolchain: "1.91" # keep in sync with rust/lit-core/rust-toolchain.toml components: rustfmt clippy rust-src - name: Rust Cache uses: WarpBuilds/rust-cache@v2 diff --git a/.github/workflows/rust-lit-node-build-commit-hash.yml b/.github/workflows/rust-lit-node-build-commit-hash.yml index 976159f1..6f390595 100644 --- a/.github/workflows/rust-lit-node-build-commit-hash.yml +++ b/.github/workflows/rust-lit-node-build-commit-hash.yml @@ -31,7 +31,7 @@ jobs: rm -rf ../../lit-assets mkdir -p ${{ github.workspace }} - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 - uses: de-vri-es/setup-git-credentials@v2 with: credentials: https://glitch003:${{secrets.READ_ONLY_PAT}}@github.com/ @@ -48,7 +48,7 @@ jobs: - name: Install rust uses: dtolnay/rust-toolchain@master with: - toolchain: '1.86' # keep in sync with rust/lit-node/rust-toolchain.toml + toolchain: '1.91' # keep in sync with rust/lit-node/rust-toolchain.toml components: rustfmt rust-src - name: Build node run: cargo build --features lit-actions,testing @@ -59,7 +59,7 @@ jobs: working-directory: rust/lit-node/shiva run: cargo build - name: Upload build artifact - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: lit_node_${{ github.sha }} path: | diff --git a/.github/workflows/rust-lit-node-build-if-needed.yml b/.github/workflows/rust-lit-node-build-if-needed.yml index 5d72ff44..1fe30b83 100644 --- a/.github/workflows/rust-lit-node-build-if-needed.yml +++ b/.github/workflows/rust-lit-node-build-if-needed.yml @@ -25,7 +25,7 @@ jobs: artifact_exists: ${{ steps.artifact_exists.outputs.cache-hit }} steps: - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 - uses: de-vri-es/setup-git-credentials@v2 with: credentials: https://glitch003:${{secrets.READ_ONLY_PAT}}@github.com/ diff --git a/.github/workflows/rust-lit-node-build.yml b/.github/workflows/rust-lit-node-build.yml index 489a41a4..11b36561 100644 --- a/.github/workflows/rust-lit-node-build.yml +++ b/.github/workflows/rust-lit-node-build.yml @@ -42,7 +42,7 @@ jobs: rm -rf ../../lit-assets mkdir -p ${{ github.workspace }} - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 - uses: de-vri-es/setup-git-credentials@v2 with: credentials: https://glitch003:${{secrets.READ_ONLY_PAT}}@github.com/ @@ -61,7 +61,7 @@ jobs: - name: Install rust uses: dtolnay/rust-toolchain@master with: - toolchain: '1.86' # keep in sync with rust/lit-node/lit-node/rust-toolchain.toml + toolchain: '1.91' # keep in sync with rust/lit-node/lit-node/rust-toolchain.toml components: rustfmt rust-src - name: Setup local files for testing run: make setup-local-files diff --git a/.github/workflows/rust-lit-node-clippy.yml b/.github/workflows/rust-lit-node-clippy.yml index 027674d0..266fa57a 100644 --- a/.github/workflows/rust-lit-node-clippy.yml +++ b/.github/workflows/rust-lit-node-clippy.yml @@ -46,14 +46,14 @@ jobs: working-directory: ${{ github.workspace }} run: sudo apt-get update && sudo apt-get install -y libudev-dev libsqlite3-dev cmake protobuf-compiler - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 - uses: de-vri-es/setup-git-credentials@v2 with: credentials: https://glitch003:${{secrets.READ_ONLY_PAT}}@github.com/ - name: Install rust uses: dtolnay/rust-toolchain@master with: - toolchain: "1.86" # keep in sync with rust/lit-node/lit-node/rust-toolchain.toml + toolchain: "1.91" # keep in sync with rust/lit-node/lit-node/rust-toolchain.toml components: rustfmt clippy rust-src - name: Cargo fmt check run: cargo fmt -- --check diff --git a/.github/workflows/rust-lit-node-fault-tests.yml b/.github/workflows/rust-lit-node-fault-tests.yml index 8e8c2e18..dbcae65e 100644 --- a/.github/workflows/rust-lit-node-fault-tests.yml +++ b/.github/workflows/rust-lit-node-fault-tests.yml @@ -68,7 +68,7 @@ jobs: working-directory: ${{ github.workspace }} run: sudo apt-get update && sudo apt-get install -y zstd - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive - name: Use Node.js diff --git a/.github/workflows/rust-lit-node-group-unit-and-integration-tests.yml b/.github/workflows/rust-lit-node-group-unit-and-integration-tests.yml index 2c2c61b7..7b6e2305 100644 --- a/.github/workflows/rust-lit-node-group-unit-and-integration-tests.yml +++ b/.github/workflows/rust-lit-node-group-unit-and-integration-tests.yml @@ -71,14 +71,14 @@ jobs: working-directory: ${{ github.workspace }} run: sudo apt-get update && sudo apt-get install -y libudev-dev libsqlite3-dev cmake protobuf-compiler - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 - uses: de-vri-es/setup-git-credentials@v2 with: credentials: https://glitch003:${{secrets.READ_ONLY_PAT}}@github.com/ - name: Install rust uses: dtolnay/rust-toolchain@master with: - toolchain: '1.86' # keep in sync with rust/lit-node/rust-toolchain.toml + toolchain: '1.91' # keep in sync with rust/lit-node/rust-toolchain.toml - name: Rust Cache uses: WarpBuilds/rust-cache@v2 with: @@ -116,7 +116,7 @@ jobs: working-directory: ${{ github.workspace }} run: sudo apt-get update && sudo apt-get install -y zstd libudev-dev libsqlite3-dev cmake protobuf-compiler - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive - uses: de-vri-es/setup-git-credentials@v2 @@ -182,7 +182,7 @@ jobs: working-directory: ${{ github.workspace }} run: sudo apt-get update && sudo apt-get install -y zstd libudev-dev libsqlite3-dev cmake protobuf-compiler - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 submodules: recursive @@ -201,7 +201,7 @@ jobs: - name: Install rust because the version upgrade tests do a recompile uses: dtolnay/rust-toolchain@master with: - toolchain: '1.86' # keep in sync with rust/lit-node/rust-toolchain.toml + toolchain: '1.91' # keep in sync with rust/lit-node/rust-toolchain.toml components: rust-src - name: Install nextest run: curl -LsSf https://get.nexte.st/latest/linux | tar zxf - -C "${CARGO_HOME:-$HOME/.cargo}/bin" @@ -231,7 +231,7 @@ jobs: env: RUST_LOG: debug - name: Download the latest build for release-habanero-* branch - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: name: lit_node_${{ steps.get_latest_commit_sha.outputs.COMMIT_SHA_HABANERO }} run-id: ${{ steps.get_latest_workflow_run_id.outputs.LATEST_WORKFLOW_RUN_ID_HABANERO }} @@ -240,7 +240,7 @@ jobs: - name: Move the downloaded binary run: mv lit_node target/debug/lit_node_${{ steps.get_latest_commit_sha.outputs.COMMIT_SHA_HABANERO }} - name: Download the latest build for release-manzano-* branch - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: name: lit_node_${{ steps.get_latest_commit_sha.outputs.COMMIT_SHA_MANZANO }} run-id: ${{ steps.get_latest_workflow_run_id.outputs.LATEST_WORKFLOW_RUN_ID_MANZANO }} @@ -249,7 +249,7 @@ jobs: - name: Move the downloaded binary run: mv lit_node target/debug/lit_node_${{ steps.get_latest_commit_sha.outputs.COMMIT_SHA_MANZANO }} - name: Download the latest build for release-cayenne-* branch - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: name: lit_node_${{ steps.get_latest_commit_sha.outputs.COMMIT_SHA_CAYENNE }} run-id: ${{ steps.get_latest_workflow_run_id.outputs.LATEST_WORKFLOW_RUN_ID_CAYENNE }} diff --git a/.github/workflows/rust-lit-node-long-running-tests.yml b/.github/workflows/rust-lit-node-long-running-tests.yml index 6baa77ac..7af8d456 100644 --- a/.github/workflows/rust-lit-node-long-running-tests.yml +++ b/.github/workflows/rust-lit-node-long-running-tests.yml @@ -66,7 +66,7 @@ jobs: working-directory: ${{ github.workspace }} run: sudo apt-get update && sudo apt-get install -y zstd - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive - name: Use Node.js diff --git a/.github/workflows/rust-lit-node-monitor.yml b/.github/workflows/rust-lit-node-monitor.yml index 672165ba..7a97d3f9 100644 --- a/.github/workflows/rust-lit-node-monitor.yml +++ b/.github/workflows/rust-lit-node-monitor.yml @@ -27,7 +27,7 @@ jobs: rm -rf ../../lit-assets mkdir -p ${{ github.workspace }} - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install deps working-directory: ${{ github.workspace }} run: sudo apt-get update && sudo apt-get install -y libudev-dev libsqlite3-dev cmake protobuf-compiler diff --git a/.github/workflows/rust-lit-node-perf-tests.yml b/.github/workflows/rust-lit-node-perf-tests.yml index 75cf5472..0a5d280f 100644 --- a/.github/workflows/rust-lit-node-perf-tests.yml +++ b/.github/workflows/rust-lit-node-perf-tests.yml @@ -66,7 +66,7 @@ jobs: working-directory: ${{ github.workspace }} run: sudo apt-get update && sudo apt-get install -y zstd - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive - name: Use Node.js diff --git a/.github/workflows/rust-lit-node-tag.yml b/.github/workflows/rust-lit-node-tag.yml index 52c3c6fb..3b636a2b 100644 --- a/.github/workflows/rust-lit-node-tag.yml +++ b/.github/workflows/rust-lit-node-tag.yml @@ -13,7 +13,7 @@ jobs: runs-on: LargeRunner steps: - name: "Check out the repo" - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: "Get tag" id: "get-tag" diff --git a/.github/workflows/rust-lit-os.yml b/.github/workflows/rust-lit-os.yml index 0684b746..7d5fb07d 100644 --- a/.github/workflows/rust-lit-os.yml +++ b/.github/workflows/rust-lit-os.yml @@ -39,11 +39,11 @@ jobs: working-directory: ${{ github.workspace }} run: sudo apt-get update && sudo apt-get install -y libcryptsetup-dev libacl1-dev - name: Checkout lit-assets - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install rust uses: dtolnay/rust-toolchain@master with: - toolchain: "1.86" # keep in sync with rust/lit-os/rust-toolchain.toml + toolchain: "1.91" # keep in sync with rust/lit-os/rust-toolchain.toml components: rustfmt clippy rust-src - name: Rust Cache uses: WarpBuilds/rust-cache@v2 diff --git a/blockchain/contracts/abis/BackupRecovery.abi b/blockchain/contracts/abis/BackupRecovery.abi index 4c2bf8f7..686f9504 100644 --- a/blockchain/contracts/abis/BackupRecovery.abi +++ b/blockchain/contracts/abis/BackupRecovery.abi @@ -833,6 +833,11 @@ "internalType": "bytes", "name": "sessionId", "type": "bytes" + }, + { + "internalType": "string", + "name": "keySetId", + "type": "string" } ], "name": "registerRecoveryKeys", diff --git a/blockchain/contracts/abis/ContractResolver.abi b/blockchain/contracts/abis/ContractResolver.abi index 6c59e6ba..cbeb34b5 100644 --- a/blockchain/contracts/abis/ContractResolver.abi +++ b/blockchain/contracts/abis/ContractResolver.abi @@ -388,6 +388,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "PUB_KEY_ROUTER_VIEWS_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "RATE_LIMIT_NFT_CONTRACT", diff --git a/blockchain/contracts/abis/PubkeyRouter.abi b/blockchain/contracts/abis/PubkeyRouter.abi index adad0d08..b800ac98 100644 --- a/blockchain/contracts/abis/PubkeyRouter.abi +++ b/blockchain/contracts/abis/PubkeyRouter.abi @@ -497,6 +497,12 @@ "internalType": "bytes32", "name": "derivedKeyId", "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" } ], "name": "PubkeyRoutingDataSet", @@ -618,6 +624,156 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "getTrustedForwarder", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" + } + ], + "name": "setRoutingData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" + } + ], + "name": "setRoutingDataAsAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "forwarder", + "type": "address" + } + ], + "name": "setTrustedForwarder", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "identifier", + "type": "string" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "internalType": "struct IPubkeyRouter.RootKey[]", + "name": "newRootKeys", + "type": "tuple[]" + } + ], + "name": "voteForRootKeys", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -916,6 +1072,11 @@ "internalType": "bytes32", "name": "derivedKeyId", "type": "bytes32" + }, + { + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" } ], "internalType": "struct LibPubkeyRouterStorage.PubkeyRoutingData", @@ -926,19 +1087,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getTrustedForwarder", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -984,6 +1132,11 @@ "internalType": "bytes32", "name": "derivedKeyId", "type": "bytes32" + }, + { + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" } ], "internalType": "struct LibPubkeyRouterStorage.PubkeyRoutingData", @@ -993,132 +1146,5 @@ ], "stateMutability": "view", "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newResolverAddress", - "type": "address" - } - ], - "name": "setContractResolver", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - }, - { - "internalType": "address", - "name": "stakingContractAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "keyType", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "derivedKeyId", - "type": "bytes32" - } - ], - "name": "setRoutingData", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - }, - { - "internalType": "address", - "name": "stakingContract", - "type": "address" - }, - { - "internalType": "uint256", - "name": "keyType", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "derivedKeyId", - "type": "bytes32" - } - ], - "name": "setRoutingDataAsAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "forwarder", - "type": "address" - } - ], - "name": "setTrustedForwarder", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "stakingContractAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "identifier", - "type": "string" - }, - { - "components": [ - { - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "keyType", - "type": "uint256" - } - ], - "internalType": "struct IPubkeyRouter.RootKey[]", - "name": "newRootKeys", - "type": "tuple[]" - } - ], - "name": "voteForRootKeys", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" } ] diff --git a/blockchain/contracts/abis/Staking.abi b/blockchain/contracts/abis/Staking.abi index 9af533ee..813a6dcf 100644 --- a/blockchain/contracts/abis/Staking.abi +++ b/blockchain/contracts/abis/Staking.abi @@ -390,6 +390,11 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "CallerNotOwner", + "type": "error" + }, { "inputs": [ { @@ -579,6 +584,71 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "realmId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "maxConcurrentRequests", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPresignCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minPresignCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "peerCheckingIntervalSecs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPresignConcurrency", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "rpcHealthcheckEnabled", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "minEpochForRewards", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "permittedValidatorsOn", + "type": "bool" + }, + { + "internalType": "string", + "name": "defaultKeySet", + "type": "string" + } + ], + "internalType": "struct LibStakingStorage.RealmConfig", + "name": "newConfig", + "type": "tuple" + } + ], + "name": "setRealmConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -690,11 +760,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "CallerNotOwner", - "type": "error" - }, { "inputs": [], "name": "CallerNotOwnerOrDevopsAdmin", @@ -1328,11 +1393,6 @@ "name": "tokenRewardPerTokenPerEpoch", "type": "uint256" }, - { - "internalType": "uint256[]", - "name": "keyTypes", - "type": "uint256[]" - }, { "internalType": "uint256", "name": "minimumValidatorCount", @@ -1684,66 +1744,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "realmId", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "maxConcurrentRequests", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPresignCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minPresignCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "peerCheckingIntervalSecs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPresignConcurrency", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "rpcHealthcheckEnabled", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "minEpochForRewards", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "permittedValidatorsOn", - "type": "bool" - } - ], - "internalType": "struct LibStakingStorage.RealmConfig", - "name": "newConfig", - "type": "tuple" - } - ], - "name": "setRealmConfig", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -2685,9 +2685,9 @@ "type": "uint256[]" }, { - "internalType": "address[]", - "name": "recoveryPartyMembers", - "type": "address[]" + "internalType": "bytes", + "name": "recoverySessionId", + "type": "bytes" } ], "internalType": "struct LibStakingStorage.KeySetConfig", @@ -2745,9 +2745,9 @@ "type": "uint256[]" }, { - "internalType": "address[]", - "name": "recoveryPartyMembers", - "type": "address[]" + "internalType": "bytes", + "name": "recoverySessionId", + "type": "bytes" } ], "internalType": "struct LibStakingStorage.KeySetConfig[]", @@ -2803,9 +2803,9 @@ "type": "uint256[]" }, { - "internalType": "address[]", - "name": "recoveryPartyMembers", - "type": "address[]" + "internalType": "bytes", + "name": "recoverySessionId", + "type": "bytes" } ], "internalType": "struct LibStakingStorage.KeySetConfig", @@ -3299,67 +3299,6 @@ "name": "ComplaintConfigSet", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "newTokenRewardPerTokenPerEpoch", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "newKeyTypes", - "type": "uint256[]" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMinimumValidatorCount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMaxConcurrentRequests", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMaxPresignCount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMinPresignCount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newPeerCheckingIntervalSecs", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMaxPresignConcurrency", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bool", - "name": "newRpcHealthcheckEnabled", - "type": "bool" - } - ], - "name": "ConfigSet", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -4679,19 +4618,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getKeyTypes", - "outputs": [ - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -5986,11 +5912,6 @@ "name": "tokenRewardPerTokenPerEpoch", "type": "uint256" }, - { - "internalType": "uint256[]", - "name": "keyTypes", - "type": "uint256[]" - }, { "internalType": "uint256", "name": "minimumValidatorCount", @@ -6641,6 +6562,11 @@ "internalType": "bool", "name": "permittedValidatorsOn", "type": "bool" + }, + { + "internalType": "string", + "name": "defaultKeySet", + "type": "string" } ], "internalType": "struct LibStakingStorage.RealmConfig", diff --git a/blockchain/contracts/abis/generated.ts b/blockchain/contracts/abis/generated.ts index a379b55e..bfdcd584 100644 --- a/blockchain/contracts/abis/generated.ts +++ b/blockchain/contracts/abis/generated.ts @@ -21979,9 +21979,9 @@ export const stakingDiamondAbi = [ { name: 'curves', internalType: 'uint256[]', type: 'uint256[]' }, { name: 'counts', internalType: 'uint256[]', type: 'uint256[]' }, { - name: 'recoveryPartyMembers', - internalType: 'address[]', - type: 'address[]', + name: 'recoverySessionId', + internalType: 'bytes', + type: 'bytes', }, ], }, @@ -23103,9 +23103,9 @@ export const stakingDiamondAbi = [ { name: 'curves', internalType: 'uint256[]', type: 'uint256[]' }, { name: 'counts', internalType: 'uint256[]', type: 'uint256[]' }, { - name: 'recoveryPartyMembers', - internalType: 'address[]', - type: 'address[]', + name: 'recoverySessionId', + internalType: 'bytes', + type: 'bytes', }, ], }, @@ -23941,9 +23941,9 @@ export const stakingDiamondAbi = [ { name: 'curves', internalType: 'uint256[]', type: 'uint256[]' }, { name: 'counts', internalType: 'uint256[]', type: 'uint256[]' }, { - name: 'recoveryPartyMembers', - internalType: 'address[]', - type: 'address[]', + name: 'recoverySessionId', + internalType: 'bytes', + type: 'bytes', }, ], }, @@ -26164,9 +26164,9 @@ export const stakingKeySetsFacetAbi = [ { name: 'curves', internalType: 'uint256[]', type: 'uint256[]' }, { name: 'counts', internalType: 'uint256[]', type: 'uint256[]' }, { - name: 'recoveryPartyMembers', - internalType: 'address[]', - type: 'address[]', + name: 'recoverySessionId', + internalType: 'bytes', + type: 'bytes', }, ], }, @@ -30577,9 +30577,9 @@ export const stakingViewsFacetAbi = [ { name: 'curves', internalType: 'uint256[]', type: 'uint256[]' }, { name: 'counts', internalType: 'uint256[]', type: 'uint256[]' }, { - name: 'recoveryPartyMembers', - internalType: 'address[]', - type: 'address[]', + name: 'recoverySessionId', + internalType: 'bytes', + type: 'bytes', }, ], }, @@ -31415,9 +31415,9 @@ export const stakingViewsFacetAbi = [ { name: 'curves', internalType: 'uint256[]', type: 'uint256[]' }, { name: 'counts', internalType: 'uint256[]', type: 'uint256[]' }, { - name: 'recoveryPartyMembers', - internalType: 'address[]', - type: 'address[]', + name: 'recoverySessionId', + internalType: 'bytes', + type: 'bytes', }, ], }, diff --git a/blockchain/contracts/contracts/lit-core/ContractResolver.sol b/blockchain/contracts/contracts/lit-core/ContractResolver.sol index 39f4e37a..95e9924a 100644 --- a/blockchain/contracts/contracts/lit-core/ContractResolver.sol +++ b/blockchain/contracts/contracts/lit-core/ContractResolver.sol @@ -10,7 +10,7 @@ contract ContractResolver is AccessControl { // the comments following each one of these are the keccak256 hashes of the string values // this is very useful if you have to manually set any of these, so that you - // don't have to calculate the hahes yourself. + // don't have to calculate the hashes yourself. bytes32 public constant ADMIN_ROLE = keccak256("ADMIN"); // 0xdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42 @@ -23,6 +23,8 @@ contract ContractResolver is AccessControl { bytes32 public constant LIT_TOKEN_CONTRACT = keccak256("LIT_TOKEN"); bytes32 public constant PUB_KEY_ROUTER_CONTRACT = keccak256("PUB_KEY_ROUTER"); // 0xb1f79813bc7630a52ae948bc99781397e409d0dd3521953bf7d8d7a2db6147f7 + bytes32 public constant PUB_KEY_ROUTER_VIEWS_CONTRACT = + keccak256("PUB_KEY_ROUTER_VIEWS"); // 0x4c3f3e2f3e5d3e6f0c8e4f6b7a1e8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8091 bytes32 public constant PKP_NFT_CONTRACT = keccak256("PKP_NFT"); // 0xb7b4fde9944d3c13e9a78835431c33a5084d90a7f0c73def76d7886315fe87b0 bytes32 public constant RATE_LIMIT_NFT_CONTRACT = keccak256("RATE_LIMIT_NFT"); // 0xb931b2719aeb2a65a5035fa0a190bfdc4c8622ce8cbff7a3d1ab42531fb1a918 diff --git a/blockchain/contracts/contracts/lit-node/BackupRecovery/BackupRecoveryFacet.sol b/blockchain/contracts/contracts/lit-node/BackupRecovery/BackupRecoveryFacet.sol index 713c0be0..8c0538d7 100644 --- a/blockchain/contracts/contracts/lit-node/BackupRecovery/BackupRecoveryFacet.sol +++ b/blockchain/contracts/contracts/lit-node/BackupRecovery/BackupRecoveryFacet.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.17; import { ContractResolver } from "../../lit-core/ContractResolver.sol"; import { LibBackupRecoveryStorage } from "./LibBackupRecoveryStorage.sol"; +import { LibStakingStorage } from "../Staking/LibStakingStorage.sol"; import { StakingViewsFacet } from "../Staking/StakingViewsFacet.sol"; import { LibDiamond } from "../../libraries/LibDiamond.sol"; import { EnumerableMap } from "@openzeppelin/contracts/utils/structs/EnumerableMap.sol"; @@ -45,6 +46,14 @@ contract BackupRecoveryFacet { return LibBackupRecoveryStorage.getStorage(); } + function ss() + internal + pure + returns (LibStakingStorage.GlobalStakingStorage storage) + { + return LibStakingStorage.getStakingStorage(); + } + function _getStakingViewsFacet() public view returns (StakingViewsFacet) { address stakingAddress = s().resolver.getContract( s().resolver.STAKING_CONTRACT(), @@ -323,10 +332,15 @@ contract BackupRecoveryFacet { delete s().nextState[0].backupMemberPeerMapping[oldPartyMember]; delete s().nextState[0].peerToBackupMemberMapping[oldPeer]; delete s().nextState[0].keysReceived[oldPartyMember]; - delete s().nextState[0].registeredRecoveryKeys; delete s().submittedProofs[oldPartyMember]; // No need to delete `votesToRegisterRecoveryKeys` as the pubKey will be different for all the DKGs } + delete s().nextState[0].registeredRecoveryKeys; + for (uint i = 0; i < s().nextState[0].keySetIds.length; i++) { + string memory keySetId = s().nextState[0].keySetIds[i]; + delete s().nextState[0].keySetIdExists[keySetId]; + } + delete s().nextState[0].keySetIds; } /** @@ -336,7 +350,8 @@ contract BackupRecoveryFacet { */ function registerRecoveryKeys( LibBackupRecoveryStorage.RecoveryKey[] memory recoveryKeys, - bytes memory sessionId + bytes memory sessionId, + string memory keySetId ) public { require( s().nextState[0].partyMembers.length > 1, @@ -381,6 +396,10 @@ contract BackupRecoveryFacet { .nextState[0] .votesToRegisterRecoveryKeys[recoveryKey.pubkey] .voted[msg.sender] = true; + if (!s().nextState[0].keySetIdExists[keySetId]) { + s().nextState[0].keySetIdExists[keySetId] = true; + s().nextState[0].keySetIds.push(keySetId); + } // If all the Recovery peers have voted, register it if ( @@ -393,6 +412,13 @@ contract BackupRecoveryFacet { // once a recovery key is registered so is the sessionId s().nextState[0].sessionId = sessionId; + for (uint i = 0; i < s().nextState[0].keySetIds.length; i++) { + string memory keySetId = s().nextState[0].keySetIds[i]; + ss() + .keySetsConfigs[keccak256(abi.encodePacked(keySetId))] + .recoverySessionId = sessionId; + } + emit RecoveryKeySet(recoveryKey); } } @@ -489,7 +515,7 @@ contract BackupRecoveryFacet { ); LibBackupRecoveryStorage.RecoveredPeerId[] - storage recovered_peer_ids = s().recovered_peer_ids; + storage recovered_peer_ids = s().recovered_peer_ids[0]; for (uint256 i = 0; i < recovered_peer_ids.length; i++) { if (recovered_peer_ids[i].node_address == msg.sender) { recovered_peer_ids[i].old_peer_id = old_peer_id; @@ -517,7 +543,7 @@ contract BackupRecoveryFacet { view returns (LibBackupRecoveryStorage.RecoveredPeerId[] memory peer_ids) { - return s().recovered_peer_ids; + return s().recovered_peer_ids[0]; } /** diff --git a/blockchain/contracts/contracts/lit-node/BackupRecovery/LibBackupRecoveryStorage.sol b/blockchain/contracts/contracts/lit-node/BackupRecovery/LibBackupRecoveryStorage.sol index 5f64d0ed..14cb0a08 100644 --- a/blockchain/contracts/contracts/lit-node/BackupRecovery/LibBackupRecoveryStorage.sol +++ b/blockchain/contracts/contracts/lit-node/BackupRecovery/LibBackupRecoveryStorage.sol @@ -35,6 +35,8 @@ library LibBackupRecoveryStorage { struct RecoveryKey { bytes pubkey; uint256 keyType; // see rust/lit-node/src/tss/common/curve_type.rs 1 = BLS, 2 = K256, etc. Not doing this in an enum so we can add more keytypes in the future without redeploying. + // NOTE: DO NOT ADD ANYTHING TO THIS STRUCT SINCE IT IS NOT CONTAINED IN A MAPPING IN THE ROOT LEVEL STORAGE STRUCT + // AND MAY RESULT IN STORAGE POINTERS SHIFTING. } /** @@ -62,6 +64,8 @@ library LibBackupRecoveryStorage { RecoveryKey[] registeredRecoveryKeys; bytes sessionId; uint256 partyThreshold; + mapping(string => bool) keySetIdExists; + string[] keySetIds; } struct K256Proof { @@ -99,7 +103,8 @@ library LibBackupRecoveryStorage { // A mapping from the node address and peer id of a recovering node to the peer id // of the node which generated the the private shares that it recovered. // Necessary for the first DKG after the recovery - RecoveredPeerId[] recovered_peer_ids; + // Use recovered_peer_ids[0] for now. + mapping(uint256 => RecoveredPeerId[]) recovered_peer_ids; } function getStorage() diff --git a/blockchain/contracts/contracts/lit-node/PKPNFT/PKPNFTFacet.sol b/blockchain/contracts/contracts/lit-node/PKPNFT/PKPNFTFacet.sol index eb9d402b..600825f4 100644 --- a/blockchain/contracts/contracts/lit-node/PKPNFT/PKPNFTFacet.sol +++ b/blockchain/contracts/contracts/lit-node/PKPNFT/PKPNFTFacet.sol @@ -16,6 +16,7 @@ import { LibPKPNFTStorage } from "./LibPKPNFTStorage.sol"; import { IPubkeyRouter } from "../PubkeyRouter/LibPubkeyRouterStorage.sol"; import { LibPubkeyRouterStorage } from "../PubkeyRouter/LibPubkeyRouterStorage.sol"; import { PubkeyRouterFacet } from "../PubkeyRouter/PubkeyRouterFacet.sol"; +import { PubkeyRouterViewsFacet } from "../PubkeyRouter/PubkeyRouterViewsFacet.sol"; import { PKPNFTMetadata } from "../PKPNFTMetadata.sol"; import { ContractResolver } from "../../lit-core/ContractResolver.sol"; import { PKPPermissionsFacet } from "../PKPPermissions/PKPPermissionsFacet.sol"; @@ -79,7 +80,6 @@ contract PKPNFTFacet is s().env ); } - function getPkpNftMetadataAddress() public view returns (address) { return s().contractResolver.getContract( @@ -110,27 +110,35 @@ contract PKPNFTFacet is /// get the eth address for the keypair function getEthAddress(uint256 tokenId) public view returns (address) { - PubkeyRouterFacet router = PubkeyRouterFacet(getRouterAddress()); + PubkeyRouterViewsFacet router = PubkeyRouterViewsFacet( + getRouterAddress() + ); return router.getEthAddress(tokenId); } /// includes the 0x04 prefix so you can pass this directly to ethers.utils.computeAddress function getPubkey(uint256 tokenId) public view returns (bytes memory) { - PubkeyRouterFacet router = PubkeyRouterFacet(getRouterAddress()); + PubkeyRouterViewsFacet router = PubkeyRouterViewsFacet( + getRouterAddress() + ); return router.getPubkey(tokenId); } function getPkpInfoFromTokenIds( uint256[] memory tokenIds ) public view returns (LibPubkeyRouterStorage.PkpInfo[] memory) { - PubkeyRouterFacet router = PubkeyRouterFacet(getRouterAddress()); + PubkeyRouterViewsFacet router = PubkeyRouterViewsFacet( + getRouterAddress() + ); return router.getPkpInfoFromTokenIds(tokenIds); } function getPkpInfoFromEthAddresses( address[] memory ethAddresses ) public view returns (LibPubkeyRouterStorage.PkpInfo[] memory) { - PubkeyRouterFacet router = PubkeyRouterFacet(getRouterAddress()); + PubkeyRouterViewsFacet router = PubkeyRouterViewsFacet( + getRouterAddress() + ); return router.getPkpInfoFromEthAddresses(ethAddresses); } @@ -206,7 +214,9 @@ contract PKPNFTFacet is function tokenURI( uint256 tokenId ) public view override returns (string memory) { - PubkeyRouterFacet router = PubkeyRouterFacet(getRouterAddress()); + PubkeyRouterViewsFacet router = PubkeyRouterViewsFacet( + getRouterAddress() + ); bytes memory pubKey = router.getPubkey(tokenId); address ethAddress = router.getEthAddress(tokenId); @@ -245,7 +255,9 @@ contract PKPNFTFacet is string memory keySetId ) public payable returns (uint256) { require(msg.value == s().mintCost, "You must pay exactly mint cost"); - PubkeyRouterFacet router = PubkeyRouterFacet(getRouterAddress()); + PubkeyRouterViewsFacet router = PubkeyRouterViewsFacet( + getRouterAddress() + ); bytes32 derivedKeyId = getNextDerivedKeyId(); bytes memory pubkey = router.getDerivedPubkey( getStakingAddress(), @@ -253,7 +265,7 @@ contract PKPNFTFacet is derivedKeyId ); uint256 tokenId = uint256(keccak256(pubkey)); - routeDerivedKey(keyType, derivedKeyId, pubkey, tokenId); + routeDerivedKey(keyType, derivedKeyId, pubkey, tokenId, keySetId); _mintWithoutValueCheck(tokenId, LibERC2771._msgSender()); return tokenId; } @@ -267,7 +279,9 @@ contract PKPNFTFacet is address stakingContractAddress ) public payable returns (uint256) { require(msg.value == s().mintCost, "You must pay exactly mint cost"); - PubkeyRouterFacet router = PubkeyRouterFacet(getRouterAddress()); + PubkeyRouterViewsFacet router = PubkeyRouterViewsFacet( + getRouterAddress() + ); router.checkNodeSignatures( realmId, signatures, @@ -280,7 +294,7 @@ contract PKPNFTFacet is ); uint256 tokenId = uint256(keccak256(pubkey)); - routeDerivedKey(keyType, derivedKeyId, pubkey, tokenId); + routeDerivedKey(keyType, derivedKeyId, pubkey, tokenId, keySetId); _mintWithoutValueCheck(tokenId, LibERC2771._msgSender()); return tokenId; @@ -292,7 +306,9 @@ contract PKPNFTFacet is bytes memory ipfsCID ) public payable returns (uint256) { require(msg.value == s().mintCost, "You must pay exactly mint cost"); - PubkeyRouterFacet router = PubkeyRouterFacet(getRouterAddress()); + PubkeyRouterViewsFacet router = PubkeyRouterViewsFacet( + getRouterAddress() + ); bytes32 derivedKeyId = getNextDerivedKeyId(); bytes memory pubkey = router.getDerivedPubkey( getStakingAddress(), @@ -300,7 +316,7 @@ contract PKPNFTFacet is derivedKeyId ); uint256 tokenId = uint256(keccak256(pubkey)); - routeDerivedKey(keyType, derivedKeyId, pubkey, tokenId); + routeDerivedKey(keyType, derivedKeyId, pubkey, tokenId, keySetId); _mintWithoutValueCheck(tokenId, address(this)); uint256[] memory scopes = new uint256[](1); scopes[0] = 1; @@ -317,19 +333,23 @@ contract PKPNFTFacet is uint256 keyType, bytes32 derivedKeyId, bytes memory pubkey, - uint256 tokenId + uint256 tokenId, + string memory keySetIdentifier ) internal { PubkeyRouterFacet(getRouterAddress()).setRoutingData( tokenId, pubkey, - address(getStakingAddress()), + getStakingAddress(), keyType, - derivedKeyId + derivedKeyId, + keySetIdentifier ); } function _mintWithoutValueCheck(uint256 tokenId, address to) internal { - PubkeyRouterFacet router = PubkeyRouterFacet(getRouterAddress()); + PubkeyRouterViewsFacet router = PubkeyRouterViewsFacet( + getRouterAddress() + ); require(router.isRouted(tokenId), "This PKP has not been routed yet"); if (to == address(this)) { diff --git a/blockchain/contracts/contracts/lit-node/PKPPermissions/PKPPermissionsFacet.sol b/blockchain/contracts/contracts/lit-node/PKPPermissions/PKPPermissionsFacet.sol index 7a735140..48f9bf2c 100644 --- a/blockchain/contracts/contracts/lit-node/PKPPermissions/PKPPermissionsFacet.sol +++ b/blockchain/contracts/contracts/lit-node/PKPPermissions/PKPPermissionsFacet.sol @@ -8,7 +8,7 @@ import "solidity-bytes-utils/contracts/BytesLib.sol"; import { LibDiamond } from "../../libraries/LibDiamond.sol"; import { ContractResolver } from "../../lit-core/ContractResolver.sol"; -import { PubkeyRouterFacet } from "../PubkeyRouter/PubkeyRouterFacet.sol"; +import { PubkeyRouterViewsFacet } from "../PubkeyRouter/PubkeyRouterViewsFacet.sol"; import { PKPNFTFacet } from "../PKPNFT/PKPNFTFacet.sol"; import { LibPKPPermissionsStorage } from "./LibPKPPermissionsStorage.sol"; @@ -78,20 +78,24 @@ contract PKPPermissionsFacet is ERC2771 { function getRouterAddress() public view returns (address) { return s().contractResolver.getContract( - s().contractResolver.PUB_KEY_ROUTER_CONTRACT(), + s().contractResolver.PUB_KEY_ROUTER_VIEWS_CONTRACT(), s().env ); } /// get the eth address for the keypair, as long as it's an ecdsa keypair function getEthAddress(uint256 tokenId) public view returns (address) { - PubkeyRouterFacet router = PubkeyRouterFacet(getRouterAddress()); + PubkeyRouterViewsFacet router = PubkeyRouterViewsFacet( + getRouterAddress() + ); return router.getEthAddress(tokenId); } /// includes the 0x04 prefix so you can pass this directly to ethers.utils.computeAddress function getPubkey(uint256 tokenId) public view returns (bytes memory) { - PubkeyRouterFacet router = PubkeyRouterFacet(getRouterAddress()); + PubkeyRouterViewsFacet router = PubkeyRouterViewsFacet( + getRouterAddress() + ); return router.getPubkey(tokenId); } diff --git a/blockchain/contracts/contracts/lit-node/PriceFeed.sol b/blockchain/contracts/contracts/lit-node/PriceFeed.sol index df9618c2..ed527e6f 100644 --- a/blockchain/contracts/contracts/lit-node/PriceFeed.sol +++ b/blockchain/contracts/contracts/lit-node/PriceFeed.sol @@ -48,7 +48,7 @@ contract PriceFeed { s.baseNetworkPrices[i] = baseAmount; s.maxNetworkPrices[i] = baseAmount * 100; } - s.nodeCapacityConfig = LibPriceFeedStorage.NodeCapacityConfig({ + s.nodeCapacityConfigs[0] = LibPriceFeedStorage.NodeCapacityConfig({ pkpSignMaxConcurrency: 75, encSignMaxConcurrency: 300, litActionMaxConcurrency: 50, diff --git a/blockchain/contracts/contracts/lit-node/PriceFeed/LibPriceFeedStorage.sol b/blockchain/contracts/contracts/lit-node/PriceFeed/LibPriceFeedStorage.sol index 195a7303..bd442a6d 100644 --- a/blockchain/contracts/contracts/lit-node/PriceFeed/LibPriceFeedStorage.sol +++ b/blockchain/contracts/contracts/lit-node/PriceFeed/LibPriceFeedStorage.sol @@ -71,7 +71,8 @@ library LibPriceFeedStorage { mapping(uint256 => uint256) baseNetworkPrices; mapping(uint256 => uint256) maxNetworkPrices; mapping(LitActionPriceComponent => LitActionPriceConfig) litActionPriceConfigs; - NodeCapacityConfig nodeCapacityConfig; + // Use nodeCapacityConfigs[0] for now. + mapping(uint256 => NodeCapacityConfig) nodeCapacityConfigs; } // Return ERC721 storage struct for reading and writing diff --git a/blockchain/contracts/contracts/lit-node/PriceFeed/PriceFeedFacet.sol b/blockchain/contracts/contracts/lit-node/PriceFeed/PriceFeedFacet.sol index 270a29b5..bc57dda3 100644 --- a/blockchain/contracts/contracts/lit-node/PriceFeed/PriceFeedFacet.sol +++ b/blockchain/contracts/contracts/lit-node/PriceFeed/PriceFeedFacet.sol @@ -145,7 +145,7 @@ contract PriceFeedFacet is ERC2771 { view returns (LibPriceFeedStorage.NodeCapacityConfig memory) { - return s().nodeCapacityConfig; + return s().nodeCapacityConfigs[0]; } // get all the nodes and data needed to make a request. @@ -240,7 +240,7 @@ contract PriceFeedFacet is ERC2771 { function setNodeCapacityConfig( LibPriceFeedStorage.NodeCapacityConfig memory config ) external onlyOwner { - s().nodeCapacityConfig = config; + s().nodeCapacityConfigs[0] = config; } function getLitActionPriceConfigs() diff --git a/blockchain/contracts/contracts/lit-node/PubkeyRouter/LibPubkeyRouterStorage.sol b/blockchain/contracts/contracts/lit-node/PubkeyRouter/LibPubkeyRouterStorage.sol index 794c188c..bfb51f0f 100644 --- a/blockchain/contracts/contracts/lit-node/PubkeyRouter/LibPubkeyRouterStorage.sol +++ b/blockchain/contracts/contracts/lit-node/PubkeyRouter/LibPubkeyRouterStorage.sol @@ -32,6 +32,7 @@ library LibPubkeyRouterStorage { bytes pubkey; uint256 keyType; // 1 = BLS, 2 = ECDSA. Not doing this in an enum so we can add more keytypes in the future without redeploying. bytes32 derivedKeyId; + string keySetIdentifier; } struct VoteToRegisterRootKey { diff --git a/blockchain/contracts/contracts/lit-node/PubkeyRouter/PubkeyRouterFacet.sol b/blockchain/contracts/contracts/lit-node/PubkeyRouter/PubkeyRouterFacet.sol index 4579a6b4..0e7df79e 100644 --- a/blockchain/contracts/contracts/lit-node/PubkeyRouter/PubkeyRouterFacet.sol +++ b/blockchain/contracts/contracts/lit-node/PubkeyRouter/PubkeyRouterFacet.sol @@ -7,11 +7,10 @@ import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import { LibDiamond } from "../../libraries/LibDiamond.sol"; import { PKPNFT } from "../PKPNFT.sol"; -import { Staking } from "../Staking.sol"; import { ContractResolver } from "../../lit-core/ContractResolver.sol"; import { IKeyDeriver } from "../HDKeyDeriver.sol"; -import { StakingAcrossRealmsFacet } from "../Staking/StakingAcrossRealmsFacet.sol"; import { StakingViewsFacet } from "../Staking/StakingViewsFacet.sol"; +import { StakingAcrossRealmsFacet } from "../Staking/StakingAcrossRealmsFacet.sol"; import { PKPNFTFacet } from "../PKPNFT/PKPNFTFacet.sol"; import { LibPubkeyRouterStorage, IPubkeyRouter } from "./LibPubkeyRouterStorage.sol"; import { LibStakingStorage } from "../Staking/LibStakingStorage.sol"; @@ -19,6 +18,7 @@ import { ERC2771 } from "../../common/ERC2771.sol"; import { LibERC2771 } from "../../libraries/LibERC2771.sol"; import { StakingUtilsLib } from "../Staking/StakingUtilsLib.sol"; import { StakingKeySetsFacet } from "../Staking/StakingKeySetsFacet.sol"; +import { PubkeyRouterViewsFacet } from "./PubkeyRouterViewsFacet.sol"; import "hardhat/console.sol"; // TODO: make the tests send PKPNFT into the constructor @@ -61,8 +61,14 @@ contract PubkeyRouterFacet is ERC2771 { ); } - function realms() internal view returns (StakingAcrossRealmsFacet) { - return StakingAcrossRealmsFacet(getStakingAddress()); + function pubkeyRouterView() internal view returns (PubkeyRouterViewsFacet) { + return + PubkeyRouterViewsFacet( + s().contractResolver.getContract( + s().contractResolver.PUB_KEY_ROUTER_CONTRACT(), + s().env + ) + ); } function stakingViews() internal view returns (StakingViewsFacet) { @@ -73,159 +79,8 @@ contract PubkeyRouterFacet is ERC2771 { return StakingKeySetsFacet(getStakingAddress()); } - function ethAddressToPkpId( - address ethAddress - ) public view returns (uint256) { - return s().ethAddressToPkpId[ethAddress]; - } - - function pubkeys( - uint256 tokenId - ) public view returns (LibPubkeyRouterStorage.PubkeyRoutingData memory) { - return s().pubkeys[tokenId]; - } - - function getPkpNftAddress() public view returns (address) { - return - s().contractResolver.getContract( - s().contractResolver.PKP_NFT_CONTRACT(), - s().env - ); - } - - /// get root keys for a given staking contract - function getRootKeys( - address stakingContract, - string memory keySetId - ) public view returns (IPubkeyRouter.RootKey[] memory) { - return - s().rootKeys[stakingContract][ - keccak256(abi.encodePacked(keySetId)) - ]; - } - - /// get the routing data for a given key hash - function getRoutingData( - uint256 tokenId - ) external view returns (LibPubkeyRouterStorage.PubkeyRoutingData memory) { - return s().pubkeys[tokenId]; - } - - /// get if a given pubkey has routing data associated with it or not - function isRouted(uint256 tokenId) public view returns (bool) { - LibPubkeyRouterStorage.PubkeyRoutingData memory prd = s().pubkeys[ - tokenId - ]; - return - prd.pubkey.length != 0 && - prd.keyType != 0 && - prd.derivedKeyId != bytes32(0); - } - - /// get the eth address for the keypair, as long as it's an ecdsa keypair - function getEthAddress(uint256 tokenId) public view returns (address) { - return deriveEthAddressFromPubkey(s().pubkeys[tokenId].pubkey); - } - - function getPkpInfoFromTokenIds( - uint256[] memory tokenIds - ) public view returns (LibPubkeyRouterStorage.PkpInfo[] memory) { - if (tokenIds.length == 0) { - return new LibPubkeyRouterStorage.PkpInfo[](0); - } - - uint256 count = 0; - for (uint256 i = 0; i < tokenIds.length; i++) { - if (s().pubkeys[tokenIds[i]].pubkey.length > 0) { - count++; - } - } - - LibPubkeyRouterStorage.PkpInfo[] - memory pkpInfos = new LibPubkeyRouterStorage.PkpInfo[](count); - uint256 pkpIndex = 0; - for (uint256 i = 0; i < tokenIds.length; i++) { - if (s().pubkeys[tokenIds[i]].pubkey.length > 0) { - pkpInfos[pkpIndex].tokenId = tokenIds[i]; - pkpInfos[pkpIndex].pubkey = s().pubkeys[tokenIds[i]].pubkey; - pkpInfos[pkpIndex].ethAddress = deriveEthAddressFromPubkey( - s().pubkeys[tokenIds[i]].pubkey - ); - pkpIndex++; - } - } - return pkpInfos; - } - - function getPkpInfoFromEthAddresses( - address[] memory ethAddresses - ) public view returns (LibPubkeyRouterStorage.PkpInfo[] memory) { - if (ethAddresses.length == 0) { - return new LibPubkeyRouterStorage.PkpInfo[](0); - } - - uint256 count = 0; - for (uint256 i = 0; i < ethAddresses.length; i++) { - if (s().ethAddressToPkpId[ethAddresses[i]] != 0) { - count++; - } - } - - LibPubkeyRouterStorage.PkpInfo[] - memory pkpInfos = new LibPubkeyRouterStorage.PkpInfo[](count); - uint256 pkpIndex = 0; - for (uint256 i = 0; i < ethAddresses.length; i++) { - if (s().ethAddressToPkpId[ethAddresses[i]] != 0) { - pkpInfos[pkpIndex].tokenId = s().ethAddressToPkpId[ - ethAddresses[i] - ]; - pkpInfos[pkpIndex].pubkey = s() - .pubkeys[pkpInfos[pkpIndex].tokenId] - .pubkey; - pkpInfos[pkpIndex].ethAddress = ethAddresses[i]; - pkpIndex++; - } - } - return pkpInfos; - } - - /// includes the 0x04 prefix so you can pass this directly to ethers.utils.computeAddress - function getPubkey(uint256 tokenId) public view returns (bytes memory) { - return s().pubkeys[tokenId].pubkey; - } - - function deriveEthAddressFromPubkey( - bytes memory pubkey - ) public pure returns (address) { - // remove 0x04 prefix - bytes32 hashed = keccak256(pubkey.slice(1, 64)); - return address(uint160(uint256(hashed))); - } - - function checkNodeSignatures( - uint256 realmId, - IPubkeyRouter.Signature[] memory signatures, - bytes memory signedMessage - ) public view returns (bool) { - require( - signatures.length >= - stakingViews().currentValidatorCountForConsensus(realmId), - "PubkeyRouter: incorrect number of signatures on a given root key" - ); - for (uint256 i = 0; i < signatures.length; i++) { - IPubkeyRouter.Signature memory sig = signatures[i]; - address signer = ECDSA.recover( - ECDSA.toEthSignedMessageHash(signedMessage), - sig.v, - sig.r, - sig.s - ); - require( - stakingViews().isActiveValidatorByNodeAddress(realmId, signer), - "PubkeyRouter: signer is not active validator" - ); - } - return true; + function realms() internal view returns (StakingAcrossRealmsFacet) { + return StakingAcrossRealmsFacet(getStakingAddress()); } /* ========== MUTATIVE FUNCTIONS ========== */ @@ -236,10 +91,12 @@ contract PubkeyRouterFacet is ERC2771 { bytes memory pubkey, address stakingContractAddress, uint256 keyType, - bytes32 derivedKeyId + bytes32 derivedKeyId, + string memory keySetIdentifier ) public { require( - LibERC2771._msgSender() == address(getPkpNftAddress()), + LibERC2771._msgSender() == + address(pubkeyRouterView().getPkpNftAddress()), "setRoutingData must be called by PKPNFT contract" ); @@ -248,15 +105,18 @@ contract PubkeyRouterFacet is ERC2771 { "tokenId does not match hashed pubkey" ); require( - !isRouted(tokenId), + !pubkeyRouterView().isRouted(tokenId), "PubkeyRouter: pubkey already has routing data" ); s().pubkeys[tokenId].pubkey = pubkey; s().pubkeys[tokenId].keyType = keyType; s().pubkeys[tokenId].derivedKeyId = derivedKeyId; + s().pubkeys[tokenId].keySetIdentifier = keySetIdentifier; - address pkpAddress = deriveEthAddressFromPubkey(pubkey); + address pkpAddress = pubkeyRouterView().deriveEthAddressFromPubkey( + pubkey + ); s().ethAddressToPkpId[pkpAddress] = tokenId; emit PubkeyRoutingDataSet( @@ -264,7 +124,8 @@ contract PubkeyRouterFacet is ERC2771 { pubkey, stakingContractAddress, keyType, - derivedKeyId + derivedKeyId, + keySetIdentifier ); } @@ -275,13 +136,17 @@ contract PubkeyRouterFacet is ERC2771 { bytes memory pubkey, address stakingContract, uint256 keyType, - bytes32 derivedKeyId + bytes32 derivedKeyId, + string memory keySetIdentifier ) public onlyOwner { s().pubkeys[tokenId].pubkey = pubkey; s().pubkeys[tokenId].keyType = keyType; s().pubkeys[tokenId].derivedKeyId = derivedKeyId; + s().pubkeys[tokenId].keySetIdentifier = keySetIdentifier; - address pkpAddress = deriveEthAddressFromPubkey(pubkey); + address pkpAddress = pubkeyRouterView().deriveEthAddressFromPubkey( + pubkey + ); s().ethAddressToPkpId[pkpAddress] = tokenId; emit PubkeyRoutingDataSet( @@ -289,7 +154,8 @@ contract PubkeyRouterFacet is ERC2771 { pubkey, stakingContract, keyType, - derivedKeyId + derivedKeyId, + keySetIdentifier ); } @@ -378,21 +244,6 @@ contract PubkeyRouterFacet is ERC2771 { } } - function getDerivedPubkey( - address stakingContract, - string memory keySetId, - bytes32 derivedKeyId - ) public view returns (bytes memory) { - IPubkeyRouter.RootKey[] memory rootPubkeys = getRootKeys( - stakingContract, - keySetId - ); - - bytes memory pubkey = _computeHDPubkey(derivedKeyId, rootPubkeys, 2); - - return pubkey; - } - function adminResetRootKeys( address stakingContract, string memory keySetId @@ -417,22 +268,6 @@ contract PubkeyRouterFacet is ERC2771 { } } - function _computeHDPubkey( - bytes32 derivedKeyId, - IPubkeyRouter.RootKey[] memory rootHDKeys, - uint256 keyType - ) internal view returns (bytes memory) { - address deriverAddr = s().contractResolver.getContract( - s().contractResolver.HD_KEY_DERIVER_CONTRACT(), - s().env - ); - (bool success, bytes memory pubkey) = IKeyDeriver(deriverAddr) - .computeHDPubKey(derivedKeyId, rootHDKeys, keyType); - - require(success, "PubkeyRouter: Failed public key calculation"); - return pubkey; - } - /* ========== EVENTS ========== */ event PubkeyRoutingDataSet( @@ -440,7 +275,8 @@ contract PubkeyRouterFacet is ERC2771 { bytes pubkey, address stakingContract, uint256 keyType, - bytes32 derivedKeyId + bytes32 derivedKeyId, + string keySetIdentifier ); event ContractResolverAddressSet(address newResolverAddress); event RootKeySet(address stakingContract, IPubkeyRouter.RootKey rootKey); diff --git a/blockchain/contracts/contracts/lit-node/PubkeyRouter/PubkeyRouterViewsFacet.sol b/blockchain/contracts/contracts/lit-node/PubkeyRouter/PubkeyRouterViewsFacet.sol new file mode 100644 index 00000000..12d8dc6f --- /dev/null +++ b/blockchain/contracts/contracts/lit-node/PubkeyRouter/PubkeyRouterViewsFacet.sol @@ -0,0 +1,229 @@ +//SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity ^0.8.17; + +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "solidity-bytes-utils/contracts/BytesLib.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import { LibPubkeyRouterStorage, IPubkeyRouter } from "./LibPubkeyRouterStorage.sol"; +import { IKeyDeriver } from "../HDKeyDeriver.sol"; +import { StakingAcrossRealmsFacet } from "../Staking/StakingAcrossRealmsFacet.sol"; +import { StakingViewsFacet } from "../Staking/StakingViewsFacet.sol"; +import { ERC2771 } from "../../common/ERC2771.sol"; + +import "hardhat/console.sol"; + +contract PubkeyRouterViewsFacet { + using BytesLib for bytes; + + function s() + internal + pure + returns (LibPubkeyRouterStorage.PubkeyRouterStorage storage) + { + return LibPubkeyRouterStorage.getStorage(); + } + + /// get the staking address from the resolver + function getStakingAddress() internal view returns (address) { + return + s().contractResolver.getContract( + s().contractResolver.STAKING_CONTRACT(), + s().env + ); + } + + function ethAddressToPkpId( + address ethAddress + ) public view returns (uint256) { + return s().ethAddressToPkpId[ethAddress]; + } + + function realms() internal view returns (StakingAcrossRealmsFacet) { + return StakingAcrossRealmsFacet(getStakingAddress()); + } + + function stakingViews() internal view returns (StakingViewsFacet) { + return StakingViewsFacet(getStakingAddress()); + } + + function pubkeys( + uint256 tokenId + ) public view returns (LibPubkeyRouterStorage.PubkeyRoutingData memory) { + return s().pubkeys[tokenId]; + } + + function getPkpNftAddress() public view returns (address) { + return + s().contractResolver.getContract( + s().contractResolver.PKP_NFT_CONTRACT(), + s().env + ); + } + + /// get root keys for a given staking contract + function getRootKeys( + address stakingContract, + string memory keySetId + ) public view returns (IPubkeyRouter.RootKey[] memory) { + return + s().rootKeys[stakingContract][ + keccak256(abi.encodePacked(keySetId)) + ]; + } + + /// get the routing data for a given key hash + function getRoutingData( + uint256 tokenId + ) external view returns (LibPubkeyRouterStorage.PubkeyRoutingData memory) { + return s().pubkeys[tokenId]; + } + + /// get if a given pubkey has routing data associated with it or not + function isRouted(uint256 tokenId) public view returns (bool) { + LibPubkeyRouterStorage.PubkeyRoutingData memory prd = s().pubkeys[ + tokenId + ]; + return + prd.pubkey.length != 0 && + prd.keyType != 0 && + bytes(prd.keySetIdentifier).length != 0 && + prd.derivedKeyId != bytes32(0); + } + + /// get the eth address for the keypair, as long as it's an ecdsa keypair + function getEthAddress(uint256 tokenId) public view returns (address) { + return deriveEthAddressFromPubkey(s().pubkeys[tokenId].pubkey); + } + + function getPkpInfoFromTokenIds( + uint256[] memory tokenIds + ) public view returns (LibPubkeyRouterStorage.PkpInfo[] memory) { + if (tokenIds.length == 0) { + return new LibPubkeyRouterStorage.PkpInfo[](0); + } + + uint256 count = 0; + for (uint256 i = 0; i < tokenIds.length; i++) { + if (s().pubkeys[tokenIds[i]].pubkey.length > 0) { + count++; + } + } + + LibPubkeyRouterStorage.PkpInfo[] + memory pkpInfos = new LibPubkeyRouterStorage.PkpInfo[](count); + uint256 pkpIndex = 0; + for (uint256 i = 0; i < tokenIds.length; i++) { + if (s().pubkeys[tokenIds[i]].pubkey.length > 0) { + pkpInfos[pkpIndex].tokenId = tokenIds[i]; + pkpInfos[pkpIndex].pubkey = s().pubkeys[tokenIds[i]].pubkey; + pkpInfos[pkpIndex].ethAddress = deriveEthAddressFromPubkey( + s().pubkeys[tokenIds[i]].pubkey + ); + pkpIndex++; + } + } + return pkpInfos; + } + + function getPkpInfoFromEthAddresses( + address[] memory ethAddresses + ) public view returns (LibPubkeyRouterStorage.PkpInfo[] memory) { + if (ethAddresses.length == 0) { + return new LibPubkeyRouterStorage.PkpInfo[](0); + } + + uint256 count = 0; + for (uint256 i = 0; i < ethAddresses.length; i++) { + if (s().ethAddressToPkpId[ethAddresses[i]] != 0) { + count++; + } + } + + LibPubkeyRouterStorage.PkpInfo[] + memory pkpInfos = new LibPubkeyRouterStorage.PkpInfo[](count); + uint256 pkpIndex = 0; + for (uint256 i = 0; i < ethAddresses.length; i++) { + if (s().ethAddressToPkpId[ethAddresses[i]] != 0) { + pkpInfos[pkpIndex].tokenId = s().ethAddressToPkpId[ + ethAddresses[i] + ]; + pkpInfos[pkpIndex].pubkey = s() + .pubkeys[pkpInfos[pkpIndex].tokenId] + .pubkey; + pkpInfos[pkpIndex].ethAddress = ethAddresses[i]; + pkpIndex++; + } + } + return pkpInfos; + } + + /// includes the 0x04 prefix so you can pass this directly to ethers.utils.computeAddress + function getPubkey(uint256 tokenId) public view returns (bytes memory) { + return s().pubkeys[tokenId].pubkey; + } + + function deriveEthAddressFromPubkey( + bytes memory pubkey + ) public pure returns (address) { + // remove 0x04 prefix + bytes32 hashed = keccak256(pubkey.slice(1, 64)); + return address(uint160(uint256(hashed))); + } + + function checkNodeSignatures( + uint256 realmId, + IPubkeyRouter.Signature[] memory signatures, + bytes memory signedMessage + ) public view returns (bool) { + require( + signatures.length >= + stakingViews().currentValidatorCountForConsensus(realmId), + "PubkeyRouter: incorrect number of signatures on a given root key" + ); + for (uint256 i = 0; i < signatures.length; i++) { + IPubkeyRouter.Signature memory sig = signatures[i]; + address signer = ECDSA.recover( + ECDSA.toEthSignedMessageHash(signedMessage), + sig.v, + sig.r, + sig.s + ); + require( + stakingViews().isActiveValidatorByNodeAddress(realmId, signer), + "PubkeyRouter: signer is not active validator" + ); + } + return true; + } + + function getDerivedPubkey( + address stakingContract, + string memory keySetId, + bytes32 derivedKeyId + ) public view returns (bytes memory) { + IPubkeyRouter.RootKey[] memory rootPubkeys = getRootKeys( + stakingContract, + keySetId + ); + + bytes memory pubkey = _computeHDPubkey(derivedKeyId, rootPubkeys, 2); + + return pubkey; + } + + function _computeHDPubkey( + bytes32 derivedKeyId, + IPubkeyRouter.RootKey[] memory rootHDKeys, + uint256 keyType + ) internal view returns (bytes memory) { + address deriverAddr = s().contractResolver.getContract( + s().contractResolver.HD_KEY_DERIVER_CONTRACT(), + s().env + ); + (bool success, bytes memory pubkey) = IKeyDeriver(deriverAddr) + .computeHDPubKey(derivedKeyId, rootHDKeys, keyType); + + require(success, "PubkeyRouter: Failed public key calculation"); + return pubkey; + } +} diff --git a/blockchain/contracts/contracts/lit-node/Staking.sol b/blockchain/contracts/contracts/lit-node/Staking.sol index 94e9d9e2..712455eb 100644 --- a/blockchain/contracts/contracts/lit-node/Staking.sol +++ b/blockchain/contracts/contracts/lit-node/Staking.sol @@ -46,10 +46,6 @@ contract Staking { // this is a monotonic counter that is incremented every time a new reward epoch is created s.nextAvailableRewardEpochNumber = 0; - uint256[] memory keyTypesTemp = new uint256[](2); - keyTypesTemp[0] = 1; - keyTypesTemp[1] = 2; - // Hardcode the total supply of the token to 1 billion. s.tokenTotalSupplyStandIn = 1_000_000_000 ether; @@ -57,7 +53,6 @@ contract Staking { // Most of this is related to staking / delegation s.globalConfig[0] = LibStakingStorage.GlobalConfig({ tokenRewardPerTokenPerEpoch: (10 ** 18) / 20, // 18 decimal places in token - keyTypes: keyTypesTemp, rewardEpochDuration: 1 hours, maxTimeLock: 4 * 365 days, minTimeLock: 90 days, diff --git a/blockchain/contracts/contracts/lit-node/Staking/FunctionSelectorHelper.t.sol b/blockchain/contracts/contracts/lit-node/Staking/FunctionSelectorHelper.t.sol index cc4ecfa0..8a728637 100644 --- a/blockchain/contracts/contracts/lit-node/Staking/FunctionSelectorHelper.t.sol +++ b/blockchain/contracts/contracts/lit-node/Staking/FunctionSelectorHelper.t.sol @@ -63,104 +63,103 @@ contract FunctionSelectorHelper { functionSignatures[1] = "realmConfig(uint256)"; functionSignatures[2] = "globalConfig()"; functionSignatures[3] = "complaintConfig(uint256)"; - functionSignatures[4] = "getKeyTypes()"; - functionSignatures[5] = "contractResolver()"; - functionSignatures[6] = "kickPenaltyPercentByReason(uint256)"; - functionSignatures[7] = "getNodeDemerits(address)"; - functionSignatures[8] = "nodeAddressToStakerAddress(address)"; - functionSignatures[9] = "readyForNextEpoch(uint256,address)"; - functionSignatures[10] = "state(uint256)"; - functionSignatures[11] = "getTokenContractAddress()"; - functionSignatures[12] = "validators(address)"; - functionSignatures[13] = "isActiveValidator(uint256,address)"; + functionSignatures[4] = "contractResolver()"; + functionSignatures[5] = "kickPenaltyPercentByReason(uint256)"; + functionSignatures[6] = "getNodeDemerits(address)"; + functionSignatures[7] = "nodeAddressToStakerAddress(address)"; + functionSignatures[8] = "readyForNextEpoch(uint256,address)"; + functionSignatures[9] = "state(uint256)"; + functionSignatures[10] = "getTokenContractAddress()"; + functionSignatures[11] = "validators(address)"; + functionSignatures[12] = "isActiveValidator(uint256,address)"; functionSignatures[ - 14 + 13 ] = "isActiveValidatorForNextEpoch(uint256,address)"; functionSignatures[ - 15 + 14 ] = "isActiveValidatorByNodeAddress(uint256,address)"; functionSignatures[ - 16 + 15 ] = "isActiveValidatorByNodeAddressForNextEpoch(uint256,address)"; functionSignatures[ - 17 + 16 ] = "getVotingStatusToKickValidator(uint256,uint256,address,address)"; - functionSignatures[18] = "getValidatorsInCurrentEpoch(uint256)"; + functionSignatures[17] = "getValidatorsInCurrentEpoch(uint256)"; functionSignatures[ - 19 + 18 ] = "getNonShadowValidatorsInCurrentEpochLength(uint256)"; - functionSignatures[20] = "getValidatorsInNextEpoch(uint256)"; - functionSignatures[21] = "getValidatorsStructs(address[])"; - functionSignatures[22] = "getValidatorsStructsInCurrentEpoch(uint256)"; - functionSignatures[23] = "getValidatorsStructsInNextEpoch(uint256)"; - functionSignatures[24] = "getTotalStake(address)"; - functionSignatures[25] = "getTotalStakeByUser(address,address)"; - functionSignatures[26] = "getNodeStakerAddressMappings(address[])"; - functionSignatures[27] = "getNodeAttestedPubKeyMappings(address[])"; - functionSignatures[ - 28 + functionSignatures[19] = "getValidatorsInNextEpoch(uint256)"; + functionSignatures[20] = "getValidatorsStructs(address[])"; + functionSignatures[21] = "getValidatorsStructsInCurrentEpoch(uint256)"; + functionSignatures[22] = "getValidatorsStructsInNextEpoch(uint256)"; + functionSignatures[23] = "getTotalStake(address)"; + functionSignatures[24] = "getTotalStakeByUser(address,address)"; + functionSignatures[25] = "getNodeStakerAddressMappings(address[])"; + functionSignatures[26] = "getNodeAttestedPubKeyMappings(address[])"; + functionSignatures[ + 27 ] = "countOfCurrentValidatorsReadyForNextEpoch(uint256)"; functionSignatures[ - 29 + 28 ] = "countOfNextValidatorsReadyForNextEpoch(uint256)"; - functionSignatures[30] = "isReadyForNextEpoch(uint256)"; - functionSignatures[31] = "shouldKickValidator(uint256,address)"; - functionSignatures[32] = "currentValidatorCountForConsensus(uint256)"; - functionSignatures[33] = "isRecentValidator(uint256,address)"; - functionSignatures[34] = "nextValidatorCountForConsensus(uint256)"; - functionSignatures[35] = "getKickedValidators(uint256)"; - functionSignatures[36] = "getActiveUnkickedValidators(uint256)"; - functionSignatures[37] = "getStakeRecordCount(address,address)"; - functionSignatures[38] = "getValidatorsDelegated(address)"; - functionSignatures[39] = "getStakeRecordsForUser(address,address)"; - functionSignatures[40] = "getActiveUnkickedValidatorCount(uint256)"; - functionSignatures[41] = "getActiveUnkickedValidatorStructs(uint256)"; - functionSignatures[ - 42 + functionSignatures[29] = "isReadyForNextEpoch(uint256)"; + functionSignatures[30] = "shouldKickValidator(uint256,address)"; + functionSignatures[31] = "currentValidatorCountForConsensus(uint256)"; + functionSignatures[32] = "isRecentValidator(uint256,address)"; + functionSignatures[33] = "nextValidatorCountForConsensus(uint256)"; + functionSignatures[34] = "getKickedValidators(uint256)"; + functionSignatures[35] = "getActiveUnkickedValidators(uint256)"; + functionSignatures[36] = "getStakeRecordCount(address,address)"; + functionSignatures[37] = "getValidatorsDelegated(address)"; + functionSignatures[38] = "getStakeRecordsForUser(address,address)"; + functionSignatures[39] = "getActiveUnkickedValidatorCount(uint256)"; + functionSignatures[40] = "getActiveUnkickedValidatorStructs(uint256)"; + functionSignatures[ + 41 ] = "getActiveUnkickedValidatorStructsAndCounts(uint256)"; functionSignatures[ - 43 + 42 ] = "getTimelockInEpoch(address,(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,bool,address),uint256)"; functionSignatures[ - 44 + 43 ] = "getStakeWeightInEpoch(address,uint256,address,uint256)"; - functionSignatures[45] = "calculateStakeWeight(uint256,uint256)"; + functionSignatures[44] = "calculateStakeWeight(uint256,uint256)"; functionSignatures[ - 46 + 45 ] = "getTokensStaked(address,(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,bool,address),uint256)"; - functionSignatures[47] = "getRewardEpochNumber(uint256)"; - functionSignatures[48] = "pow(uint256,uint256)"; + functionSignatures[46] = "getRewardEpochNumber(uint256)"; + functionSignatures[47] = "pow(uint256,uint256)"; functionSignatures[ - 49 + 48 ] = "calculateRewardsPerDay((uint256,uint256,address[],uint256))"; - functionSignatures[50] = "getLitCirc()"; - functionSignatures[51] = "getStakeRecord(address,uint256,address)"; + functionSignatures[49] = "getLitCirc()"; + functionSignatures[50] = "getStakeRecord(address,uint256,address)"; functionSignatures[ - 52 + 51 ] = "validatorSelfStakeWillExpire(uint256,address,bool)"; - functionSignatures[53] = "getRewardEpochGlobalStats(uint256)"; - functionSignatures[54] = "getTokenPrice()"; - functionSignatures[55] = "minSelfStake()"; - functionSignatures[56] = "minStake()"; - functionSignatures[57] = "maxStake()"; - functionSignatures[58] = "minTimeLock()"; - functionSignatures[59] = "maxTimeLock()"; - functionSignatures[60] = "getLowestRewardEpochNumber()"; - functionSignatures[61] = "getAllReserveValidators()"; - functionSignatures[62] = "getAllValidators()"; - functionSignatures[63] = "getSelfStakeRecordCount(address)"; - functionSignatures[64] = "permittedValidators(uint256)"; - functionSignatures[65] = "permittedRealmsForValidator(address)"; - functionSignatures[66] = "stakerToValidatorsTheyStakedTo(address)"; - functionSignatures[67] = "operatorAddressToStakerAddress(address)"; - functionSignatures[ - 68 + functionSignatures[52] = "getRewardEpochGlobalStats(uint256)"; + functionSignatures[53] = "getTokenPrice()"; + functionSignatures[54] = "minSelfStake()"; + functionSignatures[55] = "minStake()"; + functionSignatures[56] = "maxStake()"; + functionSignatures[57] = "minTimeLock()"; + functionSignatures[58] = "maxTimeLock()"; + functionSignatures[59] = "getLowestRewardEpochNumber()"; + functionSignatures[60] = "getAllReserveValidators()"; + functionSignatures[61] = "getAllValidators()"; + functionSignatures[62] = "getSelfStakeRecordCount(address)"; + functionSignatures[63] = "permittedValidators(uint256)"; + functionSignatures[64] = "permittedRealmsForValidator(address)"; + functionSignatures[65] = "stakerToValidatorsTheyStakedTo(address)"; + functionSignatures[66] = "operatorAddressToStakerAddress(address)"; + functionSignatures[ + 67 ] = "getDelegatedStakersWithUnfreezingStakes(address,uint256,uint256)"; functionSignatures[ - 69 + 68 ] = "getDelegatedStakersWithUnfreezingStakesCount(address)"; functionSignatures[ - 70 + 69 ] = "getUnfrozenStakeCountForUser(address,address)"; return functionSignatures; } @@ -210,7 +209,7 @@ contract FunctionSelectorHelper { functionSignatures[15] = "decreaseRewardPool(uint256,uint256)"; functionSignatures[ 16 - ] = "setConfig((uint256,uint256[],uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))"; + ] = "setConfig((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))"; functionSignatures[ 17 ] = "setComplaintConfig(uint256,(uint256,uint256,uint256,uint256))"; diff --git a/blockchain/contracts/contracts/lit-node/Staking/LibStakingStorage.sol b/blockchain/contracts/contracts/lit-node/Staking/LibStakingStorage.sol index 3f9e931c..50bb1999 100644 --- a/blockchain/contracts/contracts/lit-node/Staking/LibStakingStorage.sol +++ b/blockchain/contracts/contracts/lit-node/Staking/LibStakingStorage.sol @@ -135,6 +135,8 @@ library LibStakingStorage { struct PendingRejoin { address addr; uint256 timestamp; + // NOTE: DO NOT ADD ANYTHING TO THIS STRUCT SINCE IT IS NOT CONTAINED IN A MAPPING IN THE ROOT LEVEL STORAGE STRUCT + // AND MAY RESULT IN STORAGE POINTERS SHIFTING. } struct Epoch { @@ -206,7 +208,7 @@ library LibStakingStorage { uint256[] curves; uint256[] counts; /// Set when the recovery DKG completes for the key set - address[] recoveryPartyMembers; + bytes recoverySessionId; } struct RealmConfig { @@ -222,14 +224,14 @@ library LibStakingStorage { uint256 minEpochForRewards; /// @notice Whether the validator set allows for an allowlist of operators to join the validator set. bool permittedValidatorsOn; + /// The default key set identifier to use if the realm has more than one + /// This allows the realm to operate without asking this value from clients + /// for some operations like session keys and sign as action + string defaultKeySet; } struct GlobalConfig { uint256 tokenRewardPerTokenPerEpoch; - // the key type of the node. // 1 = BLS, 2 = ECDSA. Not doing this in an enum so we can add more keytypes in the future without redeploying. - uint256[] keyTypes; - // don't start the DKG or let nodes leave the validator set - // if there are less than this many nodes uint256 minimumValidatorCount; /// @notice Keep this the same as the epoch length for now. uint256 rewardEpochDuration; @@ -297,8 +299,8 @@ library LibStakingStorage { mapping(address => address) nodeAddressToStakerAddress; mapping(address => address) stakerAddressToNodeAddress; mapping(address => address) operatorAddressToStakerAddress; - // this mapping lets you go from the userStakerAddress to the stakerAddress. - mapping(address => address) userStakerAddressToStakerAddress; + // NOTE: Deprecated field, do not use. Remove when deploying prod for the next network after Naga. + mapping(address => address) DEPRECATED_userStakerAddressToStakerAddress; // Mapping of the complaint reason code to the config for that reason mapping(uint256 => ComplaintConfig) complaintReasonToConfig; // Thunderhead - Staking Vaults & rewards diff --git a/blockchain/contracts/contracts/lit-node/Staking/Staking.t.sol b/blockchain/contracts/contracts/lit-node/Staking/Staking.t.sol index efaf8388..d8c3f5fa 100644 --- a/blockchain/contracts/contracts/lit-node/Staking/Staking.t.sol +++ b/blockchain/contracts/contracts/lit-node/Staking/Staking.t.sol @@ -762,6 +762,79 @@ contract StakingTest is Test, SetupAndUtils { } } + /// @notice This test is when a delegating staker stakes against multiple validators + /// and then claims reward for one of them, that the correct stake record is updated + /// and the other stake record is not affected. + function testFuzz_DelegatingStakerStakesAgainstMultipleValidators( + uint256 amount, + uint256 timeLock + ) public { + amount = bound(amount, 32 ether, 1_000_000 ether); + timeLock = bound(timeLock, 90 days, 365 * 2 days); + + // Setup validators + address[] memory operatorStakers = _generateAddresses(4); + _setupValidators( + 1, + operatorStakers, + amount * 10, + amount, + timeLock, + _generateUint256s(4) + ); + + // Setup delegating staker + address delegatingStaker = address(0x999); + _fundAddressWithTokensAndApprove(delegatingStaker, amount * 2); + + // Delegating staker stakes with the first validator + vm.prank(delegatingStaker); + stakingFacet.stake(amount, timeLock, operatorStakers[0]); + + // Delegating staker stakes with the second validator + vm.prank(delegatingStaker); + stakingFacet.stake(amount, timeLock, operatorStakers[1]); + + // Advance to epoch 6 to earn rewards + _advanceEpochs(1, 5, operatorStakers, 1); + + // Get a reference of the stake records + LibStakingStorage.StakeRecord memory stakeRecord1 = stakingViewsFacet + .getStakeRecord(operatorStakers[0], 1, delegatingStaker); + LibStakingStorage.StakeRecord memory stakeRecord2 = stakingViewsFacet + .getStakeRecord(operatorStakers[1], 1, delegatingStaker); + + // Claim rewards from the first validator + vm.prank(delegatingStaker); + stakingFacet.claimStakeRewards(1, operatorStakers[0], 1, 0); + + // Get a reference of the new stake records + LibStakingStorage.StakeRecord memory newStakeRecord1 = stakingViewsFacet + .getStakeRecord(operatorStakers[0], 1, delegatingStaker); + LibStakingStorage.StakeRecord memory newStakeRecord2 = stakingViewsFacet + .getStakeRecord(operatorStakers[1], 1, delegatingStaker); + + // Assert that the stake record for the first validator is updated correctly + assertGt( + newStakeRecord1.lastUpdateTimestamp, + stakeRecord1.lastUpdateTimestamp + ); + assertGt( + newStakeRecord1.lastRewardEpochClaimed, + stakeRecord1.lastRewardEpochClaimed + 1 + ); + + // Assert that the stake record for the second validator is not affected + assertEq( + newStakeRecord2.lastUpdateTimestamp, + stakeRecord2.lastUpdateTimestamp + ); + assertEq( + newStakeRecord2.lastRewardEpochClaimed, + stakeRecord2.lastRewardEpochClaimed + ); + } + /// @notice This test is when a node operator / validator calls stakeAndJoin /// that the reward epoch and global stats are updated correctly. function testFuzz_StakeAndJoin_ValidatorState( diff --git a/blockchain/contracts/contracts/lit-node/Staking/StakingAcrossRealmsFacet.sol b/blockchain/contracts/contracts/lit-node/Staking/StakingAcrossRealmsFacet.sol index 11207a7f..4731a733 100644 --- a/blockchain/contracts/contracts/lit-node/Staking/StakingAcrossRealmsFacet.sol +++ b/blockchain/contracts/contracts/lit-node/Staking/StakingAcrossRealmsFacet.sol @@ -6,6 +6,7 @@ import { ContractResolver } from "../../lit-core/ContractResolver.sol"; import { LibDiamond } from "../../libraries/LibDiamond.sol"; import { StakingViewsFacet } from "./StakingViewsFacet.sol"; import { LibStakingStorage } from "./LibStakingStorage.sol"; +import { StakingUtilsLib } from "./StakingUtilsLib.sol"; import "hardhat/console.sol"; contract StakingAcrossRealmsFacet { @@ -24,6 +25,18 @@ contract StakingAcrossRealmsFacet { return LibStakingStorage.getStakingStorage(); } + modifier onlyOwner() { + if (msg.sender != LibDiamond.contractOwner()) + revert StakingUtilsLib.CallerNotOwner(); + _; + } + + function realm( + uint256 realmId + ) internal view returns (LibStakingStorage.RealmStorage storage) { + return LibStakingStorage.getRealmStorage(realmId); + } + function numRealms() public view returns (uint256) { return s().realmIds.length(); } @@ -169,4 +182,21 @@ contract StakingAcrossRealmsFacet { ) public view returns (LibStakingStorage.Validator memory) { return s().validators[stakerAddress]; } + + function setRealmConfig( + uint256 realmId, + LibStakingStorage.RealmConfig memory newConfig + ) external onlyOwner { + LibStakingStorage.RealmConfig storage config = realm(realmId) + .realm_configs[0]; + config.maxConcurrentRequests = newConfig.maxConcurrentRequests; + config.maxPresignCount = newConfig.maxPresignCount; + config.minPresignCount = newConfig.minPresignCount; + config.peerCheckingIntervalSecs = newConfig.peerCheckingIntervalSecs; + config.maxPresignConcurrency = newConfig.maxPresignConcurrency; + config.rpcHealthcheckEnabled = newConfig.rpcHealthcheckEnabled; + config.minEpochForRewards = newConfig.minEpochForRewards; + config.permittedValidatorsOn = newConfig.permittedValidatorsOn; + config.defaultKeySet = newConfig.defaultKeySet; + } } diff --git a/blockchain/contracts/contracts/lit-node/Staking/StakingAdminFacet.sol b/blockchain/contracts/contracts/lit-node/Staking/StakingAdminFacet.sol index 759d14de..7ff9daaf 100644 --- a/blockchain/contracts/contracts/lit-node/Staking/StakingAdminFacet.sol +++ b/blockchain/contracts/contracts/lit-node/Staking/StakingAdminFacet.sol @@ -16,6 +16,7 @@ import "hardhat/console.sol"; contract StakingAdminFacet is StakingCommon { using EnumerableSet for EnumerableSet.AddressSet; + /* ========== Modifier Equivalents ========== */ /* ========== Modifier Equivalents ========== */ function onlyOwner() internal view { @@ -245,23 +246,6 @@ contract StakingAdminFacet is StakingCommon { } } - function setRealmConfig( - uint256 realmId, - LibStakingStorage.RealmConfig memory newConfig - ) external { - onlyOwner(); - LibStakingStorage.RealmConfig storage config = realm(realmId) - .realm_configs[0]; - config.maxConcurrentRequests = newConfig.maxConcurrentRequests; - config.maxPresignCount = newConfig.maxPresignCount; - config.minPresignCount = newConfig.minPresignCount; - config.peerCheckingIntervalSecs = newConfig.peerCheckingIntervalSecs; - config.maxPresignConcurrency = newConfig.maxPresignConcurrency; - config.rpcHealthcheckEnabled = newConfig.rpcHealthcheckEnabled; - config.minEpochForRewards = newConfig.minEpochForRewards; - config.permittedValidatorsOn = newConfig.permittedValidatorsOn; - } - function adminSlashValidator( uint256 percentage, address stakerAddress @@ -318,7 +302,6 @@ contract StakingAdminFacet is StakingCommon { .globalConfig[0]; config.tokenRewardPerTokenPerEpoch = newConfig .tokenRewardPerTokenPerEpoch; - config.keyTypes = newConfig.keyTypes; config.minimumValidatorCount = newConfig.minimumValidatorCount; // thunderhead @@ -374,7 +357,8 @@ contract StakingAdminFacet is StakingCommon { maxPresignConcurrency: 2, rpcHealthcheckEnabled: true, minEpochForRewards: 3, - permittedValidatorsOn: false + permittedValidatorsOn: false, + defaultKeySet: "" }); uint256 epochLengthSeconds = 1 seconds; diff --git a/blockchain/contracts/contracts/lit-node/Staking/StakingFacet.sol b/blockchain/contracts/contracts/lit-node/Staking/StakingFacet.sol index 57879a13..2702dede 100644 --- a/blockchain/contracts/contracts/lit-node/Staking/StakingFacet.sol +++ b/blockchain/contracts/contracts/lit-node/Staking/StakingFacet.sol @@ -770,8 +770,6 @@ contract StakingFacet is StakingCommon, ERC2771 { stakeRecord.lastUpdateTimestamp = block.timestamp; stakeRecord.lastRewardEpochClaimed = lastRewardEpochClaimed; - updateStakeRecord(LibERC2771._msgSender(), stakeRecord.id, stakeRecord); - SafeERC20.safeTransfer( IERC20(views().getTokenContractAddress()), LibERC2771._msgSender(), @@ -923,32 +921,6 @@ contract StakingFacet is StakingCommon, ERC2771 { ); } - /** - * @notice Updates the stake record in the staker's vault - * @param userAddress The address of the staker - * @param stakeId The ID of the stake record - * @param newState The new state of the stake record - */ - function updateStakeRecord( - address userAddress, - uint256 stakeId, - LibStakingStorage.StakeRecord memory newState - ) internal { - address stakerAddress = s().userStakerAddressToStakerAddress[ - userAddress - ]; - LibStakingStorage.StakeRecord[30] storage userStakes = s() - .vaults[stakerAddress][userAddress].stakes; - for (uint256 i = 0; i < userStakes.length; i++) { - if (userStakes[i].id == stakeId) { - userStakes[i] = newState; - break; - } - } - - emit StakeRecordUpdated(stakerAddress, stakeId); - } - /** * @notice Migrates a stake record to a new validator * @param operatorAddressToMigrateFrom The address of the operator staker to migrate from diff --git a/blockchain/contracts/contracts/lit-node/Staking/StakingKeySetsFacet.sol b/blockchain/contracts/contracts/lit-node/Staking/StakingKeySetsFacet.sol index 0512a5a7..e492761c 100644 --- a/blockchain/contracts/contracts/lit-node/Staking/StakingKeySetsFacet.sol +++ b/blockchain/contracts/contracts/lit-node/Staking/StakingKeySetsFacet.sol @@ -120,6 +120,7 @@ contract StakingKeySetsFacet { config.description = update.description; config.realms = update.realms; config.minimumThreshold = update.minimumThreshold; + config.recoverySessionId = update.recoverySessionId; emit KeySetConfigUpdated(update.identifier); } else { @@ -141,8 +142,8 @@ contract StakingKeySetsFacet { gs.keySetsConfigs[keySetId].realms = update.realms; gs.keySetsConfigs[keySetId].curves = update.curves; gs.keySetsConfigs[keySetId].counts = update.counts; - gs.keySetsConfigs[keySetId].recoveryPartyMembers = update - .recoveryPartyMembers; + gs.keySetsConfigs[keySetId].recoverySessionId = update + .recoverySessionId; for (uint i = 0; i < update.curves.length; i++) { require(update.counts[i] > 0, "key counts cannot be set to 0"); gs.keySetKeyCounts[keySetId][update.curves[i]] = update.counts[ @@ -188,7 +189,9 @@ contract StakingKeySetsFacet { for (uint i = 0; i < config.counts.length; i++) { delete gs.keySetKeyCounts[keySetId][config.curves[i]]; } - // TODO: delete the root keys from the pub key router + // Delete the root keys from the pub key router + LibPubkeyRouterStorage.PubkeyRouterStorage storage ps = pubkeyRouter(); + delete ps.rootKeys[address(this)][keySetId]; } event KeySetConfigSet(bool exists, string identifier, bytes32 hashed); diff --git a/blockchain/contracts/contracts/lit-node/Staking/StakingValidatorFacet.sol b/blockchain/contracts/contracts/lit-node/Staking/StakingValidatorFacet.sol index b2607a7b..e5e302a3 100644 --- a/blockchain/contracts/contracts/lit-node/Staking/StakingValidatorFacet.sol +++ b/blockchain/contracts/contracts/lit-node/Staking/StakingValidatorFacet.sol @@ -1086,17 +1086,6 @@ contract StakingValidatorFacet { event StakingTokenSet(address newStakingTokenAddress); event KickPenaltyPercentSet(uint256 reason, uint256 newKickPenaltyPercent); event ResolverContractAddressSet(address newResolverContractAddress); - event ConfigSet( - uint256 newTokenRewardPerTokenPerEpoch, - uint256[] newKeyTypes, - uint256 newMinimumValidatorCount, - uint256 newMaxConcurrentRequests, - uint256 newMaxPresignCount, - uint256 newMinPresignCount, - uint256 newPeerCheckingIntervalSecs, - uint256 newMaxPresignConcurrency, - bool newRpcHealthcheckEnabled - ); event ComplaintConfigSet( uint256 reason, LibStakingStorage.ComplaintConfig config diff --git a/blockchain/contracts/contracts/lit-node/Staking/StakingViewsFacet.sol b/blockchain/contracts/contracts/lit-node/Staking/StakingViewsFacet.sol index 5febf11f..7617cec9 100644 --- a/blockchain/contracts/contracts/lit-node/Staking/StakingViewsFacet.sol +++ b/blockchain/contracts/contracts/lit-node/Staking/StakingViewsFacet.sol @@ -76,10 +76,6 @@ contract StakingViewsFacet { return s().complaintReasonToConfig[reason]; } - function getKeyTypes() external view returns (uint256[] memory) { - return s().globalConfig[0].keyTypes; - } - function contractResolver() external view returns (address) { return address(s().contractResolver); } diff --git a/blockchain/contracts/hardhat.config.ts b/blockchain/contracts/hardhat.config.ts index 6df24400..8d9aff68 100644 --- a/blockchain/contracts/hardhat.config.ts +++ b/blockchain/contracts/hardhat.config.ts @@ -337,6 +337,7 @@ const config: HardhatUserConfig = { include: [ 'OwnershipFacet', 'PubkeyRouterFacet', + 'PubkeyRouterViewsFacet', 'DiamondCutFacet', 'DiamondLoupeFacet', ], diff --git a/blockchain/contracts/scripts/calculateUSDPricing.ts b/blockchain/contracts/scripts/calculateUSDPricing.ts new file mode 100644 index 00000000..8c2122f5 --- /dev/null +++ b/blockchain/contracts/scripts/calculateUSDPricing.ts @@ -0,0 +1,238 @@ +// Script to calculate fees in USD based on LITKEY token price +// Usage: HARDHAT_NETWORK=litMainnet npx ts-node --files scripts/calculateUSDPricing.ts + +import hre from 'hardhat'; + +const { ethers } = hre; + +// on Lit Chain Mainnet +const NAGA_PROD_PRICE_FEED_ADDRESS = + '0x88F5535Fa6dA5C225a3C06489fE4e3405b87608C'; + +// Product IDs from LibPriceFeedStorage.ProductId enum +enum ProductId { + PkpSign = 0, + EncSign = 1, + LitAction = 2, + SignSessionKey = 3, +} + +// LitActionPriceComponent enum values +enum LitActionPriceComponent { + baseAmount = 0, + runtimeLength = 1, + memoryUsage = 2, + codeLength = 3, + responseLength = 4, + signatures = 5, + broadcasts = 6, + contractCalls = 7, + callDepth = 8, + decrypts = 9, + fetches = 10, +} + +// NodePriceMeasurement enum values +enum NodePriceMeasurement { + perSecond = 0, + perMegabyte = 1, + perCount = 2, +} + +const PRODUCT_NAMES = { + [ProductId.PkpSign]: 'PKP Sign', + [ProductId.EncSign]: 'Encrypted Sign', + [ProductId.LitAction]: 'Lit Action', + [ProductId.SignSessionKey]: 'Sign Session Key', +}; + +const LIT_ACTION_COMPONENT_NAMES = { + [LitActionPriceComponent.baseAmount]: 'Base Amount', + [LitActionPriceComponent.runtimeLength]: 'Runtime Length', + [LitActionPriceComponent.memoryUsage]: 'Memory Usage', + [LitActionPriceComponent.codeLength]: 'Code Length', + [LitActionPriceComponent.responseLength]: 'Response Length', + [LitActionPriceComponent.signatures]: 'Signatures', + [LitActionPriceComponent.broadcasts]: 'Broadcasts', + [LitActionPriceComponent.contractCalls]: 'Contract Calls', + [LitActionPriceComponent.callDepth]: 'Call Depth', + [LitActionPriceComponent.decrypts]: 'Decrypts', + [LitActionPriceComponent.fetches]: 'Fetches', +}; + +const MEASUREMENT_NAMES = { + [NodePriceMeasurement.perSecond]: '/second', + [NodePriceMeasurement.perMegabyte]: '/MB', + [NodePriceMeasurement.perCount]: '/count', +}; + +interface LitActionPriceConfig { + priceComponent: bigint; + priceMeasurement: bigint; + price: bigint; +} + +/** + * Get LITKEY token price in USD from CoinGecko + */ +async function getLitKeyPrice(): Promise { + try { + // Try to get LIT token price from CoinGecko + // Note: You may need to adjust the token ID if LITKEY is listed differently + const response = await fetch( + 'https://api.coingecko.com/api/v3/simple/price?ids=lit-protocol&vs_currencies=usd' + ); + const data = await response.json(); + + if (data['lit-protocol'] && data['lit-protocol'].usd) { + return data['lit-protocol'].usd; + } + + throw new Error('LIT price not found in CoinGecko response'); + } catch (error) { + console.error('Error fetching LITKEY price from CoinGecko:', error); + console.log('Falling back to manual price input...'); + // You can set a default price here or throw + throw new Error( + 'Unable to fetch LITKEY price. Please check CoinGecko API or set manually.' + ); + } +} + +/** + * Get PriceFeed contract address from networkContext.json or use default + */ +function getPriceFeedAddress(): string { + // Naga prod address + return NAGA_PROD_PRICE_FEED_ADDRESS; +} + +/** + * Convert wei to LITKEY tokens (18 decimals) + */ +function weiToTokens(wei: bigint): number { + return parseFloat(ethers.formatUnits(wei, 18)); +} + +/** + * Format price for display + */ +function formatPrice(priceInTokens: number, priceInUSD: number): string { + return `${priceInTokens.toFixed(6)} LITKEY ($${priceInUSD.toFixed(6)})`; +} + +async function main() { + console.log('=== Calculating Fees in USD ===\n'); + + // Get network info + const network = await ethers.provider.getNetwork(); + console.log(`Network: ${network.name} (Chain ID: ${network.chainId})\n`); + + // Get LITKEY price in USD + console.log('Fetching LITKEY token price from CoinGecko...'); + const litKeyPriceUSD = await getLitKeyPrice(); + console.log(`LITKEY Price: $${litKeyPriceUSD.toFixed(4)} USD\n`); + + // Get PriceFeed contract + const priceFeedAddress = getPriceFeedAddress(); + console.log(`PriceFeed Contract Address: ${priceFeedAddress}\n`); + + // Use PriceFeedDiamond which includes all facets via hardhat-diamond-abi plugin + const priceFeed = await ethers.getContractAt( + 'PriceFeedDiamond', + priceFeedAddress + ); + + // Get all product IDs + const productIds = [ + ProductId.PkpSign, + ProductId.EncSign, + ProductId.LitAction, + ProductId.SignSessionKey, + ]; + + console.log('=== Network Base Prices ==='); + const baseNetworkPrices = await priceFeed.baseNetworkPrices(productIds); + for (let i = 0; i < productIds.length; i++) { + const productId = productIds[i]; + const priceInWei = baseNetworkPrices[i]; + const priceInTokens = weiToTokens(priceInWei); + const priceInUSD = priceInTokens * litKeyPriceUSD; + console.log( + `${PRODUCT_NAMES[productId]}: ${formatPrice(priceInTokens, priceInUSD)}` + ); + } + + console.log('\n=== Network Max Prices ==='); + const maxNetworkPrices = await priceFeed.maxNetworkPrices(productIds); + for (let i = 0; i < productIds.length; i++) { + const productId = productIds[i]; + const priceInWei = maxNetworkPrices[i]; + const priceInTokens = weiToTokens(priceInWei); + const priceInUSD = priceInTokens * litKeyPriceUSD; + console.log( + `${PRODUCT_NAMES[productId]}: ${formatPrice(priceInTokens, priceInUSD)}` + ); + } + + // Get prices at different usage percentages + console.log('\n=== Prices at Different Usage Percentages ==='); + const usagePercentages = [0, 25, 50, 75, 100]; + for (const usagePercent of usagePercentages) { + console.log(`\nUsage: ${usagePercent}%`); + const prices = await priceFeed.usagePercentToPrices( + usagePercent, + productIds + ); + for (let i = 0; i < productIds.length; i++) { + const productId = productIds[i]; + const priceInWei = prices[i]; + const priceInTokens = weiToTokens(priceInWei); + const priceInUSD = priceInTokens * litKeyPriceUSD; + console.log( + ` ${PRODUCT_NAMES[productId]}: ${formatPrice( + priceInTokens, + priceInUSD + )}` + ); + } + } + + // Get LitAction price configs + console.log('\n=== LitAction Price Components ==='); + const litActionPriceConfigs: LitActionPriceConfig[] = + await priceFeed.getLitActionPriceConfigs(); + + for (const config of litActionPriceConfigs) { + // Convert bigint to number for enum casting + const priceComponentNum = Number(config.priceComponent); + const priceMeasurementNum = Number(config.priceMeasurement); + + const componentName = + LIT_ACTION_COMPONENT_NAMES[ + priceComponentNum as LitActionPriceComponent + ] || `Component ${priceComponentNum}`; + const measurementName = + MEASUREMENT_NAMES[priceMeasurementNum as NodePriceMeasurement] || ''; + const priceInTokens = weiToTokens(config.price); + const priceInUSD = priceInTokens * litKeyPriceUSD; + console.log( + `${componentName} ${measurementName}: ${formatPrice( + priceInTokens, + priceInUSD + )}` + ); + } + + console.log('\n=== Summary ==='); + console.log(`LITKEY Token Price: $${litKeyPriceUSD.toFixed(4)} USD`); + console.log(`PriceFeed Contract: ${priceFeedAddress}`); + console.log(`Network: ${network.name} (Chain ID: ${network.chainId})`); +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/blockchain/contracts/scripts/deployConfig/configs/ci-config.json b/blockchain/contracts/scripts/deployConfig/configs/ci-config.json index 011ffe74..5ab775d0 100644 --- a/blockchain/contracts/scripts/deployConfig/configs/ci-config.json +++ b/blockchain/contracts/scripts/deployConfig/configs/ci-config.json @@ -35,10 +35,6 @@ "127.0.0.1:7491", "127.0.0.1:7492", "127.0.0.1:7493" - ], - "keyTypes": [ - 1, - 2 ] }, "deployCoreConfig": { diff --git a/blockchain/contracts/scripts/deployConfig/configs/three-local-nodes.json b/blockchain/contracts/scripts/deployConfig/configs/three-local-nodes.json index 2d9b0e31..d9dabbfc 100644 --- a/blockchain/contracts/scripts/deployConfig/configs/three-local-nodes.json +++ b/blockchain/contracts/scripts/deployConfig/configs/three-local-nodes.json @@ -16,10 +16,6 @@ "127.0.0.1:7471", "127.0.0.1:7472" ], - "keyTypes": [ - 1, - 2 - ], "backupRecoveryAddresses": [], "backupRecoveryKeys": [], "verifyContracts": true diff --git a/blockchain/contracts/scripts/deployConfig/deployNodeConfig.ts b/blockchain/contracts/scripts/deployConfig/deployNodeConfig.ts index 553a2c16..4d51b221 100644 --- a/blockchain/contracts/scripts/deployConfig/deployNodeConfig.ts +++ b/blockchain/contracts/scripts/deployConfig/deployNodeConfig.ts @@ -33,8 +33,6 @@ export async function askDeployNodeConfig( const numberOfStakedAndJoinedWallets = await askForNumberOfStakedAndJoinedWallets(); - const keyTypes = await askForKeyTypes(); - const ipAddresses = ( await askForIpAddresses( numberOfStakedAndJoinedWallets + numberOfStakedOnlyWallets @@ -64,7 +62,6 @@ export async function askDeployNodeConfig( copyNodeConfigsToRustProject, ipAddresses, existingContracts, - keyTypes, backupRecoveryAddresses: bpAddresses, backupRecoveryKeys: bpKeys, }; @@ -73,49 +70,6 @@ export async function askDeployNodeConfig( } const SUPPORTED_KEY_TYPES = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']; -async function askForKeyTypes(): Promise { - const promptResult = await inquirer.prompt([ - { - type: 'input', - name: 'keyTypes', - message: `Enter the key types you would like to use, separated by commas.\n - 1 - BLS-Encryption, - 2 - Secp256k1, - 3 - Ed25519 - 4 - Ed448 - 5 - Ristretto25519 - 6 - NistP256 - 7 - NistP384 - 8 - BabyJubJub - 9 - Decaf377 - 10 - BLS-Signing - `, - validate: (input) => { - try { - const keyTypes = input.split(','); - if (keyTypes.length === 0) { - return `Please enter at least one key type`; - } - - for (const keyType of keyTypes) { - if (!SUPPORTED_KEY_TYPES.includes(keyType)) { - return `Key type ${keyType} is not supported`; - } - } - } catch (e) { - return `Error parsing input: ${e}`; - } - return true; - }, - default: SUPPORTED_KEY_TYPES.join(','), - }, - ]); - - return promptResult.keyTypes - .split(',') - .map((keyType: string) => parseInt(keyType)); -} - async function askForExistingContractAddresses(): Promise { const existingAddresses = await inquirer.prompt([ { diff --git a/blockchain/contracts/scripts/deployConfig/models.ts b/blockchain/contracts/scripts/deployConfig/models.ts index b20e56b8..ca4bb38e 100644 --- a/blockchain/contracts/scripts/deployConfig/models.ts +++ b/blockchain/contracts/scripts/deployConfig/models.ts @@ -27,7 +27,6 @@ export interface DeployNodeConfig extends DeployBaseConfig { copyNodeConfigsToRustProject: boolean; ipAddresses?: string[]; existingContracts?: Partial; - keyTypes: number[]; nodePrivateKeys?: string[]; chainPollingInterval?: string; customNodeRuntimeConfigPath?: string; diff --git a/blockchain/contracts/scripts/deploy_lit_node_contracts.js b/blockchain/contracts/scripts/deploy_lit_node_contracts.js index 499a91b9..f5011e6b 100644 --- a/blockchain/contracts/scripts/deploy_lit_node_contracts.js +++ b/blockchain/contracts/scripts/deploy_lit_node_contracts.js @@ -240,7 +240,7 @@ async function deployLitNodeContracts(deployNodeConfig) { 'PubkeyRouter', [deployNodeConfig.resolverContractAddress, deployEnvEnum], true, - ['PubkeyRouterFacet'], + ['PubkeyRouterFacet', 'PubkeyRouterViewsFacet'], false, deployNodeConfig.verifyContracts ); @@ -546,9 +546,9 @@ async function deployLitNodeContracts(deployNodeConfig) { monetaryValue: 0, completeIsolation: false, realms: [1], - curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2], - recoveryPartyMembers: [], + curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + recoverySessionId: '0x', }; tx = await stakingContract.setKeySet(defaultKeysetConfig); await tx.wait(); diff --git a/blockchain/contracts/test/domain-wallets/DomainWalletRegistry.ts b/blockchain/contracts/test/domain-wallets/DomainWalletRegistry.ts index fbe97fcb..83eccea9 100644 --- a/blockchain/contracts/test/domain-wallets/DomainWalletRegistry.ts +++ b/blockchain/contracts/test/domain-wallets/DomainWalletRegistry.ts @@ -10,6 +10,7 @@ import { PKPNFTFacet, PKPPermissionsFacet, PubkeyRouterFacet, + PubkeyRouterViewsFacet, StakingAdminFacet, StakingFacet, StakingKeySetsFacet, @@ -36,6 +37,7 @@ describe('DomainWalletRegistry', function () { let pkpPermissionsFacet: PKPPermissionsFacet; let pkpNftMetadata: PKPNFTMetadata; let pubkeyRouter: PubkeyRouterFacet; + let pubkeyRouterViews: PubkeyRouterViewsFacet; let keyDeriver: KeyDeriver; let domainWalletRegistryFacet: DomainWalletRegistryFacet; let domainWalletRegistryViewsFacet: DomainWalletRegistryViewsFacet; @@ -129,7 +131,7 @@ describe('DomainWalletRegistry', function () { await contractResolver.getAddress(), Environment.DEV, { - additionalFacets: ['PubkeyRouterFacet'], + additionalFacets: ['PubkeyRouterFacet', 'PubkeyRouterViewsFacet'], verifyContracts: false, waitForDeployment: false, } @@ -139,6 +141,10 @@ describe('DomainWalletRegistry', function () { 'PubkeyRouterFacet', await pubkeyRouterDiamond.getAddress() ); + pubkeyRouterViews = await ethers.getContractAt( + 'PubkeyRouterViewsFacet', + await pubkeyRouterDiamond.getAddress() + ); keyDeriver = await ethers.deployContract('KeyDeriver'); @@ -192,6 +198,7 @@ describe('DomainWalletRegistry', function () { pkpPermissionsContract: pkpPermissionsFacet, pkpNftMetadataContract: pkpNftMetadata, pubkeyRouterContract: pubkeyRouter, + pubkeyRouterViewsContract: pubkeyRouterViews, hdKeyDeriverContract: keyDeriver, stakingContract: stakingFacet, tokenContract: token, @@ -204,9 +211,9 @@ describe('DomainWalletRegistry', function () { identifier: 'naga-keyset1', description: '', realms: [1], - curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2], - recoveryPartyMembers: [], + curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + recoverySessionId: '0x', }); // Mint enough tokens for the deployer diff --git a/blockchain/contracts/test/lit-node/BackupRecovery.js b/blockchain/contracts/test/lit-node/BackupRecovery.js index bc90900f..702a9954 100644 --- a/blockchain/contracts/test/lit-node/BackupRecovery.js +++ b/blockchain/contracts/test/lit-node/BackupRecovery.js @@ -138,7 +138,7 @@ describe('BackupRecovery', function () { await contractResolver.getAddress(), Environment.DEV, { - additionalFacets: ['PubkeyRouterFacet'], + additionalFacets: ['PubkeyRouterFacet', 'PubkeyRouterViewsFacet'], verifyContracts: false, waitForDeployment: false, } @@ -200,9 +200,9 @@ describe('BackupRecovery', function () { identifier: 'naga-keyset1', description: '', realms: [1], - curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2], - recoveryPartyMembers: [], + curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + recoverySessionId: '0x', }); await token.mint(deployer.address, totalTokens); @@ -451,7 +451,11 @@ describe('BackupRecovery', function () { stakingAccounts[backupPartyCount].nodeAddress ); await expect( - backupContract.registerRecoveryKeys([blsKey, ecdsaKey], sessionId) + backupContract.registerRecoveryKeys( + [blsKey, ecdsaKey], + sessionId, + 'naga-keyset1' + ) ).to.be.revertedWith( 'BackupRecovery: not a member of the Recovery DKG peer group' ); @@ -464,7 +468,8 @@ describe('BackupRecovery', function () { const tx = await backupContract.registerRecoveryKeys( [blsKey, ecdsaKey], - sessionId + sessionId, + 'naga-keyset1' ); await tx.wait(); @@ -476,7 +481,11 @@ describe('BackupRecovery', function () { stakingAccounts[0].nodeAddress ); await expect( - backupContract.registerRecoveryKeys([blsKey, ecdsaKey], sessionId) + backupContract.registerRecoveryKeys( + [blsKey, ecdsaKey], + sessionId, + 'naga-keyset1' + ) ).to.be.revertedWith( 'BackupRecovery: validator has already voted for this recovery key' ); @@ -487,7 +496,8 @@ describe('BackupRecovery', function () { ); tx = await backupContract.registerRecoveryKeys( [blsKey, ecdsaKey], - sessionId + sessionId, + 'naga-keyset1' ); await tx.wait(); expect(await backupRecoveryContract.isRecoveryDkgCompleted()).to.be.true; @@ -497,7 +507,11 @@ describe('BackupRecovery', function () { stakingAccounts[0].nodeAddress ); await expect( - backupContract.registerRecoveryKeys([blsKey, ecdsaKey], sessionId) + backupContract.registerRecoveryKeys( + [blsKey, ecdsaKey], + sessionId, + 'naga-keyset1' + ) ).to.be.revertedWith( 'BackupRecovery: recovery keys already set for this Recovery DKG' ); diff --git a/blockchain/contracts/test/lit-node/PKPHelper.js b/blockchain/contracts/test/lit-node/PKPHelper.js index 464914b2..aa807120 100644 --- a/blockchain/contracts/test/lit-node/PKPHelper.js +++ b/blockchain/contracts/test/lit-node/PKPHelper.js @@ -15,6 +15,7 @@ describe('PKPHelper', function () { let signers; let pkpContract; let router; + let routerViews; let pkpHelper; let pkpPermissionsDiamond; let pkpPermissions; @@ -54,7 +55,7 @@ describe('PKPHelper', function () { await contractResolver.getAddress(), Environment.DEV, { - additionalFacets: ['PubkeyRouterFacet'], + additionalFacets: ['PubkeyRouterFacet', 'PubkeyRouterViewsFacet'], verifyContracts: false, waitForDeployment: false, } @@ -64,6 +65,10 @@ describe('PKPHelper', function () { 'PubkeyRouterFacet', await routerDiamond.getAddress() ); + routerViews = await ethers.getContractAt( + 'PubkeyRouterViewsFacet', + await routerDiamond.getAddress() + ); deployResult = await deployDiamond( 'PKPPermissions', @@ -131,6 +136,7 @@ describe('PKPHelper', function () { pkpPermissionsContract: pkpPermissions, hdKeyDeriverContract: keyDeriver, pubkeyRouterContract: router, + pubkeyRouterViewsContract: routerViews, }); // Mint enough tokens for the deployer @@ -159,9 +165,9 @@ describe('PKPHelper', function () { identifier: 'naga-keyset1', description: '', realms: [1], - curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2], - recoveryPartyMembers: [], + curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + recoverySessionId: '0x', }); await allNodesVoteForRootKeys( diff --git a/blockchain/contracts/test/lit-node/PKPNFT.js b/blockchain/contracts/test/lit-node/PKPNFT.js index 0af6d78d..818b7ee9 100644 --- a/blockchain/contracts/test/lit-node/PKPNFT.js +++ b/blockchain/contracts/test/lit-node/PKPNFT.js @@ -14,6 +14,7 @@ describe('PKPNFT', function () { let signers; let pkpContract; let router; + let routerViews; let pkpPermissions; let pkpNftMetadata; let contractResolver; @@ -63,7 +64,7 @@ describe('PKPNFT', function () { await contractResolver.getAddress(), Environment.DEV, { - additionalFacets: ['PubkeyRouterFacet'], + additionalFacets: ['PubkeyRouterFacet', 'PubkeyRouterViewsFacet'], verifyContracts: false, waitForDeployment: false, } @@ -72,6 +73,10 @@ describe('PKPNFT', function () { 'PubkeyRouterFacet', await routerDiamond.getAddress() ); + routerViews = await ethers.getContractAt( + 'PubkeyRouterViewsFacet', + await routerDiamond.getAddress() + ); const { diamond: pkpPermissionsDiamond } = await deployDiamond( 'PKPPermissions', await contractResolver.getAddress(), @@ -155,6 +160,7 @@ describe('PKPNFT', function () { pkpNftMetadataContract: pkpNftMetadata, hdKeyDeriverContract: keyDeriver, pubkeyRouterContract: router, + pubkeyRouterViewsContract: routerViews, stylusContractP256: supportsArbitrumStylus(hre.network.config) ? hre.network.config.stylusContractsForTests.p256 : undefined, @@ -170,9 +176,9 @@ describe('PKPNFT', function () { identifier: 'naga-keyset1', description: '', realms: [1], - curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2], - recoveryPartyMembers: [], + curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + recoverySessionId: '0x', }); // Mint enough tokens for the deployer diff --git a/blockchain/contracts/test/lit-node/PKPPermissions.js b/blockchain/contracts/test/lit-node/PKPPermissions.js index 815e05e3..5bf95517 100644 --- a/blockchain/contracts/test/lit-node/PKPPermissions.js +++ b/blockchain/contracts/test/lit-node/PKPPermissions.js @@ -17,6 +17,7 @@ describe('PKPPermissions', function () { let signers; let pkpContract; let router; + let routerViews; let pkpHelper; let pkpPermissionsDiamond; let pkpPermissions; @@ -58,7 +59,7 @@ describe('PKPPermissions', function () { await contractResolver.getAddress(), Environment.DEV, { - additionalFacets: ['PubkeyRouterFacet'], + additionalFacets: ['PubkeyRouterFacet', 'PubkeyRouterViewsFacet'], verifyContracts: false, waitForDeployment: false, } @@ -68,6 +69,10 @@ describe('PKPPermissions', function () { 'PubkeyRouterFacet', await routerDiamond.getAddress() ); + routerViews = await ethers.getContractAt( + 'PubkeyRouterViewsFacet', + await routerDiamond.getAddress() + ); deployResult = await deployDiamond( 'PKPPermissions', await contractResolver.getAddress(), @@ -142,6 +147,7 @@ describe('PKPPermissions', function () { pkpPermissionsContract: pkpPermissions, hdKeyDeriverContract: keyDeriver, pubkeyRouterContract: router, + pubkeyRouterViewsContract: routerViews, }); await stakingKeySetsFacet.setKeySet({ @@ -151,9 +157,9 @@ describe('PKPPermissions', function () { identifier: 'naga-keyset1', description: '', realms: [1], - curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2], - recoveryPartyMembers: [], + curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + recoverySessionId: '0x', }); // Mint enough tokens for the deployer @@ -194,6 +200,7 @@ describe('PKPPermissions', function () { [creator, tester, randomAccountWithGas, ...signers] = signers; router = await router.connect(deployer); + routerViews = await routerViews.connect(deployer); // mint the PKP to the tester account pkpContract = await pkpContract.connect(tester); @@ -212,7 +219,7 @@ describe('PKPPermissions', function () { // validate that it was set const [pubkeyAfter, keyTypeAfter, _derivedKeyIdAfter] = - await router.getRoutingData(tokenId); + await routerViews.getRoutingData(tokenId); expect(pubkeyAfter).equal(pubkey); expect(keyTypeAfter).equal(2); diff --git a/blockchain/contracts/test/lit-node/PubkeyRouter.js b/blockchain/contracts/test/lit-node/PubkeyRouter.js index 9f712b8b..265832c7 100644 --- a/blockchain/contracts/test/lit-node/PubkeyRouter.js +++ b/blockchain/contracts/test/lit-node/PubkeyRouter.js @@ -18,6 +18,7 @@ describe('PubkeyRouter', function () { let pkpContract; let routerDiamond; let router; + let routerViews; let pkpHelper; let pkpPermissions; let pkpPermissionsDiamond; @@ -57,7 +58,7 @@ describe('PubkeyRouter', function () { await contractResolver.getAddress(), Environment.DEV, { - additionalFacets: ['PubkeyRouterFacet'], + additionalFacets: ['PubkeyRouterFacet', 'PubkeyRouterViewsFacet'], verifyContracts: false, waitForDeployment: false, } @@ -67,6 +68,10 @@ describe('PubkeyRouter', function () { 'PubkeyRouterFacet', await routerDiamond.getAddress() ); + routerViews = await ethers.getContractAt( + 'PubkeyRouterViewsFacet', + await routerDiamond.getAddress() + ); deployResult = await deployDiamond( 'PKPPermissions', await contractResolver.getAddress(), @@ -149,9 +154,9 @@ describe('PubkeyRouter', function () { identifier: 'naga-keyset1', description: '', realms: [1], - curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2], - recoveryPartyMembers: [], + curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + recoverySessionId: '0x', }); // Mint enough tokens for the deployer @@ -178,7 +183,7 @@ describe('PubkeyRouter', function () { [deployer, ...signers] = signers; // vote for the root keys - let existingRootKeys = await router.getRootKeys( + let existingRootKeys = await routerViews.getRootKeys( await staking.getAddress(), 'naga-keyset1' ); @@ -216,15 +221,15 @@ describe('PubkeyRouter', function () { context('when routing data is unset', async () => { beforeEach(async () => { router = router.connect(deployer); + routerViews = routerViews.connect(deployer); }); it('retrieves empty routing data', async () => { const fakePubkey = '0x0443d46287aa31a62f8319438b6210e169fd9e686a11fad81f6cf375e84ed9ba38a3909e41cc52c0c2f2ad95b4cf32982a6295e410b1ff6d455a7c7a4c44463f48'; const pubkeyHash = ethers.keccak256(fakePubkey); - const [pubkey, stakingContract, keyType] = await router.getRoutingData( - pubkeyHash - ); + const [pubkey, stakingContract, keyType] = + await routerViews.getRoutingData(pubkeyHash); expect(pubkey).equal('0x'); expect(stakingContract).equal( '0x0000000000000000000000000000000000000000' @@ -247,9 +252,10 @@ describe('PubkeyRouter', function () { [creator, tester, ...signers] = signers; router = await router.connect(deployer); + routerViews = await routerViews.connect(deployer); // vote for the root keys - let existingRootKeys = await router.getRootKeys( + let existingRootKeys = await routerViews.getRootKeys( await staking.getAddress(), 'naga-keyset1' ); @@ -283,7 +289,7 @@ describe('PubkeyRouter', function () { // validate that it was set const [pubkeyAfter, keyTypeAfter, _derivedKeyIdAfter] = - await router.getRoutingData(tokenId); + await routerViews.getRoutingData(tokenId); expect(pubkeyAfter).equal(pubkey); expect(keyTypeAfter).equal(2); @@ -294,20 +300,20 @@ describe('PubkeyRouter', function () { it('checks the PKP eth address and the reverse mapping', async () => { // validate that the address matches what ethers calculates const ethersResult = ethers.computeAddress(pubkey); - const pubkeyFromContract = await router.getPubkey(tokenId); - let ethAddressOfPKP = await router.getEthAddress(tokenId); + const pubkeyFromContract = await routerViews.getPubkey(tokenId); + let ethAddressOfPKP = await routerViews.getEthAddress(tokenId); expect(ethAddressOfPKP).equal(ethersResult); expect(pubkey).equal(pubkeyFromContract); // check the reverse mapping - const tokenIdFromContract = await router.ethAddressToPkpId( + const tokenIdFromContract = await routerViews.ethAddressToPkpId( ethAddressOfPKP ); expect(tokenIdFromContract).equal(tokenId); }); it('gets and sets root keys', async () => { - const fetchedRootKeys = await router.getRootKeys( + const fetchedRootKeys = await routerViews.getRootKeys( await staking.getAddress(), 'naga-keyset1' ); diff --git a/blockchain/contracts/test/lit-node/Staking.js b/blockchain/contracts/test/lit-node/Staking.js index 507b32a2..3996c28d 100644 --- a/blockchain/contracts/test/lit-node/Staking.js +++ b/blockchain/contracts/test/lit-node/Staking.js @@ -19,6 +19,7 @@ describe('Staking', function () { let signers; let token; let routerContract; + let routerViews; let pkpNft; let stakingAccount1; let nodeAccount1; @@ -139,7 +140,7 @@ describe('Staking', function () { await contractResolver.getAddress(), 0, { - additionalFacets: ['PubkeyRouterFacet'], + additionalFacets: ['PubkeyRouterFacet', 'PubkeyRouterViewsFacet'], verifyContracts: false, waitForDeployment: false, } @@ -149,6 +150,10 @@ describe('Staking', function () { 'PubkeyRouterFacet', await routerDiamond.getAddress() ); + routerViews = await ethers.getContractAt( + 'PubkeyRouterViewsFacet', + await routerDiamond.getAddress() + ); // Deploy forwarder contract and set on Staking const forwarder = await ethers.deployContract('Forwarder'); @@ -159,6 +164,7 @@ describe('Staking', function () { stakingContract: stakingValidatorFacet, pkpContract: pkpNft, pubkeyRouterContract: routerContract, + pubkeyRouterViewsContract: routerViews, }); await stakingKeySetsFacet.setKeySet({ @@ -168,9 +174,9 @@ describe('Staking', function () { identifier: 'naga-keyset1', description: '', realms: [1], - curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2], - recoveryPartyMembers: [], + curves: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + counts: [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + recoverySessionId: '0x', }); await token.mint(deployer.address, totalTokens); @@ -1309,7 +1315,6 @@ describe('Staking', function () { await expect( stakingAdminFacet.setConfig({ tokenRewardPerTokenPerEpoch: 1, - keyTypes: [1, 2, 3], minimumValidatorCount: 1, rewardEpochDuration: 1, maxTimeLock: 1, @@ -1552,7 +1557,6 @@ async function updateMinimumValidatorCount( await stakingAdminFacet.setConfig({ tokenRewardPerTokenPerEpoch: currentConfig.tokenRewardPerTokenPerEpoch, - keyTypes: [...(await stakingViewsFacet.getKeyTypes())], minimumValidatorCount: newMinimumValidatorCount, rewardEpochDuration: currentConfig.rewardEpochDuration, maxTimeLock: currentConfig.maxTimeLock, diff --git a/blockchain/contracts/utils/contract.ts b/blockchain/contracts/utils/contract.ts index 39b0bd66..c5abec0e 100644 --- a/blockchain/contracts/utils/contract.ts +++ b/blockchain/contracts/utils/contract.ts @@ -20,6 +20,7 @@ import { StakingAdminFacet, StakingFacet, Forwarder, + PubkeyRouterViewsFacet, } from '../typechain-types'; import { LITToken } from '../typechain-types/contracts/lit-node/LITToken'; import { ip2int } from './index.js'; @@ -52,6 +53,7 @@ export async function setContractResolver( domainWalletRegistryContract, hdKeyDeriverContract, pubkeyRouterContract, + pubkeyRouterViewsContract, stylusContractP256, stylusContractK256, }: { @@ -65,6 +67,7 @@ export async function setContractResolver( domainWalletRegistryContract?: DomainWalletRegistryFacet; hdKeyDeriverContract?: KeyDeriver; pubkeyRouterContract?: PubkeyRouterFacet; + pubkeyRouterViewsContract?: PubkeyRouterViewsFacet; stylusContractP256?: string; stylusContractK256?: string; } @@ -141,6 +144,14 @@ export async function setContractResolver( ); } + if (pubkeyRouterViewsContract) { + await contractResolver.setContract( + await contractResolver.PUB_KEY_ROUTER_VIEWS_CONTRACT(), + env, + await pubkeyRouterViewsContract.getAddress() + ); + } + if (backupRecoveryContract) { await contractResolver.setContract( await contractResolver.BACKUP_RECOVERY_CONTRACT(), diff --git a/rust/lit-core/Cargo.lock b/rust/lit-core/Cargo.lock index 80187195..8579d3f6 100644 --- a/rust/lit-core/Cargo.lock +++ b/rust/lit-core/Cargo.lock @@ -1757,28 +1757,16 @@ dependencies = [ "typenum", ] -[[package]] -name = "bitvec" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" -dependencies = [ - "funty 1.1.0", - "radium 0.6.2", - "tap", - "wyz 0.2.0", -] - [[package]] name = "bitvec" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ - "funty 2.0.0", - "radium 0.7.0", + "funty", + "radium", "tap", - "wyz 0.5.1", + "wyz", ] [[package]] @@ -1801,6 +1789,17 @@ dependencies = [ "constant_time_eq 0.1.5", ] +[[package]] +name = "blake2b_simd" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" +dependencies = [ + "arrayref", + "arrayvec 0.7.6", + "constant_time_eq 0.3.1", +] + [[package]] name = "blake2s_simd" version = "0.5.11" @@ -1962,25 +1961,15 @@ dependencies = [ [[package]] name = "bulletproofs" version = "4.0.0" -source = "git+https://github.com/LIT-Protocol/bulletproofs?rev=ddf11c2f593e71f24c9a3d64c56f62d82f2b5099#ddf11c2f593e71f24c9a3d64c56f62d82f2b5099" +source = "git+https://github.com/LIT-Protocol/bulletproofs.git?branch=pallas#2ee66a6e2770c73514942936950c0ca2dbbcd023" dependencies = [ "blake2", - "bls12_381_plus", - "blstrs_plus", "byteorder", - "curve25519-dalek-ml", "data-encoding", - "decaf377", "digest 0.10.7", - "ed448-goldilocks-plus", - "elliptic-curve", "elliptic-curve-tools", - "group", - "jubjub-plus", - "k256", + "lit-rust-crypto 0.6.0", "merlin", - "p256", - "p384", "rand 0.8.5", "rand_core 0.6.4", "serde", @@ -1988,7 +1977,6 @@ dependencies = [ "sha3 0.10.8", "subtle", "thiserror 2.0.14", - "vsss-rs 5.1.0", "zeroize", ] @@ -2385,7 +2373,7 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ - "bitvec 1.0.1", + "bitvec", "coins-bip32", "hmac 0.12.1", "once_cell", @@ -2664,25 +2652,22 @@ dependencies = [ [[package]] name = "criterion" -version = "0.5.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +checksum = "e1c047a62b0cc3e145fa84415a3191f628e980b194c2755aa12300a4e6cbd928" dependencies = [ "anes", "cast", "ciborium", "clap 4.5.44", "criterion-plot", - "is-terminal", - "itertools 0.10.5", + "itertools 0.13.0", "num-traits", - "once_cell", "oorandom", "plotters", "rayon", "regex", "serde", - "serde_derive", "serde_json", "tinytemplate", "walkdir", @@ -2690,12 +2675,12 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +checksum = "9b1bcc0dc7dfae599d84ad0b1a55f80cde8af3725da8313b528da95ef783e338" dependencies = [ "cast", - "itertools 0.10.5", + "itertools 0.13.0", ] [[package]] @@ -3030,13 +3015,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn 2.0.104", + "syn 1.0.109", ] [[package]] -name = "decaf377" +name = "decaf377_plus" version = "0.10.1" -source = "git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5#1c5755b2b90e1969d47ce89cf2d35078984a0ee5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "209f730dfc5f9d877c7549bebc93ea0ef4fe2915b4dbf5ffebc11e8b4c17c740" dependencies = [ "ark-bls12-377", "ark-ec", @@ -3048,7 +3034,6 @@ dependencies = [ "cfg-if", "elliptic-curve", "frost-dkg", - "gennaro-dkg", "hashbrown 0.15.5", "hex", "num-bigint", @@ -3593,28 +3578,13 @@ dependencies = [ "uuid 0.8.2", ] -[[package]] -name = "ethabi" -version = "16.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c98847055d934070b90e806e12d3936b787d0a115068981c1d8dfd5dfef5a5" -dependencies = [ - "ethereum-types 0.12.1", - "hex", - "serde", - "serde_json", - "sha3 0.9.1", - "thiserror 1.0.69", - "uint", -] - [[package]] name = "ethabi" version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ - "ethereum-types 0.14.1", + "ethereum-types", "hex", "once_cell", "regex", @@ -3625,19 +3595,6 @@ dependencies = [ "uint", ] -[[package]] -name = "ethbloom" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb684ac8fa8f6c5759f788862bb22ec6fe3cb392f6bfd08e3c64b603661e3f8" -dependencies = [ - "crunchy", - "fixed-hash 0.7.0", - "impl-rlp", - "impl-serde 0.3.2", - "tiny-keccak", -] - [[package]] name = "ethbloom" version = "0.13.0" @@ -3645,40 +3602,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" dependencies = [ "crunchy", - "fixed-hash 0.8.0", - "impl-codec 0.6.0", + "fixed-hash", + "impl-codec", "impl-rlp", - "impl-serde 0.4.0", + "impl-serde", "scale-info", "tiny-keccak", ] -[[package]] -name = "ethereum-types" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05136f7057fe789f06e6d41d07b34e6f70d8c86e5693b60f97aaa6553553bdaf" -dependencies = [ - "ethbloom 0.11.1", - "fixed-hash 0.7.0", - "impl-rlp", - "impl-serde 0.3.2", - "primitive-types 0.10.1", - "uint", -] - [[package]] name = "ethereum-types" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" dependencies = [ - "ethbloom 0.13.0", - "fixed-hash 0.8.0", - "impl-codec 0.6.0", + "ethbloom", + "fixed-hash", + "impl-codec", "impl-rlp", - "impl-serde 0.4.0", - "primitive-types 0.12.2", + "impl-serde", + "primitive-types", "scale-info", "uint", ] @@ -3782,7 +3725,7 @@ dependencies = [ "chrono", "const-hex", "elliptic-curve", - "ethabi 18.0.0", + "ethabi", "generic-array 0.14.7", "k256", "num_enum", @@ -4056,7 +3999,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "bitvec 1.0.1", + "bitvec", "rand_core 0.6.4", "subtle", ] @@ -4093,18 +4036,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - [[package]] name = "fixed-hash" version = "0.8.0" @@ -4183,12 +4114,13 @@ dependencies = [ [[package]] name = "frost-dkg" -version = "0.3.3" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8176b54a998a04796e58b0ac3a6da08e5ab05aff5a7d92159619a652a29f63e8" +checksum = "00b59a575727037fbc977a68a2ace822b4b37f8f0647769946e307dc966ecfbb" dependencies = [ "elliptic-curve", "elliptic-curve-tools", + "hex", "merlin", "postcard", "rand_core 0.6.4", @@ -4218,12 +4150,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "funty" version = "2.0.0" @@ -4458,24 +4384,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "gennaro-dkg" -version = "1.0.0-rc6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "352f32caf0eb44d8f340f3bba63ca7a0dbeeb3e169a59bbb86ef40e0da10eec6" -dependencies = [ - "anyhow", - "elliptic-curve", - "elliptic-curve-tools", - "merlin", - "postcard", - "rand_chacha 0.3.1", - "rand_core 0.6.4", - "serde", - "thiserror 2.0.14", - "vsss-rs 5.1.0", -] - [[package]] name = "getrandom" version = "0.2.16" @@ -4684,44 +4592,18 @@ dependencies = [ [[package]] name = "hd-keys-curves-wasm" -version = "1.0.3" -source = "git+https://github.com/LIT-Protocol/hd-keys-curves-wasm.git?rev=5e0dcc1a6d8d08f2328d4716dca806db87f93748#5e0dcc1a6d8d08f2328d4716dca806db87f93748" -dependencies = [ - "digest 0.10.7", - "ecdsa", - "elliptic-curve", - "elliptic-curve-tools", - "getrandom 0.2.16", - "k256", - "p256", - "p384", - "sha2 0.10.9", - "subtle", -] - -[[package]] -name = "hd-keys-curves-wasm" -version = "1.0.3" -source = "git+https://github.com/LIT-Protocol/hd-keys-curves-wasm#5e0dcc1a6d8d08f2328d4716dca806db87f93748" +version = "1.0.5" +source = "git+https://github.com/LIT-Protocol/hd-keys-curves-wasm?branch=pallas#597a14b9cf4bafd4c778f1053ca4bbad0b3d249b" dependencies = [ "blake2", - "blsful", - "curve25519-dalek-ml", - "decaf377", "digest 0.10.7", "ecdsa", - "ed448-goldilocks-plus", - "elliptic-curve", "elliptic-curve-tools", "getrandom 0.2.16", - "jubjub-plus", - "k256", - "p256", - "p384", + "lit-rust-crypto 0.6.0", "sha2 0.10.9", "sha3 0.10.8", "subtle", - "vsss-rs 5.1.0", ] [[package]] @@ -4784,6 +4666,12 @@ dependencies = [ "serde", ] +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + [[package]] name = "hidapi-rusb" version = "1.3.3" @@ -5259,22 +5147,13 @@ dependencies = [ "version_check", ] -[[package]] -name = "impl-codec" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161ebdfec3c8e3b52bf61c4f3550a1eea4f9579d10dc1b936f3171ebdcd6c443" -dependencies = [ - "parity-scale-codec 2.3.1", -] - [[package]] name = "impl-codec" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec 3.7.5", + "parity-scale-codec", ] [[package]] @@ -5286,15 +5165,6 @@ dependencies = [ "rlp", ] -[[package]] -name = "impl-serde" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4551f042f3438e64dbd6226b20527fc84a6e1fe65688b58746a2f53623f25f5c" -dependencies = [ - "serde", -] - [[package]] name = "impl-serde" version = "0.4.0" @@ -5515,6 +5385,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.14.0" @@ -5592,11 +5471,11 @@ dependencies = [ [[package]] name = "jubjub-plus" -version = "0.10.8" +version = "0.10.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2c5e88d1ac6a903e693287073860ea35299b200273d5c2bd9d7845ec39f319" +checksum = "e8cd4e5cd65bb1390238c9e2e7dc98078a7b146c9d0d080cf3a7b1ac0d2348ac" dependencies = [ - "bitvec 1.0.1", + "bitvec", "bls12_381_plus", "elliptic-curve", "ff", @@ -5618,6 +5497,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", + "hex-literal", "once_cell", "serdect 0.2.0", "sha2 0.10.9", @@ -5687,6 +5567,9 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin 0.9.8", +] [[package]] name = "libc" @@ -5819,7 +5702,7 @@ dependencies = [ "opentelemetry_sdk", "reqwest 0.11.27", "rocket", - "scc 3.3.2", + "scc", "sd-notify", "semver 1.0.26", "serde", @@ -5883,7 +5766,7 @@ dependencies = [ "once_cell", "pretty_assertions", "reqwest 0.11.27", - "scc 2.4.0", + "scc", "serde", "serde_json", "serde_yaml", @@ -5968,14 +5851,11 @@ dependencies = [ "criterion", "digest 0.10.7", "ecdsa", - "elliptic-curve", "elliptic-curve-tools", - "hd-keys-curves-wasm 1.0.3 (git+https://github.com/LIT-Protocol/hd-keys-curves-wasm.git?rev=5e0dcc1a6d8d08f2328d4716dca806db87f93748)", + "hd-keys-curves-wasm", "hex", - "k256", "lit-poly", - "p256", - "p384", + "lit-rust-crypto 0.6.0", "rand 0.8.5", "rand_chacha 0.3.1", "rstest", @@ -5984,7 +5864,6 @@ dependencies = [ "sha2 0.10.9", "subtle", "thiserror 2.0.14", - "vsss-rs 5.1.0", "zeroize", ] @@ -6011,23 +5890,15 @@ dependencies = [ name = "lit-node-core" version = "2.0.1" dependencies = [ - "blsful", - "curve25519-dalek-ml", - "decaf377", "ed25519-dalek", - "ed448-goldilocks-plus", - "ethabi 16.0.0", + "ethabi", "ethers", - "hd-keys-curves-wasm 1.0.3 (git+https://github.com/LIT-Protocol/hd-keys-curves-wasm)", + "hd-keys-curves-wasm", "hex", - "jubjub-plus", - "k256", - "p256", - "p384", + "lit-rust-crypto 0.6.0", "serde", "serde_json", "thiserror 2.0.14", - "vsss-rs 5.1.0", ] [[package]] @@ -6085,32 +5956,25 @@ dependencies = [ [[package]] name = "lit-recovery" -version = "0.2.0" +version = "0.3.0" dependencies = [ "arc-swap", "argon2", - "blsful", "bulletproofs", "byteorder", "ciborium", "clap 4.5.44", "colored", "cryptex", - "decaf377", "dirs 6.0.0", - "ed448-goldilocks-plus", - "elliptic-curve", "ethers", "generic-array 1.1.1", "glob", "hex", - "jubjub-plus", - "k256", "lit-blockchain", "lit-core", "lit-node-core", - "p256", - "p384", + "lit-rust-crypto 0.6.0", "path-clean", "rand 0.8.5", "reqwest 0.11.27", @@ -6126,25 +5990,57 @@ dependencies = [ "tiny-bip39", "tokio", "verifiable-share-encryption", - "vsss-rs 5.1.0", "winapi", ] [[package]] -name = "lit-vrf" -version = "0.2.0" +name = "lit-rust-crypto" +version = "0.5.0" +source = "git+https://github.com/LIT-Protocol/lit-rust-crypto?tag=0.5.0#0b3e4d5a9811ce151da83cab4835cf5631c9a5c3" dependencies = [ - "blake2", - "bulletproofs", + "bls12_381_plus", + "blsful", + "blstrs_plus", "curve25519-dalek-ml", - "decaf377", + "decaf377_plus", "ed448-goldilocks-plus", "elliptic-curve", - "elliptic-curve-tools", "jubjub-plus", "k256", "p256", "p384", + "pasta_curves_plus", + "vsss-rs 5.1.0", +] + +[[package]] +name = "lit-rust-crypto" +version = "0.6.0" +source = "git+https://github.com/LIT-Protocol/lit-rust-crypto?tag=0.6.0#9548fce521473f289ea1366249b782355e96507d" +dependencies = [ + "bls12_381_plus", + "blsful", + "blstrs_plus", + "curve25519-dalek-ml", + "decaf377_plus", + "ed448-goldilocks-plus", + "elliptic-curve", + "jubjub-plus", + "k256", + "p256", + "p384", + "pasta_curves_plus", + "vsss-rs 5.1.0", +] + +[[package]] +name = "lit-vrf" +version = "0.2.0" +dependencies = [ + "blake2", + "bulletproofs", + "elliptic-curve-tools", + "lit-rust-crypto 0.6.0", "rand 0.8.5", "rand_chacha 0.3.1", "rfc6979", @@ -6154,7 +6050,6 @@ dependencies = [ "sha2 0.10.9", "sha3 0.10.8", "thiserror 2.0.14", - "vsss-rs 5.1.0", ] [[package]] @@ -6481,7 +6376,7 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567122ab6492f49b59def14ecc36e13e64dca4188196dd0cd41f9f3f979f3df6" dependencies = [ - "blake2b_simd", + "blake2b_simd 0.5.11", "blake2s_simd", "digest 0.9.0", "sha-1", @@ -6822,7 +6717,7 @@ dependencies = [ "arrayvec 0.7.6", "auto_impl", "bytes", - "ethereum-types 0.14.1", + "ethereum-types", "open-fastrlp-derive", ] @@ -7051,20 +6946,6 @@ dependencies = [ "group", ] -[[package]] -name = "parity-scale-codec" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" -dependencies = [ - "arrayvec 0.7.6", - "bitvec 0.20.4", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive 2.3.1", - "serde", -] - [[package]] name = "parity-scale-codec" version = "3.7.5" @@ -7072,27 +6953,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" dependencies = [ "arrayvec 0.7.6", - "bitvec 1.0.1", + "bitvec", "byte-slice-cast", "const_format", "impl-trait-for-tuples", - "parity-scale-codec-derive 3.7.5", + "parity-scale-codec-derive", "rustversion", "serde", ] -[[package]] -name = "parity-scale-codec-derive" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1557010476e0595c9b568d16dcfb81b93cdeb157612726f5170d31aa707bed27" -dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "parity-scale-codec-derive" version = "3.7.5" @@ -7156,6 +7025,26 @@ dependencies = [ "subtle", ] +[[package]] +name = "pasta_curves_plus" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e265b7ebdbfc61a8c0eeac79350cf3225cd390325dc91dd0edede5b6742d58" +dependencies = [ + "blake2", + "blake2b_simd 1.0.3", + "elliptic-curve", + "ff", + "frost-dkg", + "group", + "hex", + "lazy_static", + "rand 0.8.5", + "serde", + "static_assertions", + "subtle", +] + [[package]] name = "paste" version = "1.0.15" @@ -7608,29 +7497,16 @@ dependencies = [ "serdect 0.2.0", ] -[[package]] -name = "primitive-types" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" -dependencies = [ - "fixed-hash 0.7.0", - "impl-codec 0.5.1", - "impl-rlp", - "impl-serde 0.3.2", - "uint", -] - [[package]] name = "primitive-types" version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ - "fixed-hash 0.8.0", - "impl-codec 0.6.0", + "fixed-hash", + "impl-codec", "impl-rlp", - "impl-serde 0.4.0", + "impl-serde", "scale-info", "uint", ] @@ -7927,12 +7803,6 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" -[[package]] -name = "radium" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" - [[package]] name = "radium" version = "0.7.0" @@ -8434,21 +8304,20 @@ dependencies = [ [[package]] name = "rstest" -version = "0.24.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e905296805ab93e13c1ec3a03f4b6c4f35e9498a3d5fa96dc626d22c03cd89" +checksum = "f5a3193c063baaa2a95a33f03035c8a72b83d97a54916055ba22d35ed3839d49" dependencies = [ "futures-timer", "futures-util", "rstest_macros", - "rustc_version 0.4.1", ] [[package]] name = "rstest_macros" -version = "0.24.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef0053bbffce09062bee4bcc499b0fbe7a57b879f1efe088d6d8d4c7adcdef9b" +checksum = "9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0" dependencies = [ "cfg-if", "glob", @@ -8487,8 +8356,8 @@ dependencies = [ "num-bigint", "num-integer", "num-traits", - "parity-scale-codec 3.7.5", - "primitive-types 0.12.2", + "parity-scale-codec", + "primitive-types", "proptest", "rand 0.8.5", "rand 0.9.2", @@ -8795,7 +8664,7 @@ checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" dependencies = [ "cfg-if", "derive_more 1.0.0", - "parity-scale-codec 3.7.5", + "parity-scale-codec", "scale-info-derive", ] @@ -8811,15 +8680,6 @@ dependencies = [ "syn 2.0.104", ] -[[package]] -name = "scc" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" -dependencies = [ - "sdd 3.0.10", -] - [[package]] name = "scc" version = "3.3.2" @@ -8827,7 +8687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd0b9e1890c5b17833a779c68a974f04170dfa36e3789395d17845418cc779ac" dependencies = [ "saa", - "sdd 4.2.4", + "sdd", ] [[package]] @@ -8915,12 +8775,6 @@ dependencies = [ "libc", ] -[[package]] -name = "sdd" -version = "3.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" - [[package]] name = "sdd" version = "4.2.4" @@ -10819,13 +10673,14 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "verifiable-share-encryption" -version = "0.3.0" -source = "git+https://github.com/LIT-Protocol/verifiable-share-encryption?rev=7eddfbe736369db596d0f302c72f1d76b0fd332d#7eddfbe736369db596d0f302c72f1d76b0fd332d" +version = "0.4.0" +source = "git+https://github.com/LIT-Protocol/verifiable-share-encryption?branch=pallas#be0a4f548aa92897bd77d3ceca86ea2cec80fe07" dependencies = [ "anyhow", "bulletproofs", "data-encoding", "elliptic-curve-tools", + "lit-rust-crypto 0.5.0", "rand_core 0.6.4", "rayon", "serde", @@ -11497,12 +11352,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "wyz" version = "0.5.1" diff --git a/rust/lit-core/Cargo.toml b/rust/lit-core/Cargo.toml index d50e2477..27d4c135 100644 --- a/rust/lit-core/Cargo.toml +++ b/rust/lit-core/Cargo.toml @@ -25,30 +25,23 @@ alloy = { version = "0.12.5", features = ["eip712", "sol-types"]} arc-swap = { version = "1.7" } async-std = { version = "1.13" } async-trait = { version = "0.1" } +bulletproofs = { git = "https://github.com/LIT-Protocol/bulletproofs.git", branch = "pallas" } bytes = { version = "1.10" } -curve25519-dalek = { package = "curve25519-dalek-ml", version="4.3.0", features = ["group", "serde", "rand_core"] } -decaf377 = { git = "https://github.com/LIT-Protocol/decaf377", rev = "1c5755b2b90e1969d47ce89cf2d35078984a0ee5", features = ["serde"] } derive_more = { version = "2", features = ["display"] } -ed448-goldilocks-plus = { version = "0.16", features = ["serde"] } -elliptic-curve = { version = "0.13", features = ["arithmetic", "serde"] } elliptic-curve-tools = { version = "0.1", features = ["std"] } ethers = { version = "2.0", features = ["abigen", "legacy"] } futures = { version = "0.3" } +generic-array = "=1.1.1" hex = "0.4" http-body-util = { version = "0.1.2" } hyper = { version = "1" } hyper-util = { version = "0.1", features = ["client-legacy", "server", "service"] } hyperlocal = { version = "0.9" } -jubjub = { package="jubjub-plus", version = "0.10", features = ["serde"] } -k256 = { version = "0.13", features = ["arithmetic", "hash2curve", "serde"] } -generic-array = "=1.1.1" once_cell = { version = "1.20" } opentelemetry = "0.24" opentelemetry-otlp = { version = "0.17", features = ["metrics"] } opentelemetry_sdk = { version = "0.24.1", features = ["rt-tokio", "metrics"] } opentelemetry-semantic-conventions = "0.15.0" -p256 = { version = "0.13", features = ["arithmetic", "hash2curve", "serde"] } -p384 = { version = "0.13", features = ["arithmetic", "hash2curve", "serde"] } rand = "0.8" rand_chacha = "0.3.1" reqwest = { version = "0.11.12", default-features = false, features = ["rustls-tls"] } @@ -61,5 +54,19 @@ thiserror = "2.0" tokio = { version = "1", features = ["full"] } tracing = { version = "0.1" } tracing-opentelemetry = { version = "0.25" } -vsss-rs = { version = "5.1", features = ["std"] } zeroize = { version = "1.8", features = ["derive"] } + +[workspace.dependencies.lit-rust-crypto] +git = "https://github.com/LIT-Protocol/lit-rust-crypto" +tag = "0.6.0" +features = [ + "arithmetic", + "hash2curve", + "serde", + "std", +] + +[workspace.dependencies.hd-keys-curves-wasm] +git = "https://github.com/LIT-Protocol/hd-keys-curves-wasm.git" +branch = "pallas" +default-features = false \ No newline at end of file diff --git a/rust/lit-core/lit-attestation/src/attestation.rs b/rust/lit-core/lit-attestation/src/attestation.rs index 0bc85e37..902c0a4f 100644 --- a/rust/lit-core/lit-attestation/src/attestation.rs +++ b/rust/lit-core/lit-attestation/src/attestation.rs @@ -1068,7 +1068,6 @@ mod tests { #[cfg(feature = "generate-via-system")] async fn amdsev_snp_verify_success_test() { use crate::attestation::AmdSevSnpAttestation; - use lit_core::utils::binary::bytes_to_hex; use lit_node_core::AttestationType; if !Path::new("/dev/sev-guest").exists() { diff --git a/rust/lit-core/lit-blockchain-lite/abis/ArbitrumKeyDeriver.json b/rust/lit-core/lit-blockchain-lite/abis/ArbitrumKeyDeriver.json index f48ee967..132cb67a 100644 --- a/rust/lit-core/lit-blockchain-lite/abis/ArbitrumKeyDeriver.json +++ b/rust/lit-core/lit-blockchain-lite/abis/ArbitrumKeyDeriver.json @@ -348,8 +348,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506040516111ca3803806111ca83398101604081905261002f916101a4565b6100476000805160206111aa833981519152336100ad565b61005f6000805160206111aa833981519152806100bb565b600180546001600160a01b0384166001600160a01b03198216811783558392916001600160a81b03191617600160a01b8360028111156100a1576100a16101ee565b02179055505050610204565b6100b78282610106565b5050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166100b7576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556101603390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600080604083850312156101b757600080fd5b82516001600160a01b03811681146101ce57600080fd5b6020840151909250600381106101e357600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b610f97806102136000396000f3fe608060405234801561001057600080fd5b50600436106100ba5760003560e01c806301ffc9a7146100bf578063248a9ca3146100e75780632f2ff15d1461010857806336568abe1461011d57806350d17b5e1461013057806375b238fc1461015b57806391d14854146101825780639dca003214610195578063a217fddf146101b6578063a32c2b99146101be578063b24ed308146101df578063d547741f14610206578063f95d71b114610219578063fe89c9701461022c575b600080fd5b6100d26100cd36600461098d565b610252565b60405190151581526020015b60405180910390f35b6100fa6100f53660046109b7565b610289565b6040519081526020016100de565b61011b6101163660046109e5565b61029e565b005b61011b61012b3660046109e5565b6102bf565b600154610143906001600160a01b031681565b6040516001600160a01b0390911681526020016100de565b6100fa7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b6100d26101903660046109e5565b610342565b6001546101a990600160a01b900460ff1681565b6040516100de9190610a37565b6100fa600081565b6101d16101cc366004610ada565b61036b565b6040516100de929190610c92565b6100fa7f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d981565b61011b6102143660046109e5565b6104f6565b61011b610227366004610cb5565b610512565b6100fa7ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c6481565b60006001600160e01b03198216637965db0b60e01b148061028357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60009081526020819052604090206001015490565b6102a782610289565b6102b08161055f565b6102ba838361056c565b505050565b6001600160a01b03811633146103345760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61033e82826105f0565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60006060600061037c868686610655565b905060008160008151811061039357610393610cd2565b01602001516001600160f81b0319166000036103d057507f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d96103f2565b507ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c645b600154604051634746fe8b60e11b81526000916001600160a01b03811691638e8dfd169161042f918691600160a01b900460ff1690600401610ce8565b602060405180830381865afa15801561044c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104709190610cfc565b90506000816001600160a01b031663ec723367856040518263ffffffff1660e01b81526004016104a09190610d19565b600060405180830381865afa1580156104bd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104e59190810190610d2c565b60019a909950975050505050505050565b6104ff82610289565b6105088161055f565b6102ba83836105f0565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261053c8161055f565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6105698133610787565b50565b6105768282610342565b61033e576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556105ac3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6105fa8282610342565b1561033e576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60408051600080825260208201909252606091805b85518110156106ef578486828151811061068657610686610cd2565b602002602001015160200151036106e757828682815181106106aa576106aa610cd2565b6020026020010151600001516040516020016106c7929190610da2565b604051602081830303815290604052925081806106e390610de7565b9250505b60010161066a565b5083600203610701576001935061070e565b8360030361070e57600093505b60006040518060600160405280602b8152602001610f37602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061076590869086908f9087908b9088908f90602001610e0c565b60408051601f19818403018152919052985050505050505050505b9392505050565b6107918282610342565b61033e5761079e816107e0565b6107a98360206107f2565b6040516020016107ba929190610e86565b60408051601f198184030181529082905262461bcd60e51b825261032b91600401610d19565b60606102836001600160a01b03831660145b60606000610801836002610ef5565b61080c906002610f0c565b6001600160401b0381111561082357610823610a45565b6040519080825280601f01601f19166020018201604052801561084d576020820181803683370190505b509050600360fc1b8160008151811061086857610868610cd2565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061089757610897610cd2565b60200101906001600160f81b031916908160001a90535060006108bb846002610ef5565b6108c6906001610f0c565b90505b600181111561093e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106108fa576108fa610cd2565b1a60f81b82828151811061091057610910610cd2565b60200101906001600160f81b031916908160001a90535060049490941c9361093781610f1f565b90506108c9565b5083156107805760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161032b565b60006020828403121561099f57600080fd5b81356001600160e01b03198116811461078057600080fd5b6000602082840312156109c957600080fd5b5035919050565b6001600160a01b038116811461056957600080fd5b600080604083850312156109f857600080fd5b823591506020830135610a0a816109d0565b809150509250929050565b60038110610a3357634e487b7160e01b600052602160045260246000fd5b9052565b602081016102838284610a15565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610a7d57610a7d610a45565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610aab57610aab610a45565b604052919050565b60006001600160401b03821115610acc57610acc610a45565b50601f01601f191660200190565b600080600060608486031215610aef57600080fd5b8335925060208401356001600160401b03811115610b0c57600080fd5b8401601f81018613610b1d57600080fd5b80356001600160401b03811115610b3657610b36610a45565b8060051b610b4660208201610a83565b91825260208184018101929081019089841115610b6257600080fd5b6020850192505b83831015610c2d5782356001600160401b03811115610b8757600080fd5b85016040818c03601f19011215610b9d57600080fd5b610ba5610a5b565b60208201356001600160401b03811115610bbe57600080fd5b82016020810190603f018d13610bd357600080fd5b8035610be6610be182610ab3565b610a83565b8181528e6020838501011115610bfb57600080fd5b816020840160208301376000602092820183015283526040939093013582840152508352928301929190910190610b69565b96999698505050506040949094013593505050565b60005b83811015610c5d578181015183820152602001610c45565b50506000910152565b60008151808452610c7e816020860160208601610c42565b601f01601f19169290920160200192915050565b8215158152604060208201526000610cad6040830184610c66565b949350505050565b600060208284031215610cc757600080fd5b8135610780816109d0565b634e487b7160e01b600052603260045260246000fd5b828152604081016107806020830184610a15565b600060208284031215610d0e57600080fd5b8151610780816109d0565b6020815260006107806020830184610c66565b600060208284031215610d3e57600080fd5b81516001600160401b03811115610d5457600080fd5b8201601f81018413610d6557600080fd5b8051610d73610be182610ab3565b818152856020838501011115610d8857600080fd5b610d99826020830160208601610c42565b95945050505050565b60008351610db4818460208801610c42565b835190830190610dc8818360208801610c42565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff821663ffffffff8103610e0357610e03610dd1565b60010192915050565b6001600160f81b0319881681526001600160e01b0319878116600183015260058201879052851660258201528351600090610e4e816029850160208901610c42565b6001600160e01b031985166029918401918201528351610e7581602d840160208801610c42565b01602d019998505050505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351610eb8816017850160208801610c42565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610ee9816028840160208801610c42565b01602801949350505050565b808202811582820484141761028357610283610dd1565b8082018082111561028357610283610dd1565b600081610f2e57610f2e610dd1565b50600019019056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa264697066735822122037243bc43e78ac34bb45bfe243450c281f61d226e12cdab04b2899832a44ff7764736f6c634300081c0033df8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ba5760003560e01c806301ffc9a7146100bf578063248a9ca3146100e75780632f2ff15d1461010857806336568abe1461011d57806350d17b5e1461013057806375b238fc1461015b57806391d14854146101825780639dca003214610195578063a217fddf146101b6578063a32c2b99146101be578063b24ed308146101df578063d547741f14610206578063f95d71b114610219578063fe89c9701461022c575b600080fd5b6100d26100cd36600461098d565b610252565b60405190151581526020015b60405180910390f35b6100fa6100f53660046109b7565b610289565b6040519081526020016100de565b61011b6101163660046109e5565b61029e565b005b61011b61012b3660046109e5565b6102bf565b600154610143906001600160a01b031681565b6040516001600160a01b0390911681526020016100de565b6100fa7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b6100d26101903660046109e5565b610342565b6001546101a990600160a01b900460ff1681565b6040516100de9190610a37565b6100fa600081565b6101d16101cc366004610ada565b61036b565b6040516100de929190610c92565b6100fa7f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d981565b61011b6102143660046109e5565b6104f6565b61011b610227366004610cb5565b610512565b6100fa7ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c6481565b60006001600160e01b03198216637965db0b60e01b148061028357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60009081526020819052604090206001015490565b6102a782610289565b6102b08161055f565b6102ba838361056c565b505050565b6001600160a01b03811633146103345760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61033e82826105f0565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60006060600061037c868686610655565b905060008160008151811061039357610393610cd2565b01602001516001600160f81b0319166000036103d057507f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d96103f2565b507ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c645b600154604051634746fe8b60e11b81526000916001600160a01b03811691638e8dfd169161042f918691600160a01b900460ff1690600401610ce8565b602060405180830381865afa15801561044c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104709190610cfc565b90506000816001600160a01b031663ec723367856040518263ffffffff1660e01b81526004016104a09190610d19565b600060405180830381865afa1580156104bd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104e59190810190610d2c565b60019a909950975050505050505050565b6104ff82610289565b6105088161055f565b6102ba83836105f0565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261053c8161055f565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6105698133610787565b50565b6105768282610342565b61033e576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556105ac3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6105fa8282610342565b1561033e576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60408051600080825260208201909252606091805b85518110156106ef578486828151811061068657610686610cd2565b602002602001015160200151036106e757828682815181106106aa576106aa610cd2565b6020026020010151600001516040516020016106c7929190610da2565b604051602081830303815290604052925081806106e390610de7565b9250505b60010161066a565b5083600203610701576001935061070e565b8360030361070e57600093505b60006040518060600160405280602b8152602001610f37602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061076590869086908f9087908b9088908f90602001610e0c565b60408051601f19818403018152919052985050505050505050505b9392505050565b6107918282610342565b61033e5761079e816107e0565b6107a98360206107f2565b6040516020016107ba929190610e86565b60408051601f198184030181529082905262461bcd60e51b825261032b91600401610d19565b60606102836001600160a01b03831660145b60606000610801836002610ef5565b61080c906002610f0c565b6001600160401b0381111561082357610823610a45565b6040519080825280601f01601f19166020018201604052801561084d576020820181803683370190505b509050600360fc1b8160008151811061086857610868610cd2565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061089757610897610cd2565b60200101906001600160f81b031916908160001a90535060006108bb846002610ef5565b6108c6906001610f0c565b90505b600181111561093e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106108fa576108fa610cd2565b1a60f81b82828151811061091057610910610cd2565b60200101906001600160f81b031916908160001a90535060049490941c9361093781610f1f565b90506108c9565b5083156107805760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161032b565b60006020828403121561099f57600080fd5b81356001600160e01b03198116811461078057600080fd5b6000602082840312156109c957600080fd5b5035919050565b6001600160a01b038116811461056957600080fd5b600080604083850312156109f857600080fd5b823591506020830135610a0a816109d0565b809150509250929050565b60038110610a3357634e487b7160e01b600052602160045260246000fd5b9052565b602081016102838284610a15565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610a7d57610a7d610a45565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610aab57610aab610a45565b604052919050565b60006001600160401b03821115610acc57610acc610a45565b50601f01601f191660200190565b600080600060608486031215610aef57600080fd5b8335925060208401356001600160401b03811115610b0c57600080fd5b8401601f81018613610b1d57600080fd5b80356001600160401b03811115610b3657610b36610a45565b8060051b610b4660208201610a83565b91825260208184018101929081019089841115610b6257600080fd5b6020850192505b83831015610c2d5782356001600160401b03811115610b8757600080fd5b85016040818c03601f19011215610b9d57600080fd5b610ba5610a5b565b60208201356001600160401b03811115610bbe57600080fd5b82016020810190603f018d13610bd357600080fd5b8035610be6610be182610ab3565b610a83565b8181528e6020838501011115610bfb57600080fd5b816020840160208301376000602092820183015283526040939093013582840152508352928301929190910190610b69565b96999698505050506040949094013593505050565b60005b83811015610c5d578181015183820152602001610c45565b50506000910152565b60008151808452610c7e816020860160208601610c42565b601f01601f19169290920160200192915050565b8215158152604060208201526000610cad6040830184610c66565b949350505050565b600060208284031215610cc757600080fd5b8135610780816109d0565b634e487b7160e01b600052603260045260246000fd5b828152604081016107806020830184610a15565b600060208284031215610d0e57600080fd5b8151610780816109d0565b6020815260006107806020830184610c66565b600060208284031215610d3e57600080fd5b81516001600160401b03811115610d5457600080fd5b8201601f81018413610d6557600080fd5b8051610d73610be182610ab3565b818152856020838501011115610d8857600080fd5b610d99826020830160208601610c42565b95945050505050565b60008351610db4818460208801610c42565b835190830190610dc8818360208801610c42565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff821663ffffffff8103610e0357610e03610dd1565b60010192915050565b6001600160f81b0319881681526001600160e01b0319878116600183015260058201879052851660258201528351600090610e4e816029850160208901610c42565b6001600160e01b031985166029918401918201528351610e7581602d840160208801610c42565b01602d019998505050505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351610eb8816017850160208801610c42565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610ee9816028840160208801610c42565b01602801949350505050565b808202811582820484141761028357610283610dd1565b8082018082111561028357610283610dd1565b600081610f2e57610f2e610dd1565b50600019019056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa264697066735822122037243bc43e78ac34bb45bfe243450c281f61d226e12cdab04b2899832a44ff7764736f6c634300081c0033", + "bytecode": "0x608060405234801561001057600080fd5b506040516111ca3803806111ca83398101604081905261002f916101a4565b6100476000805160206111aa833981519152336100ad565b61005f6000805160206111aa833981519152806100bb565b600180546001600160a01b0384166001600160a01b03198216811783558392916001600160a81b03191617600160a01b8360028111156100a1576100a16101ee565b02179055505050610204565b6100b78282610106565b5050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166100b7576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556101603390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600080604083850312156101b757600080fd5b82516001600160a01b03811681146101ce57600080fd5b6020840151909250600381106101e357600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b610f97806102136000396000f3fe608060405234801561001057600080fd5b50600436106100ba5760003560e01c806301ffc9a7146100bf578063248a9ca3146100e75780632f2ff15d1461010857806336568abe1461011d57806350d17b5e1461013057806375b238fc1461015b57806391d14854146101825780639dca003214610195578063a217fddf146101b6578063a32c2b99146101be578063b24ed308146101df578063d547741f14610206578063f95d71b114610219578063fe89c9701461022c575b600080fd5b6100d26100cd36600461098d565b610252565b60405190151581526020015b60405180910390f35b6100fa6100f53660046109b7565b610289565b6040519081526020016100de565b61011b6101163660046109e5565b61029e565b005b61011b61012b3660046109e5565b6102bf565b600154610143906001600160a01b031681565b6040516001600160a01b0390911681526020016100de565b6100fa7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b6100d26101903660046109e5565b610342565b6001546101a990600160a01b900460ff1681565b6040516100de9190610a37565b6100fa600081565b6101d16101cc366004610ada565b61036b565b6040516100de929190610c92565b6100fa7f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d981565b61011b6102143660046109e5565b6104f6565b61011b610227366004610cb5565b610512565b6100fa7ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c6481565b60006001600160e01b03198216637965db0b60e01b148061028357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60009081526020819052604090206001015490565b6102a782610289565b6102b08161055f565b6102ba838361056c565b505050565b6001600160a01b03811633146103345760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61033e82826105f0565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60006060600061037c868686610655565b905060008160008151811061039357610393610cd2565b01602001516001600160f81b0319166000036103d057507f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d96103f2565b507ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c645b600154604051634746fe8b60e11b81526000916001600160a01b03811691638e8dfd169161042f918691600160a01b900460ff1690600401610ce8565b602060405180830381865afa15801561044c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104709190610cfc565b90506000816001600160a01b031663ec723367856040518263ffffffff1660e01b81526004016104a09190610d19565b600060405180830381865afa1580156104bd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104e59190810190610d2c565b60019a909950975050505050505050565b6104ff82610289565b6105088161055f565b6102ba83836105f0565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261053c8161055f565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6105698133610787565b50565b6105768282610342565b61033e576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556105ac3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6105fa8282610342565b1561033e576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60408051600080825260208201909252606091805b85518110156106ef578486828151811061068657610686610cd2565b602002602001015160200151036106e757828682815181106106aa576106aa610cd2565b6020026020010151600001516040516020016106c7929190610da2565b604051602081830303815290604052925081806106e390610de7565b9250505b60010161066a565b5083600203610701576001935061070e565b8360030361070e57600093505b60006040518060600160405280602b8152602001610f37602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061076590869086908f9087908b9088908f90602001610e0c565b60408051601f19818403018152919052985050505050505050505b9392505050565b6107918282610342565b61033e5761079e816107e0565b6107a98360206107f2565b6040516020016107ba929190610e86565b60408051601f198184030181529082905262461bcd60e51b825261032b91600401610d19565b60606102836001600160a01b03831660145b60606000610801836002610ef5565b61080c906002610f0c565b6001600160401b0381111561082357610823610a45565b6040519080825280601f01601f19166020018201604052801561084d576020820181803683370190505b509050600360fc1b8160008151811061086857610868610cd2565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061089757610897610cd2565b60200101906001600160f81b031916908160001a90535060006108bb846002610ef5565b6108c6906001610f0c565b90505b600181111561093e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106108fa576108fa610cd2565b1a60f81b82828151811061091057610910610cd2565b60200101906001600160f81b031916908160001a90535060049490941c9361093781610f1f565b90506108c9565b5083156107805760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161032b565b60006020828403121561099f57600080fd5b81356001600160e01b03198116811461078057600080fd5b6000602082840312156109c957600080fd5b5035919050565b6001600160a01b038116811461056957600080fd5b600080604083850312156109f857600080fd5b823591506020830135610a0a816109d0565b809150509250929050565b60038110610a3357634e487b7160e01b600052602160045260246000fd5b9052565b602081016102838284610a15565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610a7d57610a7d610a45565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610aab57610aab610a45565b604052919050565b60006001600160401b03821115610acc57610acc610a45565b50601f01601f191660200190565b600080600060608486031215610aef57600080fd5b8335925060208401356001600160401b03811115610b0c57600080fd5b8401601f81018613610b1d57600080fd5b80356001600160401b03811115610b3657610b36610a45565b8060051b610b4660208201610a83565b91825260208184018101929081019089841115610b6257600080fd5b6020850192505b83831015610c2d5782356001600160401b03811115610b8757600080fd5b85016040818c03601f19011215610b9d57600080fd5b610ba5610a5b565b60208201356001600160401b03811115610bbe57600080fd5b82016020810190603f018d13610bd357600080fd5b8035610be6610be182610ab3565b610a83565b8181528e6020838501011115610bfb57600080fd5b816020840160208301376000602092820183015283526040939093013582840152508352928301929190910190610b69565b96999698505050506040949094013593505050565b60005b83811015610c5d578181015183820152602001610c45565b50506000910152565b60008151808452610c7e816020860160208601610c42565b601f01601f19169290920160200192915050565b8215158152604060208201526000610cad6040830184610c66565b949350505050565b600060208284031215610cc757600080fd5b8135610780816109d0565b634e487b7160e01b600052603260045260246000fd5b828152604081016107806020830184610a15565b600060208284031215610d0e57600080fd5b8151610780816109d0565b6020815260006107806020830184610c66565b600060208284031215610d3e57600080fd5b81516001600160401b03811115610d5457600080fd5b8201601f81018413610d6557600080fd5b8051610d73610be182610ab3565b818152856020838501011115610d8857600080fd5b610d99826020830160208601610c42565b95945050505050565b60008351610db4818460208801610c42565b835190830190610dc8818360208801610c42565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff821663ffffffff8103610e0357610e03610dd1565b60010192915050565b6001600160f81b0319881681526001600160e01b0319878116600183015260058201879052851660258201528351600090610e4e816029850160208901610c42565b6001600160e01b031985166029918401918201528351610e7581602d840160208801610c42565b01602d019998505050505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351610eb8816017850160208801610c42565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610ee9816028840160208801610c42565b01602801949350505050565b808202811582820484141761028357610283610dd1565b8082018082111561028357610283610dd1565b600081610f2e57610f2e610dd1565b50600019019056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa2646970667358221220bdc8612bb25d7d879718d919f8d48a539a8f5aea688047d221856122dc78617064736f6c634300081c0033df8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ba5760003560e01c806301ffc9a7146100bf578063248a9ca3146100e75780632f2ff15d1461010857806336568abe1461011d57806350d17b5e1461013057806375b238fc1461015b57806391d14854146101825780639dca003214610195578063a217fddf146101b6578063a32c2b99146101be578063b24ed308146101df578063d547741f14610206578063f95d71b114610219578063fe89c9701461022c575b600080fd5b6100d26100cd36600461098d565b610252565b60405190151581526020015b60405180910390f35b6100fa6100f53660046109b7565b610289565b6040519081526020016100de565b61011b6101163660046109e5565b61029e565b005b61011b61012b3660046109e5565b6102bf565b600154610143906001600160a01b031681565b6040516001600160a01b0390911681526020016100de565b6100fa7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b6100d26101903660046109e5565b610342565b6001546101a990600160a01b900460ff1681565b6040516100de9190610a37565b6100fa600081565b6101d16101cc366004610ada565b61036b565b6040516100de929190610c92565b6100fa7f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d981565b61011b6102143660046109e5565b6104f6565b61011b610227366004610cb5565b610512565b6100fa7ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c6481565b60006001600160e01b03198216637965db0b60e01b148061028357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60009081526020819052604090206001015490565b6102a782610289565b6102b08161055f565b6102ba838361056c565b505050565b6001600160a01b03811633146103345760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61033e82826105f0565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60006060600061037c868686610655565b905060008160008151811061039357610393610cd2565b01602001516001600160f81b0319166000036103d057507f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d96103f2565b507ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c645b600154604051634746fe8b60e11b81526000916001600160a01b03811691638e8dfd169161042f918691600160a01b900460ff1690600401610ce8565b602060405180830381865afa15801561044c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104709190610cfc565b90506000816001600160a01b031663ec723367856040518263ffffffff1660e01b81526004016104a09190610d19565b600060405180830381865afa1580156104bd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104e59190810190610d2c565b60019a909950975050505050505050565b6104ff82610289565b6105088161055f565b6102ba83836105f0565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261053c8161055f565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6105698133610787565b50565b6105768282610342565b61033e576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556105ac3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6105fa8282610342565b1561033e576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60408051600080825260208201909252606091805b85518110156106ef578486828151811061068657610686610cd2565b602002602001015160200151036106e757828682815181106106aa576106aa610cd2565b6020026020010151600001516040516020016106c7929190610da2565b604051602081830303815290604052925081806106e390610de7565b9250505b60010161066a565b5083600203610701576001935061070e565b8360030361070e57600093505b60006040518060600160405280602b8152602001610f37602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061076590869086908f9087908b9088908f90602001610e0c565b60408051601f19818403018152919052985050505050505050505b9392505050565b6107918282610342565b61033e5761079e816107e0565b6107a98360206107f2565b6040516020016107ba929190610e86565b60408051601f198184030181529082905262461bcd60e51b825261032b91600401610d19565b60606102836001600160a01b03831660145b60606000610801836002610ef5565b61080c906002610f0c565b6001600160401b0381111561082357610823610a45565b6040519080825280601f01601f19166020018201604052801561084d576020820181803683370190505b509050600360fc1b8160008151811061086857610868610cd2565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061089757610897610cd2565b60200101906001600160f81b031916908160001a90535060006108bb846002610ef5565b6108c6906001610f0c565b90505b600181111561093e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106108fa576108fa610cd2565b1a60f81b82828151811061091057610910610cd2565b60200101906001600160f81b031916908160001a90535060049490941c9361093781610f1f565b90506108c9565b5083156107805760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161032b565b60006020828403121561099f57600080fd5b81356001600160e01b03198116811461078057600080fd5b6000602082840312156109c957600080fd5b5035919050565b6001600160a01b038116811461056957600080fd5b600080604083850312156109f857600080fd5b823591506020830135610a0a816109d0565b809150509250929050565b60038110610a3357634e487b7160e01b600052602160045260246000fd5b9052565b602081016102838284610a15565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610a7d57610a7d610a45565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610aab57610aab610a45565b604052919050565b60006001600160401b03821115610acc57610acc610a45565b50601f01601f191660200190565b600080600060608486031215610aef57600080fd5b8335925060208401356001600160401b03811115610b0c57600080fd5b8401601f81018613610b1d57600080fd5b80356001600160401b03811115610b3657610b36610a45565b8060051b610b4660208201610a83565b91825260208184018101929081019089841115610b6257600080fd5b6020850192505b83831015610c2d5782356001600160401b03811115610b8757600080fd5b85016040818c03601f19011215610b9d57600080fd5b610ba5610a5b565b60208201356001600160401b03811115610bbe57600080fd5b82016020810190603f018d13610bd357600080fd5b8035610be6610be182610ab3565b610a83565b8181528e6020838501011115610bfb57600080fd5b816020840160208301376000602092820183015283526040939093013582840152508352928301929190910190610b69565b96999698505050506040949094013593505050565b60005b83811015610c5d578181015183820152602001610c45565b50506000910152565b60008151808452610c7e816020860160208601610c42565b601f01601f19169290920160200192915050565b8215158152604060208201526000610cad6040830184610c66565b949350505050565b600060208284031215610cc757600080fd5b8135610780816109d0565b634e487b7160e01b600052603260045260246000fd5b828152604081016107806020830184610a15565b600060208284031215610d0e57600080fd5b8151610780816109d0565b6020815260006107806020830184610c66565b600060208284031215610d3e57600080fd5b81516001600160401b03811115610d5457600080fd5b8201601f81018413610d6557600080fd5b8051610d73610be182610ab3565b818152856020838501011115610d8857600080fd5b610d99826020830160208601610c42565b95945050505050565b60008351610db4818460208801610c42565b835190830190610dc8818360208801610c42565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff821663ffffffff8103610e0357610e03610dd1565b60010192915050565b6001600160f81b0319881681526001600160e01b0319878116600183015260058201879052851660258201528351600090610e4e816029850160208901610c42565b6001600160e01b031985166029918401918201528351610e7581602d840160208801610c42565b01602d019998505050505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351610eb8816017850160208801610c42565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610ee9816028840160208801610c42565b01602801949350505050565b808202811582820484141761028357610283610dd1565b8082018082111561028357610283610dd1565b600081610f2e57610f2e610dd1565b50600019019056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa2646970667358221220bdc8612bb25d7d879718d919f8d48a539a8f5aea688047d221856122dc78617064736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/rust/lit-core/lit-blockchain-lite/abis/BackupRecovery.json b/rust/lit-core/lit-blockchain-lite/abis/BackupRecovery.json index 773b719c..da1f7d01 100644 --- a/rust/lit-core/lit-blockchain-lite/abis/BackupRecovery.json +++ b/rust/lit-core/lit-blockchain-lite/abis/BackupRecovery.json @@ -837,6 +837,11 @@ "internalType": "bytes", "name": "sessionId", "type": "bytes" + }, + { + "internalType": "string", + "name": "keySetId", + "type": "string" } ], "name": "registerRecoveryKeys", diff --git a/rust/lit-core/lit-blockchain-lite/abis/ContractResolver.json b/rust/lit-core/lit-blockchain-lite/abis/ContractResolver.json index e4bfde80..925faad3 100644 --- a/rust/lit-core/lit-blockchain-lite/abis/ContractResolver.json +++ b/rust/lit-core/lit-blockchain-lite/abis/ContractResolver.json @@ -392,6 +392,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "PUB_KEY_ROUTER_VIEWS_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "RATE_LIMIT_NFT_CONTRACT", @@ -684,8 +697,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5060405161146738038061146783398101604081905261002f916101e0565b610047600080516020611447833981519152336100e9565b61005f600080516020611447833981519152806100f7565b600180600083600281111561007657610076610208565b600281111561008757610087610208565b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece8015816040516100db919061021e565b60405180910390a150610246565b6100f38282610142565b5050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166100f3576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561019c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000602082840312156101f257600080fd5b81516003811061020157600080fd5b9392505050565b634e487b7160e01b600052602160045260246000fd5b602081016003831061024057634e487b7160e01b600052602160045260246000fd5b91905290565b6111f2806102556000396000f3fe608060405234801561001057600080fd5b50600436106101bc5760003560e01c80637cadf69f116100f55780637cadf69f146104175780637d4a03bd1461043e5780637d9d2880146104655780637f90209f1461048c57806385cb1191146104b35780638c1536df146104da5780638deb3893146105015780638e8dfd16146105145780639072f8381461052757806391d148541461054e578063977a807014610561578063a217fddf14610588578063ad1c8a8614610590578063cddcace5146105b7578063d547741f146105de578063da19ddfb146105f1578063df38069314610618578063f8ae93b41461063f57600080fd5b806301ffc9a7146101c157806311ee8ff7146101e957806316f76bbf1461021e5780631785f53c14610245578063219c266a1461025a578063248a9ca3146102815780632668f305146102945780632c0b8bf7146102bb5780632e4885e8146102e25780632f2ff15d1461030957806336568abe1461031c5780633ebf79851461032f5780634216e73a1461037b57806351ad0a80146103a25780635af27f79146103b557806370480275146103dc57806374bc8139146103ef57806375b238fc14610402575b600080fd5b6101d46101cf366004610eb1565b610666565b60405190151581526020015b60405180910390f35b6102107f58a0044e0ecd81025e398bf1815075d1234cbac3749614b0b33a404c2ee2babf81565b6040519081526020016101e0565b6102107ff14f431dadc82e7dbc5e379f71234e5735c9187e4327a7c6ac014d55d1b7727a81565b610258610253366004610ef7565b61069d565b005b6102107f4fd3e0487a0382fb027c77b1ae4c563672c9fb30a74879855f0c86c376cf96ea81565b61021061028f366004610f12565b61074e565b6102107fb1f79813bc7630a52ae948bc99781397e409d0dd3521953bf7d8d7a2db6147f781565b6102107fb7b4fde9944d3c13e9a78835431c33a5084d90a7f0c73def76d7886315fe87b081565b6102107fb931b2719aeb2a65a5035fa0a190bfdc4c8622ce8cbff7a3d1ab42531fb1a91881565b610258610317366004610f2b565b610763565b61025861032a366004610f2b565b610784565b61036361033d366004610f66565b60026020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b0390911681526020016101e0565b6102107f4c41ae454beb6bbbe9be50accc957a3b1536e48b835a86919af981b5244db75581565b6102586103b0366004610f89565b6107fe565b6102107fa2c73732de657ad0f36e0ddbb2710f4b13e8dde46421386bb92d1e179dae4d4d81565b6102586103ea366004610ef7565b610982565b6102586103fd366004610fc5565b6109b2565b61021060008051602061119d83398151915281565b6102107f74845de37cfabd357633214b47fa91ccd19b05b7c5a08ac22c187f811fb62bca81565b6102107f9f35ef3e0c2652a8bb8747d92f407fcd39a7768dacc7f16581c7a71f103e556281565b6102107fc26faedaeeda2fb94a66d786aa89c4a18bb790fa009d9da94a541d92185ca91681565b6102107fc6674f98ba35c01c130e08195dd26c70466037473a068c5aaa470a783d99c16c81565b6102107fae79a935737012d066e7183032692e521ffe1ade2beda267e23e02b1d6e9118781565b6102107faa06d108dbd7bf976b16b7bf5adb29d2d0ef2c385ca8b9d833cc802f33942d7281565b61025861050f366004610fc5565b610a6e565b610363610522366004610f66565b610b12565b6102107f54953c23068b8fc4c0736301b50f10027d6b469327de1fd42841a5072b1bcebe81565b6101d461055c366004610f2b565b610b68565b6102107f27d764ea2a4a3865434bbf4a391110149644be31448f3479fd15b4438875576581565b610210600081565b6102107f3a68dbfd8bbb64015c42bc131c388dea7965e28c1004d09b39f59500c3a763ec81565b6102107f0f27b9e46b89c5c742e28094dcefe5e946c3b98f0fbed87d9fcf5b10ba9684ec81565b6102586105ec366004610f2b565b610b91565b6102107f080909c18c958ce5a2d36481697824e477319323d03154ceba3b78f28a61887b81565b6102107fb4bf999b68d8085dbbf7a0ec2f5a2d660873935bdf1ed08eb421ac6dcbc0036281565b6102107fdd5b9b8a5e8e01f2962ed7e983d58fe32e1f66aa88dd7ab30770fa9b77da724381565b60006001600160e01b03198216637965db0b60e01b148061069757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008051602061119d8339815191526106b581610bad565b336001600160a01b038316036107325760405162461bcd60e51b815260206004820152603760248201527f43616e6e6f742072656d6f76652073656c662061732061646d696e2e202048616044820152763b32903a3432903732bb9030b236b4b71032379034ba1760491b60648201526084015b60405180910390fd5b61074a60008051602061119d83398151915283610bba565b5050565b60009081526020819052604090206001015490565b61076c8261074e565b61077581610bad565b61077f8383610c1f565b505050565b6001600160a01b03811633146107f45760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610729565b61074a8282610bba565b61081660008051602061119d83398151915233610b68565b610833576040516364487c2560e11b815260040160405180910390fd5b6001600083600281111561084957610849610fe0565b600281111561085a5761085a610fe0565b815260208101919091526040016000205460ff1615156001146108d75760405162461bcd60e51b815260206004820152602f60248201527f5468652070726f766964656420456e76206973206e6f742076616c696420666f60448201526e1c881d1a1a5cc818dbdb9d1c9858dd608a1b6064820152608401610729565b806002600085815260200190815260200160002060008460028111156108ff576108ff610fe0565b600281111561091057610910610fe0565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f33f014890f109229bbcf8dd47204c153a2c0ff1c572a61de220d10336530f53d83838360405161097593929190611018565b60405180910390a1505050565b60008051602061119d83398151915261099a81610bad565b61074a60008051602061119d83398151915283610c1f565b6109ca60008051602061119d83398151915233610b68565b6109e7576040516364487c2560e11b815260040160405180910390fd5b60018060008360028111156109fe576109fe610fe0565b6002811115610a0f57610a0f610fe0565b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece801581604051610a639190611045565b60405180910390a150565b610a8660008051602061119d83398151915233610b68565b610aa3576040516364487c2560e11b815260040160405180910390fd5b60016000826002811115610ab957610ab9610fe0565b6002811115610aca57610aca610fe0565b815260208101919091526040908101600020805460ff19169055517f3f178f17dae6caf8ca09c4857502baf7744e8597de42d6596476fe9e06b8ad4790610a63908390611045565b600082815260026020819052604082209082908490811115610b3657610b36610fe0565b6002811115610b4757610b47610fe0565b81526020810191909152604001600020546001600160a01b03169392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610b9a8261074e565b610ba381610bad565b61077f8383610bba565b610bb78133610ca3565b50565b610bc48282610b68565b1561074a576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610c298282610b68565b61074a576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610c5f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610cad8282610b68565b61074a57610cba81610cfc565b610cc5836020610d0e565b604051602001610cd6929190611077565b60408051601f198184030181529082905262461bcd60e51b8252610729916004016110e6565b60606106976001600160a01b03831660145b60606000610d1d83600261112f565b610d28906002611146565b67ffffffffffffffff811115610d4057610d40611159565b6040519080825280601f01601f191660200182016040528015610d6a576020820181803683370190505b509050600360fc1b81600081518110610d8557610d8561116f565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610db457610db461116f565b60200101906001600160f81b031916908160001a9053506000610dd884600261112f565b610de3906001611146565b90505b6001811115610e5b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610e1757610e1761116f565b1a60f81b828281518110610e2d57610e2d61116f565b60200101906001600160f81b031916908160001a90535060049490941c93610e5481611185565b9050610de6565b508315610eaa5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610729565b9392505050565b600060208284031215610ec357600080fd5b81356001600160e01b031981168114610eaa57600080fd5b80356001600160a01b0381168114610ef257600080fd5b919050565b600060208284031215610f0957600080fd5b610eaa82610edb565b600060208284031215610f2457600080fd5b5035919050565b60008060408385031215610f3e57600080fd5b82359150610f4e60208401610edb565b90509250929050565b803560038110610ef257600080fd5b60008060408385031215610f7957600080fd5b82359150610f4e60208401610f57565b600080600060608486031215610f9e57600080fd5b83359250610fae60208501610f57565b9150610fbc60408501610edb565b90509250925092565b600060208284031215610fd757600080fd5b610eaa82610f57565b634e487b7160e01b600052602160045260246000fd5b6003811061101457634e487b7160e01b600052602160045260246000fd5b9052565b8381526060810161102c6020830185610ff6565b6001600160a01b03929092166040919091015292915050565b602081016106978284610ff6565b60005b8381101561106e578181015183820152602001611056565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8152600083516110a9816017850160208801611053565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516110da816028840160208801611053565b01602801949350505050565b6020815260008251806020840152611105816040850160208701611053565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761069757610697611119565b8082018082111561069757610697611119565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008161119457611194611119565b50600019019056fedf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a2646970667358221220bcfb5aa3251ddf33a8736c9689bd99cea1df5baa0fac387c556913725825c97264736f6c634300081c0033df8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101bc5760003560e01c80637cadf69f116100f55780637cadf69f146104175780637d4a03bd1461043e5780637d9d2880146104655780637f90209f1461048c57806385cb1191146104b35780638c1536df146104da5780638deb3893146105015780638e8dfd16146105145780639072f8381461052757806391d148541461054e578063977a807014610561578063a217fddf14610588578063ad1c8a8614610590578063cddcace5146105b7578063d547741f146105de578063da19ddfb146105f1578063df38069314610618578063f8ae93b41461063f57600080fd5b806301ffc9a7146101c157806311ee8ff7146101e957806316f76bbf1461021e5780631785f53c14610245578063219c266a1461025a578063248a9ca3146102815780632668f305146102945780632c0b8bf7146102bb5780632e4885e8146102e25780632f2ff15d1461030957806336568abe1461031c5780633ebf79851461032f5780634216e73a1461037b57806351ad0a80146103a25780635af27f79146103b557806370480275146103dc57806374bc8139146103ef57806375b238fc14610402575b600080fd5b6101d46101cf366004610eb1565b610666565b60405190151581526020015b60405180910390f35b6102107f58a0044e0ecd81025e398bf1815075d1234cbac3749614b0b33a404c2ee2babf81565b6040519081526020016101e0565b6102107ff14f431dadc82e7dbc5e379f71234e5735c9187e4327a7c6ac014d55d1b7727a81565b610258610253366004610ef7565b61069d565b005b6102107f4fd3e0487a0382fb027c77b1ae4c563672c9fb30a74879855f0c86c376cf96ea81565b61021061028f366004610f12565b61074e565b6102107fb1f79813bc7630a52ae948bc99781397e409d0dd3521953bf7d8d7a2db6147f781565b6102107fb7b4fde9944d3c13e9a78835431c33a5084d90a7f0c73def76d7886315fe87b081565b6102107fb931b2719aeb2a65a5035fa0a190bfdc4c8622ce8cbff7a3d1ab42531fb1a91881565b610258610317366004610f2b565b610763565b61025861032a366004610f2b565b610784565b61036361033d366004610f66565b60026020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b0390911681526020016101e0565b6102107f4c41ae454beb6bbbe9be50accc957a3b1536e48b835a86919af981b5244db75581565b6102586103b0366004610f89565b6107fe565b6102107fa2c73732de657ad0f36e0ddbb2710f4b13e8dde46421386bb92d1e179dae4d4d81565b6102586103ea366004610ef7565b610982565b6102586103fd366004610fc5565b6109b2565b61021060008051602061119d83398151915281565b6102107f74845de37cfabd357633214b47fa91ccd19b05b7c5a08ac22c187f811fb62bca81565b6102107f9f35ef3e0c2652a8bb8747d92f407fcd39a7768dacc7f16581c7a71f103e556281565b6102107fc26faedaeeda2fb94a66d786aa89c4a18bb790fa009d9da94a541d92185ca91681565b6102107fc6674f98ba35c01c130e08195dd26c70466037473a068c5aaa470a783d99c16c81565b6102107fae79a935737012d066e7183032692e521ffe1ade2beda267e23e02b1d6e9118781565b6102107faa06d108dbd7bf976b16b7bf5adb29d2d0ef2c385ca8b9d833cc802f33942d7281565b61025861050f366004610fc5565b610a6e565b610363610522366004610f66565b610b12565b6102107f54953c23068b8fc4c0736301b50f10027d6b469327de1fd42841a5072b1bcebe81565b6101d461055c366004610f2b565b610b68565b6102107f27d764ea2a4a3865434bbf4a391110149644be31448f3479fd15b4438875576581565b610210600081565b6102107f3a68dbfd8bbb64015c42bc131c388dea7965e28c1004d09b39f59500c3a763ec81565b6102107f0f27b9e46b89c5c742e28094dcefe5e946c3b98f0fbed87d9fcf5b10ba9684ec81565b6102586105ec366004610f2b565b610b91565b6102107f080909c18c958ce5a2d36481697824e477319323d03154ceba3b78f28a61887b81565b6102107fb4bf999b68d8085dbbf7a0ec2f5a2d660873935bdf1ed08eb421ac6dcbc0036281565b6102107fdd5b9b8a5e8e01f2962ed7e983d58fe32e1f66aa88dd7ab30770fa9b77da724381565b60006001600160e01b03198216637965db0b60e01b148061069757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008051602061119d8339815191526106b581610bad565b336001600160a01b038316036107325760405162461bcd60e51b815260206004820152603760248201527f43616e6e6f742072656d6f76652073656c662061732061646d696e2e202048616044820152763b32903a3432903732bb9030b236b4b71032379034ba1760491b60648201526084015b60405180910390fd5b61074a60008051602061119d83398151915283610bba565b5050565b60009081526020819052604090206001015490565b61076c8261074e565b61077581610bad565b61077f8383610c1f565b505050565b6001600160a01b03811633146107f45760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610729565b61074a8282610bba565b61081660008051602061119d83398151915233610b68565b610833576040516364487c2560e11b815260040160405180910390fd5b6001600083600281111561084957610849610fe0565b600281111561085a5761085a610fe0565b815260208101919091526040016000205460ff1615156001146108d75760405162461bcd60e51b815260206004820152602f60248201527f5468652070726f766964656420456e76206973206e6f742076616c696420666f60448201526e1c881d1a1a5cc818dbdb9d1c9858dd608a1b6064820152608401610729565b806002600085815260200190815260200160002060008460028111156108ff576108ff610fe0565b600281111561091057610910610fe0565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f33f014890f109229bbcf8dd47204c153a2c0ff1c572a61de220d10336530f53d83838360405161097593929190611018565b60405180910390a1505050565b60008051602061119d83398151915261099a81610bad565b61074a60008051602061119d83398151915283610c1f565b6109ca60008051602061119d83398151915233610b68565b6109e7576040516364487c2560e11b815260040160405180910390fd5b60018060008360028111156109fe576109fe610fe0565b6002811115610a0f57610a0f610fe0565b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece801581604051610a639190611045565b60405180910390a150565b610a8660008051602061119d83398151915233610b68565b610aa3576040516364487c2560e11b815260040160405180910390fd5b60016000826002811115610ab957610ab9610fe0565b6002811115610aca57610aca610fe0565b815260208101919091526040908101600020805460ff19169055517f3f178f17dae6caf8ca09c4857502baf7744e8597de42d6596476fe9e06b8ad4790610a63908390611045565b600082815260026020819052604082209082908490811115610b3657610b36610fe0565b6002811115610b4757610b47610fe0565b81526020810191909152604001600020546001600160a01b03169392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610b9a8261074e565b610ba381610bad565b61077f8383610bba565b610bb78133610ca3565b50565b610bc48282610b68565b1561074a576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610c298282610b68565b61074a576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610c5f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610cad8282610b68565b61074a57610cba81610cfc565b610cc5836020610d0e565b604051602001610cd6929190611077565b60408051601f198184030181529082905262461bcd60e51b8252610729916004016110e6565b60606106976001600160a01b03831660145b60606000610d1d83600261112f565b610d28906002611146565b67ffffffffffffffff811115610d4057610d40611159565b6040519080825280601f01601f191660200182016040528015610d6a576020820181803683370190505b509050600360fc1b81600081518110610d8557610d8561116f565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610db457610db461116f565b60200101906001600160f81b031916908160001a9053506000610dd884600261112f565b610de3906001611146565b90505b6001811115610e5b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610e1757610e1761116f565b1a60f81b828281518110610e2d57610e2d61116f565b60200101906001600160f81b031916908160001a90535060049490941c93610e5481611185565b9050610de6565b508315610eaa5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610729565b9392505050565b600060208284031215610ec357600080fd5b81356001600160e01b031981168114610eaa57600080fd5b80356001600160a01b0381168114610ef257600080fd5b919050565b600060208284031215610f0957600080fd5b610eaa82610edb565b600060208284031215610f2457600080fd5b5035919050565b60008060408385031215610f3e57600080fd5b82359150610f4e60208401610edb565b90509250929050565b803560038110610ef257600080fd5b60008060408385031215610f7957600080fd5b82359150610f4e60208401610f57565b600080600060608486031215610f9e57600080fd5b83359250610fae60208501610f57565b9150610fbc60408501610edb565b90509250925092565b600060208284031215610fd757600080fd5b610eaa82610f57565b634e487b7160e01b600052602160045260246000fd5b6003811061101457634e487b7160e01b600052602160045260246000fd5b9052565b8381526060810161102c6020830185610ff6565b6001600160a01b03929092166040919091015292915050565b602081016106978284610ff6565b60005b8381101561106e578181015183820152602001611056565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8152600083516110a9816017850160208801611053565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516110da816028840160208801611053565b01602801949350505050565b6020815260008251806020840152611105816040850160208701611053565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761069757610697611119565b8082018082111561069757610697611119565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008161119457611194611119565b50600019019056fedf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a2646970667358221220bcfb5aa3251ddf33a8736c9689bd99cea1df5baa0fac387c556913725825c97264736f6c634300081c0033", + "bytecode": "0x608060405234801561001057600080fd5b5060405161149938038061149983398101604081905261002f916101e0565b610047600080516020611479833981519152336100e9565b61005f600080516020611479833981519152806100f7565b600180600083600281111561007657610076610208565b600281111561008757610087610208565b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece8015816040516100db919061021e565b60405180910390a150610246565b6100f38282610142565b5050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166100f3576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561019c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000602082840312156101f257600080fd5b81516003811061020157600080fd5b9392505050565b634e487b7160e01b600052602160045260246000fd5b602081016003831061024057634e487b7160e01b600052602160045260246000fd5b91905290565b611224806102556000396000f3fe608060405234801561001057600080fd5b50600436106101c75760003560e01c80637cadf69f116101005780637cadf69f146104225780637d4a03bd146104495780637d9d2880146104705780637f90209f1461049757806381d49578146104be57806385cb1191146104e55780638c1536df1461050c5780638deb3893146105335780638e8dfd16146105465780639072f8381461055957806391d1485414610580578063977a807014610593578063a217fddf146105ba578063ad1c8a86146105c2578063cddcace5146105e9578063d547741f14610610578063da19ddfb14610623578063df3806931461064a578063f8ae93b41461067157600080fd5b806301ffc9a7146101cc57806311ee8ff7146101f457806316f76bbf146102295780631785f53c14610250578063219c266a14610265578063248a9ca31461028c5780632668f3051461029f5780632c0b8bf7146102c65780632e4885e8146102ed5780632f2ff15d1461031457806336568abe146103275780633ebf79851461033a5780634216e73a1461038657806351ad0a80146103ad5780635af27f79146103c057806370480275146103e757806374bc8139146103fa57806375b238fc1461040d575b600080fd5b6101df6101da366004610ee3565b610698565b60405190151581526020015b60405180910390f35b61021b7f58a0044e0ecd81025e398bf1815075d1234cbac3749614b0b33a404c2ee2babf81565b6040519081526020016101eb565b61021b7ff14f431dadc82e7dbc5e379f71234e5735c9187e4327a7c6ac014d55d1b7727a81565b61026361025e366004610f29565b6106cf565b005b61021b7f4fd3e0487a0382fb027c77b1ae4c563672c9fb30a74879855f0c86c376cf96ea81565b61021b61029a366004610f44565b610780565b61021b7fb1f79813bc7630a52ae948bc99781397e409d0dd3521953bf7d8d7a2db6147f781565b61021b7fb7b4fde9944d3c13e9a78835431c33a5084d90a7f0c73def76d7886315fe87b081565b61021b7fb931b2719aeb2a65a5035fa0a190bfdc4c8622ce8cbff7a3d1ab42531fb1a91881565b610263610322366004610f5d565b610795565b610263610335366004610f5d565b6107b6565b61036e610348366004610f98565b60026020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b0390911681526020016101eb565b61021b7f4c41ae454beb6bbbe9be50accc957a3b1536e48b835a86919af981b5244db75581565b6102636103bb366004610fbb565b610830565b61021b7fa2c73732de657ad0f36e0ddbb2710f4b13e8dde46421386bb92d1e179dae4d4d81565b6102636103f5366004610f29565b6109b4565b610263610408366004610ff7565b6109e4565b61021b6000805160206111cf83398151915281565b61021b7f74845de37cfabd357633214b47fa91ccd19b05b7c5a08ac22c187f811fb62bca81565b61021b7f9f35ef3e0c2652a8bb8747d92f407fcd39a7768dacc7f16581c7a71f103e556281565b61021b7fc26faedaeeda2fb94a66d786aa89c4a18bb790fa009d9da94a541d92185ca91681565b61021b7fc6674f98ba35c01c130e08195dd26c70466037473a068c5aaa470a783d99c16c81565b61021b7f57496de430028f322c592b0f735110eb34f1ae8184a94bc51d40b0847b54469b81565b61021b7fae79a935737012d066e7183032692e521ffe1ade2beda267e23e02b1d6e9118781565b61021b7faa06d108dbd7bf976b16b7bf5adb29d2d0ef2c385ca8b9d833cc802f33942d7281565b610263610541366004610ff7565b610aa0565b61036e610554366004610f98565b610b44565b61021b7f54953c23068b8fc4c0736301b50f10027d6b469327de1fd42841a5072b1bcebe81565b6101df61058e366004610f5d565b610b9a565b61021b7f27d764ea2a4a3865434bbf4a391110149644be31448f3479fd15b4438875576581565b61021b600081565b61021b7f3a68dbfd8bbb64015c42bc131c388dea7965e28c1004d09b39f59500c3a763ec81565b61021b7f0f27b9e46b89c5c742e28094dcefe5e946c3b98f0fbed87d9fcf5b10ba9684ec81565b61026361061e366004610f5d565b610bc3565b61021b7f080909c18c958ce5a2d36481697824e477319323d03154ceba3b78f28a61887b81565b61021b7fb4bf999b68d8085dbbf7a0ec2f5a2d660873935bdf1ed08eb421ac6dcbc0036281565b61021b7fdd5b9b8a5e8e01f2962ed7e983d58fe32e1f66aa88dd7ab30770fa9b77da724381565b60006001600160e01b03198216637965db0b60e01b14806106c957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000805160206111cf8339815191526106e781610bdf565b336001600160a01b038316036107645760405162461bcd60e51b815260206004820152603760248201527f43616e6e6f742072656d6f76652073656c662061732061646d696e2e202048616044820152763b32903a3432903732bb9030b236b4b71032379034ba1760491b60648201526084015b60405180910390fd5b61077c6000805160206111cf83398151915283610bec565b5050565b60009081526020819052604090206001015490565b61079e82610780565b6107a781610bdf565b6107b18383610c51565b505050565b6001600160a01b03811633146108265760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161075b565b61077c8282610bec565b6108486000805160206111cf83398151915233610b9a565b610865576040516364487c2560e11b815260040160405180910390fd5b6001600083600281111561087b5761087b611012565b600281111561088c5761088c611012565b815260208101919091526040016000205460ff1615156001146109095760405162461bcd60e51b815260206004820152602f60248201527f5468652070726f766964656420456e76206973206e6f742076616c696420666f60448201526e1c881d1a1a5cc818dbdb9d1c9858dd608a1b606482015260840161075b565b8060026000858152602001908152602001600020600084600281111561093157610931611012565b600281111561094257610942611012565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f33f014890f109229bbcf8dd47204c153a2c0ff1c572a61de220d10336530f53d8383836040516109a79392919061104a565b60405180910390a1505050565b6000805160206111cf8339815191526109cc81610bdf565b61077c6000805160206111cf83398151915283610c51565b6109fc6000805160206111cf83398151915233610b9a565b610a19576040516364487c2560e11b815260040160405180910390fd5b6001806000836002811115610a3057610a30611012565b6002811115610a4157610a41611012565b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece801581604051610a959190611077565b60405180910390a150565b610ab86000805160206111cf83398151915233610b9a565b610ad5576040516364487c2560e11b815260040160405180910390fd5b60016000826002811115610aeb57610aeb611012565b6002811115610afc57610afc611012565b815260208101919091526040908101600020805460ff19169055517f3f178f17dae6caf8ca09c4857502baf7744e8597de42d6596476fe9e06b8ad4790610a95908390611077565b600082815260026020819052604082209082908490811115610b6857610b68611012565b6002811115610b7957610b79611012565b81526020810191909152604001600020546001600160a01b03169392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610bcc82610780565b610bd581610bdf565b6107b18383610bec565b610be98133610cd5565b50565b610bf68282610b9a565b1561077c576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610c5b8282610b9a565b61077c576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610c913390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610cdf8282610b9a565b61077c57610cec81610d2e565b610cf7836020610d40565b604051602001610d089291906110a9565b60408051601f198184030181529082905262461bcd60e51b825261075b91600401611118565b60606106c96001600160a01b03831660145b60606000610d4f836002611161565b610d5a906002611178565b67ffffffffffffffff811115610d7257610d7261118b565b6040519080825280601f01601f191660200182016040528015610d9c576020820181803683370190505b509050600360fc1b81600081518110610db757610db76111a1565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610de657610de66111a1565b60200101906001600160f81b031916908160001a9053506000610e0a846002611161565b610e15906001611178565b90505b6001811115610e8d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610e4957610e496111a1565b1a60f81b828281518110610e5f57610e5f6111a1565b60200101906001600160f81b031916908160001a90535060049490941c93610e86816111b7565b9050610e18565b508315610edc5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161075b565b9392505050565b600060208284031215610ef557600080fd5b81356001600160e01b031981168114610edc57600080fd5b80356001600160a01b0381168114610f2457600080fd5b919050565b600060208284031215610f3b57600080fd5b610edc82610f0d565b600060208284031215610f5657600080fd5b5035919050565b60008060408385031215610f7057600080fd5b82359150610f8060208401610f0d565b90509250929050565b803560038110610f2457600080fd5b60008060408385031215610fab57600080fd5b82359150610f8060208401610f89565b600080600060608486031215610fd057600080fd5b83359250610fe060208501610f89565b9150610fee60408501610f0d565b90509250925092565b60006020828403121561100957600080fd5b610edc82610f89565b634e487b7160e01b600052602160045260246000fd5b6003811061104657634e487b7160e01b600052602160045260246000fd5b9052565b8381526060810161105e6020830185611028565b6001600160a01b03929092166040919091015292915050565b602081016106c98284611028565b60005b838110156110a0578181015183820152602001611088565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8152600083516110db816017850160208801611085565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161110c816028840160208801611085565b01602801949350505050565b6020815260008251806020840152611137816040850160208701611085565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106c9576106c961114b565b808201808211156106c9576106c961114b565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816111c6576111c661114b565b50600019019056fedf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a264697066735822122065276870aecc95d0026a39a8a08dc1b9a726496c4d88b6456f2ac640543c468664736f6c634300081c0033df8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c75760003560e01c80637cadf69f116101005780637cadf69f146104225780637d4a03bd146104495780637d9d2880146104705780637f90209f1461049757806381d49578146104be57806385cb1191146104e55780638c1536df1461050c5780638deb3893146105335780638e8dfd16146105465780639072f8381461055957806391d1485414610580578063977a807014610593578063a217fddf146105ba578063ad1c8a86146105c2578063cddcace5146105e9578063d547741f14610610578063da19ddfb14610623578063df3806931461064a578063f8ae93b41461067157600080fd5b806301ffc9a7146101cc57806311ee8ff7146101f457806316f76bbf146102295780631785f53c14610250578063219c266a14610265578063248a9ca31461028c5780632668f3051461029f5780632c0b8bf7146102c65780632e4885e8146102ed5780632f2ff15d1461031457806336568abe146103275780633ebf79851461033a5780634216e73a1461038657806351ad0a80146103ad5780635af27f79146103c057806370480275146103e757806374bc8139146103fa57806375b238fc1461040d575b600080fd5b6101df6101da366004610ee3565b610698565b60405190151581526020015b60405180910390f35b61021b7f58a0044e0ecd81025e398bf1815075d1234cbac3749614b0b33a404c2ee2babf81565b6040519081526020016101eb565b61021b7ff14f431dadc82e7dbc5e379f71234e5735c9187e4327a7c6ac014d55d1b7727a81565b61026361025e366004610f29565b6106cf565b005b61021b7f4fd3e0487a0382fb027c77b1ae4c563672c9fb30a74879855f0c86c376cf96ea81565b61021b61029a366004610f44565b610780565b61021b7fb1f79813bc7630a52ae948bc99781397e409d0dd3521953bf7d8d7a2db6147f781565b61021b7fb7b4fde9944d3c13e9a78835431c33a5084d90a7f0c73def76d7886315fe87b081565b61021b7fb931b2719aeb2a65a5035fa0a190bfdc4c8622ce8cbff7a3d1ab42531fb1a91881565b610263610322366004610f5d565b610795565b610263610335366004610f5d565b6107b6565b61036e610348366004610f98565b60026020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b0390911681526020016101eb565b61021b7f4c41ae454beb6bbbe9be50accc957a3b1536e48b835a86919af981b5244db75581565b6102636103bb366004610fbb565b610830565b61021b7fa2c73732de657ad0f36e0ddbb2710f4b13e8dde46421386bb92d1e179dae4d4d81565b6102636103f5366004610f29565b6109b4565b610263610408366004610ff7565b6109e4565b61021b6000805160206111cf83398151915281565b61021b7f74845de37cfabd357633214b47fa91ccd19b05b7c5a08ac22c187f811fb62bca81565b61021b7f9f35ef3e0c2652a8bb8747d92f407fcd39a7768dacc7f16581c7a71f103e556281565b61021b7fc26faedaeeda2fb94a66d786aa89c4a18bb790fa009d9da94a541d92185ca91681565b61021b7fc6674f98ba35c01c130e08195dd26c70466037473a068c5aaa470a783d99c16c81565b61021b7f57496de430028f322c592b0f735110eb34f1ae8184a94bc51d40b0847b54469b81565b61021b7fae79a935737012d066e7183032692e521ffe1ade2beda267e23e02b1d6e9118781565b61021b7faa06d108dbd7bf976b16b7bf5adb29d2d0ef2c385ca8b9d833cc802f33942d7281565b610263610541366004610ff7565b610aa0565b61036e610554366004610f98565b610b44565b61021b7f54953c23068b8fc4c0736301b50f10027d6b469327de1fd42841a5072b1bcebe81565b6101df61058e366004610f5d565b610b9a565b61021b7f27d764ea2a4a3865434bbf4a391110149644be31448f3479fd15b4438875576581565b61021b600081565b61021b7f3a68dbfd8bbb64015c42bc131c388dea7965e28c1004d09b39f59500c3a763ec81565b61021b7f0f27b9e46b89c5c742e28094dcefe5e946c3b98f0fbed87d9fcf5b10ba9684ec81565b61026361061e366004610f5d565b610bc3565b61021b7f080909c18c958ce5a2d36481697824e477319323d03154ceba3b78f28a61887b81565b61021b7fb4bf999b68d8085dbbf7a0ec2f5a2d660873935bdf1ed08eb421ac6dcbc0036281565b61021b7fdd5b9b8a5e8e01f2962ed7e983d58fe32e1f66aa88dd7ab30770fa9b77da724381565b60006001600160e01b03198216637965db0b60e01b14806106c957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000805160206111cf8339815191526106e781610bdf565b336001600160a01b038316036107645760405162461bcd60e51b815260206004820152603760248201527f43616e6e6f742072656d6f76652073656c662061732061646d696e2e202048616044820152763b32903a3432903732bb9030b236b4b71032379034ba1760491b60648201526084015b60405180910390fd5b61077c6000805160206111cf83398151915283610bec565b5050565b60009081526020819052604090206001015490565b61079e82610780565b6107a781610bdf565b6107b18383610c51565b505050565b6001600160a01b03811633146108265760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161075b565b61077c8282610bec565b6108486000805160206111cf83398151915233610b9a565b610865576040516364487c2560e11b815260040160405180910390fd5b6001600083600281111561087b5761087b611012565b600281111561088c5761088c611012565b815260208101919091526040016000205460ff1615156001146109095760405162461bcd60e51b815260206004820152602f60248201527f5468652070726f766964656420456e76206973206e6f742076616c696420666f60448201526e1c881d1a1a5cc818dbdb9d1c9858dd608a1b606482015260840161075b565b8060026000858152602001908152602001600020600084600281111561093157610931611012565b600281111561094257610942611012565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f33f014890f109229bbcf8dd47204c153a2c0ff1c572a61de220d10336530f53d8383836040516109a79392919061104a565b60405180910390a1505050565b6000805160206111cf8339815191526109cc81610bdf565b61077c6000805160206111cf83398151915283610c51565b6109fc6000805160206111cf83398151915233610b9a565b610a19576040516364487c2560e11b815260040160405180910390fd5b6001806000836002811115610a3057610a30611012565b6002811115610a4157610a41611012565b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece801581604051610a959190611077565b60405180910390a150565b610ab86000805160206111cf83398151915233610b9a565b610ad5576040516364487c2560e11b815260040160405180910390fd5b60016000826002811115610aeb57610aeb611012565b6002811115610afc57610afc611012565b815260208101919091526040908101600020805460ff19169055517f3f178f17dae6caf8ca09c4857502baf7744e8597de42d6596476fe9e06b8ad4790610a95908390611077565b600082815260026020819052604082209082908490811115610b6857610b68611012565b6002811115610b7957610b79611012565b81526020810191909152604001600020546001600160a01b03169392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610bcc82610780565b610bd581610bdf565b6107b18383610bec565b610be98133610cd5565b50565b610bf68282610b9a565b1561077c576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610c5b8282610b9a565b61077c576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610c913390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610cdf8282610b9a565b61077c57610cec81610d2e565b610cf7836020610d40565b604051602001610d089291906110a9565b60408051601f198184030181529082905262461bcd60e51b825261075b91600401611118565b60606106c96001600160a01b03831660145b60606000610d4f836002611161565b610d5a906002611178565b67ffffffffffffffff811115610d7257610d7261118b565b6040519080825280601f01601f191660200182016040528015610d9c576020820181803683370190505b509050600360fc1b81600081518110610db757610db76111a1565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610de657610de66111a1565b60200101906001600160f81b031916908160001a9053506000610e0a846002611161565b610e15906001611178565b90505b6001811115610e8d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610e4957610e496111a1565b1a60f81b828281518110610e5f57610e5f6111a1565b60200101906001600160f81b031916908160001a90535060049490941c93610e86816111b7565b9050610e18565b508315610edc5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161075b565b9392505050565b600060208284031215610ef557600080fd5b81356001600160e01b031981168114610edc57600080fd5b80356001600160a01b0381168114610f2457600080fd5b919050565b600060208284031215610f3b57600080fd5b610edc82610f0d565b600060208284031215610f5657600080fd5b5035919050565b60008060408385031215610f7057600080fd5b82359150610f8060208401610f0d565b90509250929050565b803560038110610f2457600080fd5b60008060408385031215610fab57600080fd5b82359150610f8060208401610f89565b600080600060608486031215610fd057600080fd5b83359250610fe060208501610f89565b9150610fee60408501610f0d565b90509250925092565b60006020828403121561100957600080fd5b610edc82610f89565b634e487b7160e01b600052602160045260246000fd5b6003811061104657634e487b7160e01b600052602160045260246000fd5b9052565b8381526060810161105e6020830185611028565b6001600160a01b03929092166040919091015292915050565b602081016106c98284611028565b60005b838110156110a0578181015183820152602001611088565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8152600083516110db816017850160208801611085565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161110c816028840160208801611085565b01602801949350505050565b6020815260008251806020840152611137816040850160208701611085565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106c9576106c961114b565b808201808211156106c9576106c961114b565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816111c6576111c661114b565b50600019019056fedf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a264697066735822122065276870aecc95d0026a39a8a08dc1b9a726496c4d88b6456f2ac640543c468664736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/rust/lit-core/lit-blockchain-lite/abis/KeyDeriver.json b/rust/lit-core/lit-blockchain-lite/abis/KeyDeriver.json index ce2864be..54ba6738 100644 --- a/rust/lit-core/lit-blockchain-lite/abis/KeyDeriver.json +++ b/rust/lit-core/lit-blockchain-lite/abis/KeyDeriver.json @@ -68,8 +68,8 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600f57600080fd5b506105ee8061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806362e4c4641461003b578063a32c2b9914610060575b600080fd5b61004360f581565b6040516001600160a01b0390911681526020015b60405180910390f35b61007361006e36600461029e565b610081565b604051610057929190610443565b600060606000610092868686610100565b905060008060f56001600160a01b0316836040516100b0919061047f565b600060405180830381855afa9150503d80600081146100eb576040519150601f19603f3d011682016040523d82523d6000602084013e6100f0565b606091505b5090999098509650505050505050565b60408051600080825260208201909252606091805b855181101561019a57848682815181106101315761013161049b565b6020026020010151602001510361019257828682815181106101555761015561049b565b6020026020010151600001516040516020016101729291906104b1565b6040516020818303038152906040529250818061018e906104e0565b9250505b600101610115565b50836002036101ac57600193506101b9565b836003036101b957600093505b60006040518060600160405280602b815260200161058e602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061021090869086908f9087908b9088908f90602001610513565b60408051808303601f190181529190529c9b505050505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561026857610268610230565b60405290565b604051601f8201601f191681016001600160401b038111828210171561029657610296610230565b604052919050565b6000806000606084860312156102b357600080fd5b8335925060208401356001600160401b038111156102d057600080fd5b8401601f810186136102e157600080fd5b80356001600160401b038111156102fa576102fa610230565b8060051b61030a6020820161026e565b9182526020818401810192908101908984111561032657600080fd5b6020850192505b8383101561040a5782356001600160401b0381111561034b57600080fd5b85016040818c03601f1901121561036157600080fd5b610369610246565b60208201356001600160401b0381111561038257600080fd5b82016020810190603f018d1361039757600080fd5b80356001600160401b038111156103b0576103b0610230565b6103c3601f8201601f191660200161026e565b8181528e60208385010111156103d857600080fd5b81602084016020830137600060209282018301528352604093909301358284015250835292830192919091019061032d565b96999698505050506040949094013593505050565b60005b8381101561043a578181015183820152602001610422565b50506000910152565b8215158152604060208201526000825180604084015261046a81606085016020870161041f565b601f01601f1916919091016060019392505050565b6000825161049181846020870161041f565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b600083516104c381846020880161041f565b8351908301906104d781836020880161041f565b01949350505050565b600063ffffffff821663ffffffff810361050a57634e487b7160e01b600052601160045260246000fd5b60010192915050565b6001600160f81b0319881681526001600160e01b031987811660018301526005820187905285166025820152835160009061055581602985016020890161041f565b6001600160e01b03198516602991840191820152835161057c81602d84016020880161041f565b01602d01999850505050505050505056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa2646970667358221220b3f5d6acd5a7371344cacab05e607079ebf476b46d8b170419612f80e7a8ac9564736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806362e4c4641461003b578063a32c2b9914610060575b600080fd5b61004360f581565b6040516001600160a01b0390911681526020015b60405180910390f35b61007361006e36600461029e565b610081565b604051610057929190610443565b600060606000610092868686610100565b905060008060f56001600160a01b0316836040516100b0919061047f565b600060405180830381855afa9150503d80600081146100eb576040519150601f19603f3d011682016040523d82523d6000602084013e6100f0565b606091505b5090999098509650505050505050565b60408051600080825260208201909252606091805b855181101561019a57848682815181106101315761013161049b565b6020026020010151602001510361019257828682815181106101555761015561049b565b6020026020010151600001516040516020016101729291906104b1565b6040516020818303038152906040529250818061018e906104e0565b9250505b600101610115565b50836002036101ac57600193506101b9565b836003036101b957600093505b60006040518060600160405280602b815260200161058e602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061021090869086908f9087908b9088908f90602001610513565b60408051808303601f190181529190529c9b505050505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561026857610268610230565b60405290565b604051601f8201601f191681016001600160401b038111828210171561029657610296610230565b604052919050565b6000806000606084860312156102b357600080fd5b8335925060208401356001600160401b038111156102d057600080fd5b8401601f810186136102e157600080fd5b80356001600160401b038111156102fa576102fa610230565b8060051b61030a6020820161026e565b9182526020818401810192908101908984111561032657600080fd5b6020850192505b8383101561040a5782356001600160401b0381111561034b57600080fd5b85016040818c03601f1901121561036157600080fd5b610369610246565b60208201356001600160401b0381111561038257600080fd5b82016020810190603f018d1361039757600080fd5b80356001600160401b038111156103b0576103b0610230565b6103c3601f8201601f191660200161026e565b8181528e60208385010111156103d857600080fd5b81602084016020830137600060209282018301528352604093909301358284015250835292830192919091019061032d565b96999698505050506040949094013593505050565b60005b8381101561043a578181015183820152602001610422565b50506000910152565b8215158152604060208201526000825180604084015261046a81606085016020870161041f565b601f01601f1916919091016060019392505050565b6000825161049181846020870161041f565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b600083516104c381846020880161041f565b8351908301906104d781836020880161041f565b01949350505050565b600063ffffffff821663ffffffff810361050a57634e487b7160e01b600052601160045260246000fd5b60010192915050565b6001600160f81b0319881681526001600160e01b031987811660018301526005820187905285166025820152835160009061055581602985016020890161041f565b6001600160e01b03198516602991840191820152835161057c81602d84016020880161041f565b01602d01999850505050505050505056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa2646970667358221220b3f5d6acd5a7371344cacab05e607079ebf476b46d8b170419612f80e7a8ac9564736f6c634300081c0033", + "bytecode": "0x6080604052348015600f57600080fd5b506105ee8061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806362e4c4641461003b578063a32c2b9914610060575b600080fd5b61004360f581565b6040516001600160a01b0390911681526020015b60405180910390f35b61007361006e36600461029e565b610081565b604051610057929190610443565b600060606000610092868686610100565b905060008060f56001600160a01b0316836040516100b0919061047f565b600060405180830381855afa9150503d80600081146100eb576040519150601f19603f3d011682016040523d82523d6000602084013e6100f0565b606091505b5090999098509650505050505050565b60408051600080825260208201909252606091805b855181101561019a57848682815181106101315761013161049b565b6020026020010151602001510361019257828682815181106101555761015561049b565b6020026020010151600001516040516020016101729291906104b1565b6040516020818303038152906040529250818061018e906104e0565b9250505b600101610115565b50836002036101ac57600193506101b9565b836003036101b957600093505b60006040518060600160405280602b815260200161058e602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061021090869086908f9087908b9088908f90602001610513565b60408051808303601f190181529190529c9b505050505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561026857610268610230565b60405290565b604051601f8201601f191681016001600160401b038111828210171561029657610296610230565b604052919050565b6000806000606084860312156102b357600080fd5b8335925060208401356001600160401b038111156102d057600080fd5b8401601f810186136102e157600080fd5b80356001600160401b038111156102fa576102fa610230565b8060051b61030a6020820161026e565b9182526020818401810192908101908984111561032657600080fd5b6020850192505b8383101561040a5782356001600160401b0381111561034b57600080fd5b85016040818c03601f1901121561036157600080fd5b610369610246565b60208201356001600160401b0381111561038257600080fd5b82016020810190603f018d1361039757600080fd5b80356001600160401b038111156103b0576103b0610230565b6103c3601f8201601f191660200161026e565b8181528e60208385010111156103d857600080fd5b81602084016020830137600060209282018301528352604093909301358284015250835292830192919091019061032d565b96999698505050506040949094013593505050565b60005b8381101561043a578181015183820152602001610422565b50506000910152565b8215158152604060208201526000825180604084015261046a81606085016020870161041f565b601f01601f1916919091016060019392505050565b6000825161049181846020870161041f565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b600083516104c381846020880161041f565b8351908301906104d781836020880161041f565b01949350505050565b600063ffffffff821663ffffffff810361050a57634e487b7160e01b600052601160045260246000fd5b60010192915050565b6001600160f81b0319881681526001600160e01b031987811660018301526005820187905285166025820152835160009061055581602985016020890161041f565b6001600160e01b03198516602991840191820152835161057c81602d84016020880161041f565b01602d01999850505050505050505056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa26469706673582212205d2e87924405c75a37cb3199109dc5847775ce28137c5e1ca405720cfa3bea3d64736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806362e4c4641461003b578063a32c2b9914610060575b600080fd5b61004360f581565b6040516001600160a01b0390911681526020015b60405180910390f35b61007361006e36600461029e565b610081565b604051610057929190610443565b600060606000610092868686610100565b905060008060f56001600160a01b0316836040516100b0919061047f565b600060405180830381855afa9150503d80600081146100eb576040519150601f19603f3d011682016040523d82523d6000602084013e6100f0565b606091505b5090999098509650505050505050565b60408051600080825260208201909252606091805b855181101561019a57848682815181106101315761013161049b565b6020026020010151602001510361019257828682815181106101555761015561049b565b6020026020010151600001516040516020016101729291906104b1565b6040516020818303038152906040529250818061018e906104e0565b9250505b600101610115565b50836002036101ac57600193506101b9565b836003036101b957600093505b60006040518060600160405280602b815260200161058e602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061021090869086908f9087908b9088908f90602001610513565b60408051808303601f190181529190529c9b505050505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561026857610268610230565b60405290565b604051601f8201601f191681016001600160401b038111828210171561029657610296610230565b604052919050565b6000806000606084860312156102b357600080fd5b8335925060208401356001600160401b038111156102d057600080fd5b8401601f810186136102e157600080fd5b80356001600160401b038111156102fa576102fa610230565b8060051b61030a6020820161026e565b9182526020818401810192908101908984111561032657600080fd5b6020850192505b8383101561040a5782356001600160401b0381111561034b57600080fd5b85016040818c03601f1901121561036157600080fd5b610369610246565b60208201356001600160401b0381111561038257600080fd5b82016020810190603f018d1361039757600080fd5b80356001600160401b038111156103b0576103b0610230565b6103c3601f8201601f191660200161026e565b8181528e60208385010111156103d857600080fd5b81602084016020830137600060209282018301528352604093909301358284015250835292830192919091019061032d565b96999698505050506040949094013593505050565b60005b8381101561043a578181015183820152602001610422565b50506000910152565b8215158152604060208201526000825180604084015261046a81606085016020870161041f565b601f01601f1916919091016060019392505050565b6000825161049181846020870161041f565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b600083516104c381846020880161041f565b8351908301906104d781836020880161041f565b01949350505050565b600063ffffffff821663ffffffff810361050a57634e487b7160e01b600052601160045260246000fd5b60010192915050565b6001600160f81b0319881681526001600160e01b031987811660018301526005820187905285166025820152835160009061055581602985016020890161041f565b6001600160e01b03198516602991840191820152835161057c81602d84016020880161041f565b01602d01999850505050505050505056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa26469706673582212205d2e87924405c75a37cb3199109dc5847775ce28137c5e1ca405720cfa3bea3d64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/rust/lit-core/lit-blockchain-lite/abis/PKPHelper.json b/rust/lit-core/lit-blockchain-lite/abis/PKPHelper.json index 69d8a2ca..3f6870d7 100644 --- a/rust/lit-core/lit-blockchain-lite/abis/PKPHelper.json +++ b/rust/lit-core/lit-blockchain-lite/abis/PKPHelper.json @@ -1007,8 +1007,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50604051613a76380380613a7683398101604081905261002f916100d5565b61003833610085565b600280546001600160a01b0384166001600160a01b03198216811783558392916001600160a81b03191617600160a01b83838111156100795761007961011f565b02179055505050610135565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080604083850312156100e857600080fd5b82516001600160a01b03811681146100ff57600080fd5b60208401519092506003811061011457600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b613932806101446000396000f3fe60806040526004361061014c5760003560e01c806373cc4111116100bc57806373cc4111146102f6578063778fe5721461030b578063782e2ea51461031e5780638da5cb5b1461033e57806391d148541461035357806391ee4fd5146103735780639dca003214610386578063a217fddf146103b4578063caead0c7146103c9578063d547741f146103de578063db0bf933146103fe578063e4f11df614610411578063f2fde38b14610424578063f95d71b11461044457600080fd5b806301ffc9a7146101515780630e9ed68b1461018657806313af411b146101a8578063150b7a02146101c9578063202f724f14610202578063248a9ca3146102155780632b553551146102355780632f2ff15d146102575780633276558c1461027757806336568abe1461028c5780635043026c146102ac57806350d17b5e146102c1578063715018a6146102e1575b600080fd5b34801561015d57600080fd5b5061017161016c366004612598565b610464565b60405190151581526020015b60405180910390f35b34801561019257600080fd5b5061019b61049b565b60405161017d91906125c2565b6101bb6101b6366004612b84565b610586565b60405190815260200161017d565b3480156101d557600080fd5b506101e96101e4366004612c32565b610603565b6040516001600160e01b0319909116815260200161017d565b6101bb610210366004612b84565b6106a7565b34801561022157600080fd5b506101bb610230366004612cd1565b6106ba565b34801561024157600080fd5b50610255610250366004612cd1565b6106d0565b005b34801561026357600080fd5b50610255610272366004612cea565b6108ab565b34801561028357600080fd5b5061019b6108cc565b34801561029857600080fd5b506102556102a7366004612cea565b61091e565b3480156102b857600080fd5b5061019b61099c565b3480156102cd57600080fd5b5060025461019b906001600160a01b031681565b3480156102ed57600080fd5b506102556109ee565b34801561030257600080fd5b5061019b610a02565b6101bb610319366004612d3a565b610a54565b34801561032a57600080fd5b50610255610339366004612fb8565b611066565b34801561034a57600080fd5b5061019b611289565b34801561035f57600080fd5b5061017161036e366004612cea565b611298565b6101bb610381366004612ff4565b6112c3565b34801561039257600080fd5b506002546103a790600160a01b900460ff1681565b60405161017d91906130f0565b3480156103c057600080fd5b506101bb600081565b3480156103d557600080fd5b5061019b611965565b3480156103ea57600080fd5b506102556103f9366004612cea565b6119b7565b6101bb61040c3660046130fe565b6119d3565b6101bb61041f36600461323b565b611fdd565b34801561043057600080fd5b5061025561043f36600461334d565b612130565b34801561045057600080fd5b5061025561045f36600461334d565b6121a9565b60006001600160e01b03198216637965db0b60e01b148061049557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002546040805163da19ddfb60e01b815290516000926001600160a01b031691638e8dfd1691839163da19ddfb9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610511919061336a565b60025460405160e084901b6001600160e01b03191681526105409291600160a01b900460ff1690600401613383565b602060405180830381865afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190613397565b905090565b6000806040518060a00160405280856000015181526020016040518060400160405280600c81526020016b6e6167612d6b65797365743160a01b815250815260200185602001518152602001856040015181526020016105e461049b565b6001600160a01b0316905290506105fb81846112c3565b949350505050565b600061060d611965565b6001600160a01b0316336001600160a01b0316146106955760405162461bcd60e51b815260206004820152603a60248201527f504b5048656c7065723a206f6e6c792061636365707473207472616e736665726044820152791cc8199c9bdb481d1a19481412d41391950818dbdb9d1c9858dd60321b60648201526084015b60405180910390fd5b50630a85bd0160e11b95945050505050565b60006106b38383610586565b9392505050565b6000908152600160208190526040909120015490565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa158015610722573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610746919061336a565b60025460405160e084901b6001600160e01b03191681526107759291600160a01b900460ff1690600401613383565b602060405180830381865afa158015610792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b69190613397565b6001600160a01b0316336001600160a01b0316146107e65760405162461bcd60e51b815260040161068c906133b4565b60006107f061099c565b60405163b63a767760e01b8152600481018490529091506001600160a01b0382169063b63a767790602401600060405180830381600087803b15801561083557600080fd5b505af1158015610849573d6000803e3d6000fd5b50506040516328cd10c760e11b8152600481018590526001600160a01b038416925063519a218e9150602401600060405180830381600087803b15801561088f57600080fd5b505af11580156108a3573d6000803e3d6000fd5b505050505050565b6108b4826106ba565b6108bd81612207565b6108c78383612211565b505050565b6002546040805163120e5f0760e31b815290516000926001600160a01b031691638e8dfd16918391639072f8389160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6001600160a01b038116331461098e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161068c565b610998828261227c565b5050565b600254604080516316f76bbf60e01b815290516000926001600160a01b031691638e8dfd169183916316f76bbf9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6109f66122e3565b610a006000612342565b565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b600080610a5f611965565b83516020850151604051633ff8069760e11b81526001600160a01b039390931692637ff00d2e923492610a9492600401613484565b60206040518083038185885af1158015610ab2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ad7919061336a565b905082606001515183604001515114610b025760405162461bcd60e51b815260040161068c9061349d565b8260a001515183608001515114610b2b5760405162461bcd60e51b815260040161068c906134f3565b8260e00151518360c001515114610b545760405162461bcd60e51b815260040161068c90613548565b826101000151518360c001515114610b7e5760405162461bcd60e51b815260040161068c90613591565b826101200151518360c001515114610ba85760405162461bcd60e51b815260040161068c906135dc565b60408301515115610c745760005b836040015151811015610c7257610bcb6108cc565b6001600160a01b0316638a4315788386604001518481518110610bf057610bf0613627565b602002602001015187606001518581518110610c0e57610c0e613627565b60200260200101516040518463ffffffff1660e01b8152600401610c3493929190613679565b600060405180830381600087803b158015610c4e57600080fd5b505af1158015610c62573d6000803e3d6000fd5b505060019092019150610bb69050565b505b60808301515115610d405760005b836080015151811015610d3e57610c976108cc565b6001600160a01b0316631663c1218386608001518481518110610cbc57610cbc613627565b60200260200101518760a001518581518110610cda57610cda613627565b60200260200101516040518463ffffffff1660e01b8152600401610d00939291906136ae565b600060405180830381600087803b158015610d1a57600080fd5b505af1158015610d2e573d6000803e3d6000fd5b505060019092019150610c829050565b505b60c08301515115610e625760005b8360c0015151811015610e6057610d636108cc565b6001600160a01b0316639dd4349b8360405180606001604052808860c001518681518110610d9357610d93613627565b602002602001015181526020018860e001518681518110610db657610db6613627565b602002602001015181526020018861010001518681518110610dda57610dda613627565b60200260200101518152508761012001518581518110610dfc57610dfc613627565b60200260200101516040518463ffffffff1660e01b8152600401610e22939291906136e1565b600060405180830381600087803b158015610e3c57600080fd5b505af1158015610e50573d6000803e3d6000fd5b505060019092019150610d4e9050565b505b6000610e6c6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401610e9991815260200190565b602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190613397565b905083610140015115610f7c57610eef6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015610f2a578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401610f49939291906136ae565b600060405180830381600087803b158015610f6357600080fd5b505af1158015610f77573d6000803e3d6000fd5b505050505b83610160015115610ff557610f8f611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401610fbe9392919061373f565b600060405180830381600087803b158015610fd857600080fd5b505af1158015610fec573d6000803e3d6000fd5b5050505061105f565b610ffd611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b815260040161102c9392919061373f565b600060405180830381600087803b15801561104657600080fd5b505af115801561105a573d6000803e3d6000fd5b505050505b5092915050565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa1580156110b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dc919061336a565b60025460405160e084901b6001600160e01b031916815261110b9291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c9190613397565b6001600160a01b0316336001600160a01b03161461117c5760405162461bcd60e51b815260040161068c906133b4565b600061118661099c565b8251909150156108c757806001600160a01b031663855eec2284846000815181106111b3576111b3613627565b60200260200101516040518363ffffffff1660e01b81526004016111d8929190613484565b600060405180830381600087803b1580156111f257600080fd5b505af1158015611206573d6000803e3d6000fd5b50505050806001600160a01b0316639000fee1848460018151811061122d5761122d613627565b60200260200101516040518363ffffffff1660e01b8152600401611252929190613484565b600060405180830381600087803b15801561126c57600080fd5b505af1158015611280573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b805182516000911461133d5760405162461bcd60e51b815260206004820152603e60248201527f504b5048656c7065723a20436c61696d206b65792074797065206d757374206d60448201527f617463682041757468204d6574686f642064617461206b657920747970650000606482015260840161068c565b60016000611349611965565b6001600160a01b03166371aa9acf3484886000015189602001518a604001518b606001518c608001516040518863ffffffff1660e01b815260040161139396959493929190613763565b60206040518083038185885af11580156113b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113d6919061336a565b9050836040015151846020015151146114015760405162461bcd60e51b815260040161068c9061349d565b8360800151518460600151511461142a5760405162461bcd60e51b815260040161068c906134f3565b8360c00151518460a0015151146114535760405162461bcd60e51b815260040161068c90613548565b8360e00151518460a00151511461147c5760405162461bcd60e51b815260040161068c90613591565b836101000151518460a0015151146114a65760405162461bcd60e51b815260040161068c906135dc565b602084015151156115725760005b846020015151811015611570576114c96108cc565b6001600160a01b0316638a43157883876020015184815181106114ee576114ee613627565b60200260200101518860400151858151811061150c5761150c613627565b60200260200101516040518463ffffffff1660e01b815260040161153293929190613679565b600060405180830381600087803b15801561154c57600080fd5b505af1158015611560573d6000803e3d6000fd5b5050600190920191506114b49050565b505b6060840151511561163e5760005b84606001515181101561163c576115956108cc565b6001600160a01b0316631663c12183876060015184815181106115ba576115ba613627565b6020026020010151886080015185815181106115d8576115d8613627565b60200260200101516040518463ffffffff1660e01b81526004016115fe939291906136ae565b600060405180830381600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b5050600190920191506115809050565b505b60a0840151511561175f5760005b8460a001515181101561175d576116616108cc565b6001600160a01b0316639dd4349b8360405180606001604052808960a00151868151811061169157611691613627565b602002602001015181526020018960c0015186815181106116b4576116b4613627565b602002602001015181526020018960e0015186815181106116d7576116d7613627565b602002602001015181525088610100015185815181106116f9576116f9613627565b60200260200101516040518463ffffffff1660e01b815260040161171f939291906136e1565b600060405180830381600087803b15801561173957600080fd5b505af115801561174d573d6000803e3d6000fd5b50506001909201915061164c9050565b505b60006117696108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b815260040161179691815260200190565b602060405180830381865afa1580156117b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d79190613397565b905084610120015115611879576117ec6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611827578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611846939291906136ae565b600060405180830381600087803b15801561186057600080fd5b505af1158015611874573d6000803e3d6000fd5b505050505b846101400151156118f25761188c611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b81526004016118bb9392919061373f565b600060405180830381600087803b1580156118d557600080fd5b505af11580156118e9573d6000803e3d6000fd5b5050505061195c565b6118fa611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b81526004016119299392919061373f565b600060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050505b50949350505050565b60025460408051632c0b8bf760e01b815290516000926001600160a01b031691638e8dfd16918391632c0b8bf79160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6119c0826106ba565b6119c981612207565b6108c7838361227c565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a49919061336a565b60025460405160e084901b6001600160e01b0319168152611a789291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab99190613397565b6001600160a01b0316336001600160a01b031614611ae95760405162461bcd60e51b815260040161068c906133b4565b6000611af3611965565b6001600160a01b0316637ff00d2e348d8d6040518463ffffffff1660e01b8152600401611b21929190613484565b60206040518083038185885af1158015611b3f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b64919061336a565b90508751895114611b875760405162461bcd60e51b815260040161068c90613548565b8651895114611ba85760405162461bcd60e51b815260040161068c90613591565b8551895114611bc95760405162461bcd60e51b815260040161068c906135dc565b885115611cd15760005b8951811015611ccf57611be46108cc565b6001600160a01b0316639dd4349b8360405180606001604052808e8681518110611c1057611c10613627565b602002602001015181526020018d8681518110611c2f57611c2f613627565b602002602001015181526020018c8681518110611c4e57611c4e613627565b60200260200101518152508a8581518110611c6b57611c6b613627565b60200260200101516040518463ffffffff1660e01b8152600401611c91939291906136e1565b600060405180830381600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b505060019092019150611bd39050565b505b6000611cdb6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401611d0891815260200190565b602060405180830381865afa158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190613397565b90508415611de657611d596108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611d94578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611db3939291906136ae565b600060405180830381600087803b158015611dcd57600080fd5b505af1158015611de1573d6000803e3d6000fd5b505050505b8315611e5a57611df4611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401611e239392919061373f565b600060405180830381600087803b158015611e3d57600080fd5b505af1158015611e51573d6000803e3d6000fd5b50505050611ec4565b611e62611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b8152600401611e919392919061373f565b600060405180830381600087803b158015611eab57600080fd5b505af1158015611ebf573d6000803e3d6000fd5b505050505b855115611fce57611ed361099c565b6001600160a01b031663855eec228388600081518110611ef557611ef5613627565b60200260200101516040518363ffffffff1660e01b8152600401611f1a929190613484565b600060405180830381600087803b158015611f3457600080fd5b505af1158015611f48573d6000803e3d6000fd5b50505050611f5461099c565b6001600160a01b0316639000fee18388600181518110611f7657611f76613627565b60200260200101516040518363ffffffff1660e01b8152600401611f9b929190613484565b600060405180830381600087803b158015611fb557600080fd5b505af1158015611fc9573d6000803e3d6000fd5b505050505b509a9950505050505050505050565b6000806040518061018001604052808b81526020018a815260200160006001600160401b03811115612011576120116125d6565b60405190808252806020026020018201604052801561204457816020015b606081526020019060019003908161202f5790505b508152602001600060405190808252806020026020018201604052801561207f57816020015b606081526020019060019003908161206a5790505b50815260200160006040519080825280602002602001820160405280156120b0578160200160208202803683370190505b50815260200160006040519080825280602002602001820160405280156120eb57816020015b60608152602001906001900390816120d65790505b5081526020018981526020018881526020018781526020018681526020018515158152602001841515815250905061212281610a54565b9a9950505050505050505050565b6121386122e3565b6001600160a01b03811661219d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068c565b6121a681612342565b50565b6121b16122e3565b600280546001600160a01b0319166001600160a01b0383161790556040517f2760073c7cd8cac531d7f643becbfbb74d8b8156443eacf879622532dbbb3cd5906121fc9083906125c2565b60405180910390a150565b6121a68133612392565b61221b8282611298565b6109985760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6122868282611298565b156109985760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b336122ec611289565b6001600160a01b031614610a005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161068c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61239c8282611298565b610998576123a9816123eb565b6123b48360206123fd565b6040516020016123c5929190613803565b60408051601f198184030181529082905262461bcd60e51b825261068c91600401613872565b60606104956001600160a01b03831660145b6060600061240c83600261389b565b6124179060026138b2565b6001600160401b0381111561242e5761242e6125d6565b6040519080825280601f01601f191660200182016040528015612458576020820181803683370190505b509050600360fc1b8160008151811061247357612473613627565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106124a2576124a2613627565b60200101906001600160f81b031916908160001a90535060006124c684600261389b565b6124d19060016138b2565b90505b6001811115612549576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061250557612505613627565b1a60f81b82828151811061251b5761251b613627565b60200101906001600160f81b031916908160001a90535060049490941c93612542816138c5565b90506124d4565b5083156106b35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161068c565b6000602082840312156125aa57600080fd5b81356001600160e01b0319811681146106b357600080fd5b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561260e5761260e6125d6565b60405290565b60405161016081016001600160401b038111828210171561260e5761260e6125d6565b60405161018081016001600160401b038111828210171561260e5761260e6125d6565b60405160a081016001600160401b038111828210171561260e5761260e6125d6565b604051601f8201601f191681016001600160401b03811182821017156126a4576126a46125d6565b604052919050565b60006001600160401b038211156126c5576126c56125d6565b5060051b60200190565b600082601f8301126126e057600080fd5b81356126f36126ee826126ac565b61267c565b8082825260208201915060206060840286010192508583111561271557600080fd5b602085015b83811015612771576060818803121561273257600080fd5b61273a6125ec565b8135815260208083013590820152604082013560ff8116811461275c57600080fd5b6040820152835260209092019160600161271a565b5095945050505050565b6000806001600160401b03841115612795576127956125d6565b50601f8301601f19166020016127aa8161267c565b9150508281528383830111156127bf57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126127e757600080fd5b81356127f56126ee826126ac565b8082825260208201915060208360051b86010192508583111561281757600080fd5b602085015b838110156127715780356001600160401b0381111561283a57600080fd5b8601603f8101881361284b57600080fd5b61285d8860208301356040840161277b565b8452506020928301920161281c565b600082601f83011261287d57600080fd5b813561288b6126ee826126ac565b8082825260208201915060208360051b8601019250858311156128ad57600080fd5b602085015b838110156127715780358352602092830192016128b2565b600082601f8301126128db57600080fd5b81356128e96126ee826126ac565b8082825260208201915060208360051b86010192508583111561290b57600080fd5b602085015b838110156127715780356001600160401b0381111561292e57600080fd5b61293d886020838a010161286c565b84525060209283019201612910565b6001600160a01b03811681146121a657600080fd5b600082601f83011261297257600080fd5b81356129806126ee826126ac565b8082825260208201915060208360051b8601019250858311156129a257600080fd5b602085015b838110156127715780356129ba8161294c565b8352602092830192016129a7565b803580151581146129d857600080fd5b919050565b600061016082840312156129f057600080fd5b6129f8612614565b82358152905060208201356001600160401b03811115612a1757600080fd5b612a23848285016127d6565b60208301525060408201356001600160401b03811115612a4257600080fd5b612a4e848285016128ca565b60408301525060608201356001600160401b03811115612a6d57600080fd5b612a7984828501612961565b60608301525060808201356001600160401b03811115612a9857600080fd5b612aa4848285016128ca565b60808301525060a08201356001600160401b03811115612ac357600080fd5b612acf8482850161286c565b60a08301525060c08201356001600160401b03811115612aee57600080fd5b612afa848285016127d6565b60c08301525060e08201356001600160401b03811115612b1957600080fd5b612b25848285016127d6565b60e0830152506101008201356001600160401b03811115612b4557600080fd5b612b51848285016128ca565b61010083015250612b6561012083016129c8565b610120820152612b7861014083016129c8565b61014082015292915050565b60008060408385031215612b9757600080fd5b82356001600160401b03811115612bad57600080fd5b830160608186031215612bbf57600080fd5b612bc76125ec565b813581526020808301359082015260408201356001600160401b03811115612bee57600080fd5b612bfa878285016126cf565b60408301525092505060208301356001600160401b03811115612c1c57600080fd5b612c28858286016129dd565b9150509250929050565b600080600080600060808688031215612c4a57600080fd5b8535612c558161294c565b94506020860135612c658161294c565b93506040860135925060608601356001600160401b03811115612c8757600080fd5b8601601f81018813612c9857600080fd5b80356001600160401b03811115612cae57600080fd5b886020828401011115612cc057600080fd5b959894975092955050506020019190565b600060208284031215612ce357600080fd5b5035919050565b60008060408385031215612cfd57600080fd5b823591506020830135612d0f8161294c565b809150509250929050565b600082601f830112612d2b57600080fd5b6106b38383356020850161277b565b600060208284031215612d4c57600080fd5b81356001600160401b03811115612d6257600080fd5b82016101808185031215612d7557600080fd5b612d7d612637565b8135815260208201356001600160401b03811115612d9a57600080fd5b612da686828501612d1a565b60208301525060408201356001600160401b03811115612dc557600080fd5b612dd1868285016127d6565b60408301525060608201356001600160401b03811115612df057600080fd5b612dfc868285016128ca565b60608301525060808201356001600160401b03811115612e1b57600080fd5b612e2786828501612961565b60808301525060a08201356001600160401b03811115612e4657600080fd5b612e52868285016128ca565b60a08301525060c08201356001600160401b03811115612e7157600080fd5b612e7d8682850161286c565b60c08301525060e08201356001600160401b03811115612e9c57600080fd5b612ea8868285016127d6565b60e0830152506101008201356001600160401b03811115612ec857600080fd5b612ed4868285016127d6565b610100830152506101208201356001600160401b03811115612ef557600080fd5b612f01868285016128ca565b61012083015250612f1561014083016129c8565b610140820152612f2861016083016129c8565b610160820152949350505050565b600082601f830112612f4757600080fd5b8135612f556126ee826126ac565b8082825260208201915060208360051b860101925085831115612f7757600080fd5b602085015b838110156127715780356001600160401b03811115612f9a57600080fd5b612fa9886020838a0101612d1a565b84525060209283019201612f7c565b60008060408385031215612fcb57600080fd5b8235915060208301356001600160401b03811115612fe857600080fd5b612c2885828601612f36565b6000806040838503121561300757600080fd5b82356001600160401b0381111561301d57600080fd5b830160a0818603121561302f57600080fd5b61303761265a565b8135815260208201356001600160401b0381111561305457600080fd5b61306087828501612d1a565b6020830152506040828101359082015260608201356001600160401b0381111561308957600080fd5b613095878285016126cf565b606083015250608082013591506130ab8261294c565b6080810191909152915060208301356001600160401b03811115612c1c57600080fd5b600381106130ec57634e487b7160e01b600052602160045260246000fd5b9052565b6020810161049582846130ce565b60008060008060008060008060006101208a8c03121561311d57600080fd5b8935985060208a01356001600160401b0381111561313a57600080fd5b6131468c828d01612d1a565b98505060408a01356001600160401b0381111561316257600080fd5b61316e8c828d0161286c565b97505060608a01356001600160401b0381111561318a57600080fd5b6131968c828d016127d6565b96505060808a01356001600160401b038111156131b257600080fd5b6131be8c828d016127d6565b95505060a08a01356001600160401b038111156131da57600080fd5b6131e68c828d016128ca565b94505060c08a01356001600160401b0381111561320257600080fd5b61320e8c828d01612f36565b93505061321d60e08b016129c8565b915061322c6101008b016129c8565b90509295985092959850929598565b600080600080600080600080610100898b03121561325857600080fd5b8835975060208901356001600160401b0381111561327557600080fd5b6132818b828c01612d1a565b97505060408901356001600160401b0381111561329d57600080fd5b6132a98b828c0161286c565b96505060608901356001600160401b038111156132c557600080fd5b6132d18b828c016127d6565b95505060808901356001600160401b038111156132ed57600080fd5b6132f98b828c016127d6565b94505060a08901356001600160401b0381111561331557600080fd5b6133218b828c016128ca565b93505061333060c08a016129c8565b915061333e60e08a016129c8565b90509295985092959890939650565b60006020828403121561335f57600080fd5b81356106b38161294c565b60006020828403121561337c57600080fd5b5051919050565b828152604081016106b360208301846130ce565b6000602082840312156133a957600080fd5b81516106b38161294c565b6020808252605a908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f6060820152796d61696e2077616c6c6574732c2077686f2061726520796f753f60301b608082015260a00190565b60005b8381101561344f578181015183820152602001613437565b50506000910152565b60008151808452613470816020860160208601613434565b601f01601f19169290920160200192915050565b8281526040602082015260006105fb6040830184613458565b60208082526036908201527f504b5048656c7065723a20697066732063696420616e642073636f70652061726040820152750e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d60531b606082015260800190565b60208082526035908201527f504b5048656c7065723a206164647265737320616e642073636f7065206172726040820152740c2f240d8cadccee8d0e640daeae6e840dac2e8c6d605b1b606082015260800190565b6020808252603b908201526000805160206138dd83398151915260408201527a0d2c840c2e4e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d602b1b606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f7075626b6579206172726179206c656e67746873206d757374206d6174636800606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f73636f706573206172726179206c656e67746873206d757374206d6174636800606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020840193506020830160005b8281101561366f578151865260209586019590910190600101613651565b5093949350505050565b8381526060602082015260006136926060830185613458565b82810360408401526136a4818561363d565b9695505050505050565b8381526001600160a01b03831660208201526060604082018190526000906136d89083018461363d565b95945050505050565b8381526060602082015282516060820152600060208401516060608084015261370d60c0840182613458565b90506040850151605f198483030160a085015261372a8282613458565b91505082810360408401526136a4818561363d565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015260c06040820152600061378260c0830187613458565b6060830186905282810360808401528451808252602080870192019060005b818110156137de578351805184526020810151602085015260ff6040820151166040850152506060830192506020840193506001810190506137a1565b50506001600160a01b03851660a085015291506137f89050565b979650505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351613835816017850160208801613434565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613866816028840160208801613434565b01602801949350505050565b6020815260006106b36020830184613458565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761049557610495613885565b8082018082111561049557610495613885565b6000816138d4576138d4613885565b50600019019056fe504b5048656c7065723a2061757468206d6574686f64207479706520616e6420a264697066735822122038295780a313e895b6dcea68e900a66f083bf36d7a4524b63cf8bf23e49d630d64736f6c634300081c0033", - "deployedBytecode": "0x60806040526004361061014c5760003560e01c806373cc4111116100bc57806373cc4111146102f6578063778fe5721461030b578063782e2ea51461031e5780638da5cb5b1461033e57806391d148541461035357806391ee4fd5146103735780639dca003214610386578063a217fddf146103b4578063caead0c7146103c9578063d547741f146103de578063db0bf933146103fe578063e4f11df614610411578063f2fde38b14610424578063f95d71b11461044457600080fd5b806301ffc9a7146101515780630e9ed68b1461018657806313af411b146101a8578063150b7a02146101c9578063202f724f14610202578063248a9ca3146102155780632b553551146102355780632f2ff15d146102575780633276558c1461027757806336568abe1461028c5780635043026c146102ac57806350d17b5e146102c1578063715018a6146102e1575b600080fd5b34801561015d57600080fd5b5061017161016c366004612598565b610464565b60405190151581526020015b60405180910390f35b34801561019257600080fd5b5061019b61049b565b60405161017d91906125c2565b6101bb6101b6366004612b84565b610586565b60405190815260200161017d565b3480156101d557600080fd5b506101e96101e4366004612c32565b610603565b6040516001600160e01b0319909116815260200161017d565b6101bb610210366004612b84565b6106a7565b34801561022157600080fd5b506101bb610230366004612cd1565b6106ba565b34801561024157600080fd5b50610255610250366004612cd1565b6106d0565b005b34801561026357600080fd5b50610255610272366004612cea565b6108ab565b34801561028357600080fd5b5061019b6108cc565b34801561029857600080fd5b506102556102a7366004612cea565b61091e565b3480156102b857600080fd5b5061019b61099c565b3480156102cd57600080fd5b5060025461019b906001600160a01b031681565b3480156102ed57600080fd5b506102556109ee565b34801561030257600080fd5b5061019b610a02565b6101bb610319366004612d3a565b610a54565b34801561032a57600080fd5b50610255610339366004612fb8565b611066565b34801561034a57600080fd5b5061019b611289565b34801561035f57600080fd5b5061017161036e366004612cea565b611298565b6101bb610381366004612ff4565b6112c3565b34801561039257600080fd5b506002546103a790600160a01b900460ff1681565b60405161017d91906130f0565b3480156103c057600080fd5b506101bb600081565b3480156103d557600080fd5b5061019b611965565b3480156103ea57600080fd5b506102556103f9366004612cea565b6119b7565b6101bb61040c3660046130fe565b6119d3565b6101bb61041f36600461323b565b611fdd565b34801561043057600080fd5b5061025561043f36600461334d565b612130565b34801561045057600080fd5b5061025561045f36600461334d565b6121a9565b60006001600160e01b03198216637965db0b60e01b148061049557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002546040805163da19ddfb60e01b815290516000926001600160a01b031691638e8dfd1691839163da19ddfb9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610511919061336a565b60025460405160e084901b6001600160e01b03191681526105409291600160a01b900460ff1690600401613383565b602060405180830381865afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190613397565b905090565b6000806040518060a00160405280856000015181526020016040518060400160405280600c81526020016b6e6167612d6b65797365743160a01b815250815260200185602001518152602001856040015181526020016105e461049b565b6001600160a01b0316905290506105fb81846112c3565b949350505050565b600061060d611965565b6001600160a01b0316336001600160a01b0316146106955760405162461bcd60e51b815260206004820152603a60248201527f504b5048656c7065723a206f6e6c792061636365707473207472616e736665726044820152791cc8199c9bdb481d1a19481412d41391950818dbdb9d1c9858dd60321b60648201526084015b60405180910390fd5b50630a85bd0160e11b95945050505050565b60006106b38383610586565b9392505050565b6000908152600160208190526040909120015490565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa158015610722573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610746919061336a565b60025460405160e084901b6001600160e01b03191681526107759291600160a01b900460ff1690600401613383565b602060405180830381865afa158015610792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b69190613397565b6001600160a01b0316336001600160a01b0316146107e65760405162461bcd60e51b815260040161068c906133b4565b60006107f061099c565b60405163b63a767760e01b8152600481018490529091506001600160a01b0382169063b63a767790602401600060405180830381600087803b15801561083557600080fd5b505af1158015610849573d6000803e3d6000fd5b50506040516328cd10c760e11b8152600481018590526001600160a01b038416925063519a218e9150602401600060405180830381600087803b15801561088f57600080fd5b505af11580156108a3573d6000803e3d6000fd5b505050505050565b6108b4826106ba565b6108bd81612207565b6108c78383612211565b505050565b6002546040805163120e5f0760e31b815290516000926001600160a01b031691638e8dfd16918391639072f8389160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6001600160a01b038116331461098e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161068c565b610998828261227c565b5050565b600254604080516316f76bbf60e01b815290516000926001600160a01b031691638e8dfd169183916316f76bbf9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6109f66122e3565b610a006000612342565b565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b600080610a5f611965565b83516020850151604051633ff8069760e11b81526001600160a01b039390931692637ff00d2e923492610a9492600401613484565b60206040518083038185885af1158015610ab2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ad7919061336a565b905082606001515183604001515114610b025760405162461bcd60e51b815260040161068c9061349d565b8260a001515183608001515114610b2b5760405162461bcd60e51b815260040161068c906134f3565b8260e00151518360c001515114610b545760405162461bcd60e51b815260040161068c90613548565b826101000151518360c001515114610b7e5760405162461bcd60e51b815260040161068c90613591565b826101200151518360c001515114610ba85760405162461bcd60e51b815260040161068c906135dc565b60408301515115610c745760005b836040015151811015610c7257610bcb6108cc565b6001600160a01b0316638a4315788386604001518481518110610bf057610bf0613627565b602002602001015187606001518581518110610c0e57610c0e613627565b60200260200101516040518463ffffffff1660e01b8152600401610c3493929190613679565b600060405180830381600087803b158015610c4e57600080fd5b505af1158015610c62573d6000803e3d6000fd5b505060019092019150610bb69050565b505b60808301515115610d405760005b836080015151811015610d3e57610c976108cc565b6001600160a01b0316631663c1218386608001518481518110610cbc57610cbc613627565b60200260200101518760a001518581518110610cda57610cda613627565b60200260200101516040518463ffffffff1660e01b8152600401610d00939291906136ae565b600060405180830381600087803b158015610d1a57600080fd5b505af1158015610d2e573d6000803e3d6000fd5b505060019092019150610c829050565b505b60c08301515115610e625760005b8360c0015151811015610e6057610d636108cc565b6001600160a01b0316639dd4349b8360405180606001604052808860c001518681518110610d9357610d93613627565b602002602001015181526020018860e001518681518110610db657610db6613627565b602002602001015181526020018861010001518681518110610dda57610dda613627565b60200260200101518152508761012001518581518110610dfc57610dfc613627565b60200260200101516040518463ffffffff1660e01b8152600401610e22939291906136e1565b600060405180830381600087803b158015610e3c57600080fd5b505af1158015610e50573d6000803e3d6000fd5b505060019092019150610d4e9050565b505b6000610e6c6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401610e9991815260200190565b602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190613397565b905083610140015115610f7c57610eef6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015610f2a578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401610f49939291906136ae565b600060405180830381600087803b158015610f6357600080fd5b505af1158015610f77573d6000803e3d6000fd5b505050505b83610160015115610ff557610f8f611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401610fbe9392919061373f565b600060405180830381600087803b158015610fd857600080fd5b505af1158015610fec573d6000803e3d6000fd5b5050505061105f565b610ffd611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b815260040161102c9392919061373f565b600060405180830381600087803b15801561104657600080fd5b505af115801561105a573d6000803e3d6000fd5b505050505b5092915050565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa1580156110b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dc919061336a565b60025460405160e084901b6001600160e01b031916815261110b9291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c9190613397565b6001600160a01b0316336001600160a01b03161461117c5760405162461bcd60e51b815260040161068c906133b4565b600061118661099c565b8251909150156108c757806001600160a01b031663855eec2284846000815181106111b3576111b3613627565b60200260200101516040518363ffffffff1660e01b81526004016111d8929190613484565b600060405180830381600087803b1580156111f257600080fd5b505af1158015611206573d6000803e3d6000fd5b50505050806001600160a01b0316639000fee1848460018151811061122d5761122d613627565b60200260200101516040518363ffffffff1660e01b8152600401611252929190613484565b600060405180830381600087803b15801561126c57600080fd5b505af1158015611280573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b805182516000911461133d5760405162461bcd60e51b815260206004820152603e60248201527f504b5048656c7065723a20436c61696d206b65792074797065206d757374206d60448201527f617463682041757468204d6574686f642064617461206b657920747970650000606482015260840161068c565b60016000611349611965565b6001600160a01b03166371aa9acf3484886000015189602001518a604001518b606001518c608001516040518863ffffffff1660e01b815260040161139396959493929190613763565b60206040518083038185885af11580156113b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113d6919061336a565b9050836040015151846020015151146114015760405162461bcd60e51b815260040161068c9061349d565b8360800151518460600151511461142a5760405162461bcd60e51b815260040161068c906134f3565b8360c00151518460a0015151146114535760405162461bcd60e51b815260040161068c90613548565b8360e00151518460a00151511461147c5760405162461bcd60e51b815260040161068c90613591565b836101000151518460a0015151146114a65760405162461bcd60e51b815260040161068c906135dc565b602084015151156115725760005b846020015151811015611570576114c96108cc565b6001600160a01b0316638a43157883876020015184815181106114ee576114ee613627565b60200260200101518860400151858151811061150c5761150c613627565b60200260200101516040518463ffffffff1660e01b815260040161153293929190613679565b600060405180830381600087803b15801561154c57600080fd5b505af1158015611560573d6000803e3d6000fd5b5050600190920191506114b49050565b505b6060840151511561163e5760005b84606001515181101561163c576115956108cc565b6001600160a01b0316631663c12183876060015184815181106115ba576115ba613627565b6020026020010151886080015185815181106115d8576115d8613627565b60200260200101516040518463ffffffff1660e01b81526004016115fe939291906136ae565b600060405180830381600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b5050600190920191506115809050565b505b60a0840151511561175f5760005b8460a001515181101561175d576116616108cc565b6001600160a01b0316639dd4349b8360405180606001604052808960a00151868151811061169157611691613627565b602002602001015181526020018960c0015186815181106116b4576116b4613627565b602002602001015181526020018960e0015186815181106116d7576116d7613627565b602002602001015181525088610100015185815181106116f9576116f9613627565b60200260200101516040518463ffffffff1660e01b815260040161171f939291906136e1565b600060405180830381600087803b15801561173957600080fd5b505af115801561174d573d6000803e3d6000fd5b50506001909201915061164c9050565b505b60006117696108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b815260040161179691815260200190565b602060405180830381865afa1580156117b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d79190613397565b905084610120015115611879576117ec6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611827578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611846939291906136ae565b600060405180830381600087803b15801561186057600080fd5b505af1158015611874573d6000803e3d6000fd5b505050505b846101400151156118f25761188c611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b81526004016118bb9392919061373f565b600060405180830381600087803b1580156118d557600080fd5b505af11580156118e9573d6000803e3d6000fd5b5050505061195c565b6118fa611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b81526004016119299392919061373f565b600060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050505b50949350505050565b60025460408051632c0b8bf760e01b815290516000926001600160a01b031691638e8dfd16918391632c0b8bf79160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6119c0826106ba565b6119c981612207565b6108c7838361227c565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a49919061336a565b60025460405160e084901b6001600160e01b0319168152611a789291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab99190613397565b6001600160a01b0316336001600160a01b031614611ae95760405162461bcd60e51b815260040161068c906133b4565b6000611af3611965565b6001600160a01b0316637ff00d2e348d8d6040518463ffffffff1660e01b8152600401611b21929190613484565b60206040518083038185885af1158015611b3f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b64919061336a565b90508751895114611b875760405162461bcd60e51b815260040161068c90613548565b8651895114611ba85760405162461bcd60e51b815260040161068c90613591565b8551895114611bc95760405162461bcd60e51b815260040161068c906135dc565b885115611cd15760005b8951811015611ccf57611be46108cc565b6001600160a01b0316639dd4349b8360405180606001604052808e8681518110611c1057611c10613627565b602002602001015181526020018d8681518110611c2f57611c2f613627565b602002602001015181526020018c8681518110611c4e57611c4e613627565b60200260200101518152508a8581518110611c6b57611c6b613627565b60200260200101516040518463ffffffff1660e01b8152600401611c91939291906136e1565b600060405180830381600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b505060019092019150611bd39050565b505b6000611cdb6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401611d0891815260200190565b602060405180830381865afa158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190613397565b90508415611de657611d596108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611d94578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611db3939291906136ae565b600060405180830381600087803b158015611dcd57600080fd5b505af1158015611de1573d6000803e3d6000fd5b505050505b8315611e5a57611df4611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401611e239392919061373f565b600060405180830381600087803b158015611e3d57600080fd5b505af1158015611e51573d6000803e3d6000fd5b50505050611ec4565b611e62611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b8152600401611e919392919061373f565b600060405180830381600087803b158015611eab57600080fd5b505af1158015611ebf573d6000803e3d6000fd5b505050505b855115611fce57611ed361099c565b6001600160a01b031663855eec228388600081518110611ef557611ef5613627565b60200260200101516040518363ffffffff1660e01b8152600401611f1a929190613484565b600060405180830381600087803b158015611f3457600080fd5b505af1158015611f48573d6000803e3d6000fd5b50505050611f5461099c565b6001600160a01b0316639000fee18388600181518110611f7657611f76613627565b60200260200101516040518363ffffffff1660e01b8152600401611f9b929190613484565b600060405180830381600087803b158015611fb557600080fd5b505af1158015611fc9573d6000803e3d6000fd5b505050505b509a9950505050505050505050565b6000806040518061018001604052808b81526020018a815260200160006001600160401b03811115612011576120116125d6565b60405190808252806020026020018201604052801561204457816020015b606081526020019060019003908161202f5790505b508152602001600060405190808252806020026020018201604052801561207f57816020015b606081526020019060019003908161206a5790505b50815260200160006040519080825280602002602001820160405280156120b0578160200160208202803683370190505b50815260200160006040519080825280602002602001820160405280156120eb57816020015b60608152602001906001900390816120d65790505b5081526020018981526020018881526020018781526020018681526020018515158152602001841515815250905061212281610a54565b9a9950505050505050505050565b6121386122e3565b6001600160a01b03811661219d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068c565b6121a681612342565b50565b6121b16122e3565b600280546001600160a01b0319166001600160a01b0383161790556040517f2760073c7cd8cac531d7f643becbfbb74d8b8156443eacf879622532dbbb3cd5906121fc9083906125c2565b60405180910390a150565b6121a68133612392565b61221b8282611298565b6109985760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6122868282611298565b156109985760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b336122ec611289565b6001600160a01b031614610a005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161068c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61239c8282611298565b610998576123a9816123eb565b6123b48360206123fd565b6040516020016123c5929190613803565b60408051601f198184030181529082905262461bcd60e51b825261068c91600401613872565b60606104956001600160a01b03831660145b6060600061240c83600261389b565b6124179060026138b2565b6001600160401b0381111561242e5761242e6125d6565b6040519080825280601f01601f191660200182016040528015612458576020820181803683370190505b509050600360fc1b8160008151811061247357612473613627565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106124a2576124a2613627565b60200101906001600160f81b031916908160001a90535060006124c684600261389b565b6124d19060016138b2565b90505b6001811115612549576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061250557612505613627565b1a60f81b82828151811061251b5761251b613627565b60200101906001600160f81b031916908160001a90535060049490941c93612542816138c5565b90506124d4565b5083156106b35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161068c565b6000602082840312156125aa57600080fd5b81356001600160e01b0319811681146106b357600080fd5b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561260e5761260e6125d6565b60405290565b60405161016081016001600160401b038111828210171561260e5761260e6125d6565b60405161018081016001600160401b038111828210171561260e5761260e6125d6565b60405160a081016001600160401b038111828210171561260e5761260e6125d6565b604051601f8201601f191681016001600160401b03811182821017156126a4576126a46125d6565b604052919050565b60006001600160401b038211156126c5576126c56125d6565b5060051b60200190565b600082601f8301126126e057600080fd5b81356126f36126ee826126ac565b61267c565b8082825260208201915060206060840286010192508583111561271557600080fd5b602085015b83811015612771576060818803121561273257600080fd5b61273a6125ec565b8135815260208083013590820152604082013560ff8116811461275c57600080fd5b6040820152835260209092019160600161271a565b5095945050505050565b6000806001600160401b03841115612795576127956125d6565b50601f8301601f19166020016127aa8161267c565b9150508281528383830111156127bf57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126127e757600080fd5b81356127f56126ee826126ac565b8082825260208201915060208360051b86010192508583111561281757600080fd5b602085015b838110156127715780356001600160401b0381111561283a57600080fd5b8601603f8101881361284b57600080fd5b61285d8860208301356040840161277b565b8452506020928301920161281c565b600082601f83011261287d57600080fd5b813561288b6126ee826126ac565b8082825260208201915060208360051b8601019250858311156128ad57600080fd5b602085015b838110156127715780358352602092830192016128b2565b600082601f8301126128db57600080fd5b81356128e96126ee826126ac565b8082825260208201915060208360051b86010192508583111561290b57600080fd5b602085015b838110156127715780356001600160401b0381111561292e57600080fd5b61293d886020838a010161286c565b84525060209283019201612910565b6001600160a01b03811681146121a657600080fd5b600082601f83011261297257600080fd5b81356129806126ee826126ac565b8082825260208201915060208360051b8601019250858311156129a257600080fd5b602085015b838110156127715780356129ba8161294c565b8352602092830192016129a7565b803580151581146129d857600080fd5b919050565b600061016082840312156129f057600080fd5b6129f8612614565b82358152905060208201356001600160401b03811115612a1757600080fd5b612a23848285016127d6565b60208301525060408201356001600160401b03811115612a4257600080fd5b612a4e848285016128ca565b60408301525060608201356001600160401b03811115612a6d57600080fd5b612a7984828501612961565b60608301525060808201356001600160401b03811115612a9857600080fd5b612aa4848285016128ca565b60808301525060a08201356001600160401b03811115612ac357600080fd5b612acf8482850161286c565b60a08301525060c08201356001600160401b03811115612aee57600080fd5b612afa848285016127d6565b60c08301525060e08201356001600160401b03811115612b1957600080fd5b612b25848285016127d6565b60e0830152506101008201356001600160401b03811115612b4557600080fd5b612b51848285016128ca565b61010083015250612b6561012083016129c8565b610120820152612b7861014083016129c8565b61014082015292915050565b60008060408385031215612b9757600080fd5b82356001600160401b03811115612bad57600080fd5b830160608186031215612bbf57600080fd5b612bc76125ec565b813581526020808301359082015260408201356001600160401b03811115612bee57600080fd5b612bfa878285016126cf565b60408301525092505060208301356001600160401b03811115612c1c57600080fd5b612c28858286016129dd565b9150509250929050565b600080600080600060808688031215612c4a57600080fd5b8535612c558161294c565b94506020860135612c658161294c565b93506040860135925060608601356001600160401b03811115612c8757600080fd5b8601601f81018813612c9857600080fd5b80356001600160401b03811115612cae57600080fd5b886020828401011115612cc057600080fd5b959894975092955050506020019190565b600060208284031215612ce357600080fd5b5035919050565b60008060408385031215612cfd57600080fd5b823591506020830135612d0f8161294c565b809150509250929050565b600082601f830112612d2b57600080fd5b6106b38383356020850161277b565b600060208284031215612d4c57600080fd5b81356001600160401b03811115612d6257600080fd5b82016101808185031215612d7557600080fd5b612d7d612637565b8135815260208201356001600160401b03811115612d9a57600080fd5b612da686828501612d1a565b60208301525060408201356001600160401b03811115612dc557600080fd5b612dd1868285016127d6565b60408301525060608201356001600160401b03811115612df057600080fd5b612dfc868285016128ca565b60608301525060808201356001600160401b03811115612e1b57600080fd5b612e2786828501612961565b60808301525060a08201356001600160401b03811115612e4657600080fd5b612e52868285016128ca565b60a08301525060c08201356001600160401b03811115612e7157600080fd5b612e7d8682850161286c565b60c08301525060e08201356001600160401b03811115612e9c57600080fd5b612ea8868285016127d6565b60e0830152506101008201356001600160401b03811115612ec857600080fd5b612ed4868285016127d6565b610100830152506101208201356001600160401b03811115612ef557600080fd5b612f01868285016128ca565b61012083015250612f1561014083016129c8565b610140820152612f2861016083016129c8565b610160820152949350505050565b600082601f830112612f4757600080fd5b8135612f556126ee826126ac565b8082825260208201915060208360051b860101925085831115612f7757600080fd5b602085015b838110156127715780356001600160401b03811115612f9a57600080fd5b612fa9886020838a0101612d1a565b84525060209283019201612f7c565b60008060408385031215612fcb57600080fd5b8235915060208301356001600160401b03811115612fe857600080fd5b612c2885828601612f36565b6000806040838503121561300757600080fd5b82356001600160401b0381111561301d57600080fd5b830160a0818603121561302f57600080fd5b61303761265a565b8135815260208201356001600160401b0381111561305457600080fd5b61306087828501612d1a565b6020830152506040828101359082015260608201356001600160401b0381111561308957600080fd5b613095878285016126cf565b606083015250608082013591506130ab8261294c565b6080810191909152915060208301356001600160401b03811115612c1c57600080fd5b600381106130ec57634e487b7160e01b600052602160045260246000fd5b9052565b6020810161049582846130ce565b60008060008060008060008060006101208a8c03121561311d57600080fd5b8935985060208a01356001600160401b0381111561313a57600080fd5b6131468c828d01612d1a565b98505060408a01356001600160401b0381111561316257600080fd5b61316e8c828d0161286c565b97505060608a01356001600160401b0381111561318a57600080fd5b6131968c828d016127d6565b96505060808a01356001600160401b038111156131b257600080fd5b6131be8c828d016127d6565b95505060a08a01356001600160401b038111156131da57600080fd5b6131e68c828d016128ca565b94505060c08a01356001600160401b0381111561320257600080fd5b61320e8c828d01612f36565b93505061321d60e08b016129c8565b915061322c6101008b016129c8565b90509295985092959850929598565b600080600080600080600080610100898b03121561325857600080fd5b8835975060208901356001600160401b0381111561327557600080fd5b6132818b828c01612d1a565b97505060408901356001600160401b0381111561329d57600080fd5b6132a98b828c0161286c565b96505060608901356001600160401b038111156132c557600080fd5b6132d18b828c016127d6565b95505060808901356001600160401b038111156132ed57600080fd5b6132f98b828c016127d6565b94505060a08901356001600160401b0381111561331557600080fd5b6133218b828c016128ca565b93505061333060c08a016129c8565b915061333e60e08a016129c8565b90509295985092959890939650565b60006020828403121561335f57600080fd5b81356106b38161294c565b60006020828403121561337c57600080fd5b5051919050565b828152604081016106b360208301846130ce565b6000602082840312156133a957600080fd5b81516106b38161294c565b6020808252605a908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f6060820152796d61696e2077616c6c6574732c2077686f2061726520796f753f60301b608082015260a00190565b60005b8381101561344f578181015183820152602001613437565b50506000910152565b60008151808452613470816020860160208601613434565b601f01601f19169290920160200192915050565b8281526040602082015260006105fb6040830184613458565b60208082526036908201527f504b5048656c7065723a20697066732063696420616e642073636f70652061726040820152750e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d60531b606082015260800190565b60208082526035908201527f504b5048656c7065723a206164647265737320616e642073636f7065206172726040820152740c2f240d8cadccee8d0e640daeae6e840dac2e8c6d605b1b606082015260800190565b6020808252603b908201526000805160206138dd83398151915260408201527a0d2c840c2e4e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d602b1b606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f7075626b6579206172726179206c656e67746873206d757374206d6174636800606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f73636f706573206172726179206c656e67746873206d757374206d6174636800606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020840193506020830160005b8281101561366f578151865260209586019590910190600101613651565b5093949350505050565b8381526060602082015260006136926060830185613458565b82810360408401526136a4818561363d565b9695505050505050565b8381526001600160a01b03831660208201526060604082018190526000906136d89083018461363d565b95945050505050565b8381526060602082015282516060820152600060208401516060608084015261370d60c0840182613458565b90506040850151605f198483030160a085015261372a8282613458565b91505082810360408401526136a4818561363d565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015260c06040820152600061378260c0830187613458565b6060830186905282810360808401528451808252602080870192019060005b818110156137de578351805184526020810151602085015260ff6040820151166040850152506060830192506020840193506001810190506137a1565b50506001600160a01b03851660a085015291506137f89050565b979650505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351613835816017850160208801613434565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613866816028840160208801613434565b01602801949350505050565b6020815260006106b36020830184613458565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761049557610495613885565b8082018082111561049557610495613885565b6000816138d4576138d4613885565b50600019019056fe504b5048656c7065723a2061757468206d6574686f64207479706520616e6420a264697066735822122038295780a313e895b6dcea68e900a66f083bf36d7a4524b63cf8bf23e49d630d64736f6c634300081c0033", + "bytecode": "0x608060405234801561001057600080fd5b50604051613a76380380613a7683398101604081905261002f916100d5565b61003833610085565b600280546001600160a01b0384166001600160a01b03198216811783558392916001600160a81b03191617600160a01b83838111156100795761007961011f565b02179055505050610135565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080604083850312156100e857600080fd5b82516001600160a01b03811681146100ff57600080fd5b60208401519092506003811061011457600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b613932806101446000396000f3fe60806040526004361061014c5760003560e01c806373cc4111116100bc57806373cc4111146102f6578063778fe5721461030b578063782e2ea51461031e5780638da5cb5b1461033e57806391d148541461035357806391ee4fd5146103735780639dca003214610386578063a217fddf146103b4578063caead0c7146103c9578063d547741f146103de578063db0bf933146103fe578063e4f11df614610411578063f2fde38b14610424578063f95d71b11461044457600080fd5b806301ffc9a7146101515780630e9ed68b1461018657806313af411b146101a8578063150b7a02146101c9578063202f724f14610202578063248a9ca3146102155780632b553551146102355780632f2ff15d146102575780633276558c1461027757806336568abe1461028c5780635043026c146102ac57806350d17b5e146102c1578063715018a6146102e1575b600080fd5b34801561015d57600080fd5b5061017161016c366004612598565b610464565b60405190151581526020015b60405180910390f35b34801561019257600080fd5b5061019b61049b565b60405161017d91906125c2565b6101bb6101b6366004612b84565b610586565b60405190815260200161017d565b3480156101d557600080fd5b506101e96101e4366004612c32565b610603565b6040516001600160e01b0319909116815260200161017d565b6101bb610210366004612b84565b6106a7565b34801561022157600080fd5b506101bb610230366004612cd1565b6106ba565b34801561024157600080fd5b50610255610250366004612cd1565b6106d0565b005b34801561026357600080fd5b50610255610272366004612cea565b6108ab565b34801561028357600080fd5b5061019b6108cc565b34801561029857600080fd5b506102556102a7366004612cea565b61091e565b3480156102b857600080fd5b5061019b61099c565b3480156102cd57600080fd5b5060025461019b906001600160a01b031681565b3480156102ed57600080fd5b506102556109ee565b34801561030257600080fd5b5061019b610a02565b6101bb610319366004612d3a565b610a54565b34801561032a57600080fd5b50610255610339366004612fb8565b611066565b34801561034a57600080fd5b5061019b611289565b34801561035f57600080fd5b5061017161036e366004612cea565b611298565b6101bb610381366004612ff4565b6112c3565b34801561039257600080fd5b506002546103a790600160a01b900460ff1681565b60405161017d91906130f0565b3480156103c057600080fd5b506101bb600081565b3480156103d557600080fd5b5061019b611965565b3480156103ea57600080fd5b506102556103f9366004612cea565b6119b7565b6101bb61040c3660046130fe565b6119d3565b6101bb61041f36600461323b565b611fdd565b34801561043057600080fd5b5061025561043f36600461334d565b612130565b34801561045057600080fd5b5061025561045f36600461334d565b6121a9565b60006001600160e01b03198216637965db0b60e01b148061049557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002546040805163da19ddfb60e01b815290516000926001600160a01b031691638e8dfd1691839163da19ddfb9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610511919061336a565b60025460405160e084901b6001600160e01b03191681526105409291600160a01b900460ff1690600401613383565b602060405180830381865afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190613397565b905090565b6000806040518060a00160405280856000015181526020016040518060400160405280600c81526020016b6e6167612d6b65797365743160a01b815250815260200185602001518152602001856040015181526020016105e461049b565b6001600160a01b0316905290506105fb81846112c3565b949350505050565b600061060d611965565b6001600160a01b0316336001600160a01b0316146106955760405162461bcd60e51b815260206004820152603a60248201527f504b5048656c7065723a206f6e6c792061636365707473207472616e736665726044820152791cc8199c9bdb481d1a19481412d41391950818dbdb9d1c9858dd60321b60648201526084015b60405180910390fd5b50630a85bd0160e11b95945050505050565b60006106b38383610586565b9392505050565b6000908152600160208190526040909120015490565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa158015610722573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610746919061336a565b60025460405160e084901b6001600160e01b03191681526107759291600160a01b900460ff1690600401613383565b602060405180830381865afa158015610792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b69190613397565b6001600160a01b0316336001600160a01b0316146107e65760405162461bcd60e51b815260040161068c906133b4565b60006107f061099c565b60405163b63a767760e01b8152600481018490529091506001600160a01b0382169063b63a767790602401600060405180830381600087803b15801561083557600080fd5b505af1158015610849573d6000803e3d6000fd5b50506040516328cd10c760e11b8152600481018590526001600160a01b038416925063519a218e9150602401600060405180830381600087803b15801561088f57600080fd5b505af11580156108a3573d6000803e3d6000fd5b505050505050565b6108b4826106ba565b6108bd81612207565b6108c78383612211565b505050565b6002546040805163120e5f0760e31b815290516000926001600160a01b031691638e8dfd16918391639072f8389160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6001600160a01b038116331461098e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161068c565b610998828261227c565b5050565b600254604080516316f76bbf60e01b815290516000926001600160a01b031691638e8dfd169183916316f76bbf9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6109f66122e3565b610a006000612342565b565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b600080610a5f611965565b83516020850151604051633ff8069760e11b81526001600160a01b039390931692637ff00d2e923492610a9492600401613484565b60206040518083038185885af1158015610ab2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ad7919061336a565b905082606001515183604001515114610b025760405162461bcd60e51b815260040161068c9061349d565b8260a001515183608001515114610b2b5760405162461bcd60e51b815260040161068c906134f3565b8260e00151518360c001515114610b545760405162461bcd60e51b815260040161068c90613548565b826101000151518360c001515114610b7e5760405162461bcd60e51b815260040161068c90613591565b826101200151518360c001515114610ba85760405162461bcd60e51b815260040161068c906135dc565b60408301515115610c745760005b836040015151811015610c7257610bcb6108cc565b6001600160a01b0316638a4315788386604001518481518110610bf057610bf0613627565b602002602001015187606001518581518110610c0e57610c0e613627565b60200260200101516040518463ffffffff1660e01b8152600401610c3493929190613679565b600060405180830381600087803b158015610c4e57600080fd5b505af1158015610c62573d6000803e3d6000fd5b505060019092019150610bb69050565b505b60808301515115610d405760005b836080015151811015610d3e57610c976108cc565b6001600160a01b0316631663c1218386608001518481518110610cbc57610cbc613627565b60200260200101518760a001518581518110610cda57610cda613627565b60200260200101516040518463ffffffff1660e01b8152600401610d00939291906136ae565b600060405180830381600087803b158015610d1a57600080fd5b505af1158015610d2e573d6000803e3d6000fd5b505060019092019150610c829050565b505b60c08301515115610e625760005b8360c0015151811015610e6057610d636108cc565b6001600160a01b0316639dd4349b8360405180606001604052808860c001518681518110610d9357610d93613627565b602002602001015181526020018860e001518681518110610db657610db6613627565b602002602001015181526020018861010001518681518110610dda57610dda613627565b60200260200101518152508761012001518581518110610dfc57610dfc613627565b60200260200101516040518463ffffffff1660e01b8152600401610e22939291906136e1565b600060405180830381600087803b158015610e3c57600080fd5b505af1158015610e50573d6000803e3d6000fd5b505060019092019150610d4e9050565b505b6000610e6c6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401610e9991815260200190565b602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190613397565b905083610140015115610f7c57610eef6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015610f2a578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401610f49939291906136ae565b600060405180830381600087803b158015610f6357600080fd5b505af1158015610f77573d6000803e3d6000fd5b505050505b83610160015115610ff557610f8f611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401610fbe9392919061373f565b600060405180830381600087803b158015610fd857600080fd5b505af1158015610fec573d6000803e3d6000fd5b5050505061105f565b610ffd611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b815260040161102c9392919061373f565b600060405180830381600087803b15801561104657600080fd5b505af115801561105a573d6000803e3d6000fd5b505050505b5092915050565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa1580156110b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dc919061336a565b60025460405160e084901b6001600160e01b031916815261110b9291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c9190613397565b6001600160a01b0316336001600160a01b03161461117c5760405162461bcd60e51b815260040161068c906133b4565b600061118661099c565b8251909150156108c757806001600160a01b031663855eec2284846000815181106111b3576111b3613627565b60200260200101516040518363ffffffff1660e01b81526004016111d8929190613484565b600060405180830381600087803b1580156111f257600080fd5b505af1158015611206573d6000803e3d6000fd5b50505050806001600160a01b0316639000fee1848460018151811061122d5761122d613627565b60200260200101516040518363ffffffff1660e01b8152600401611252929190613484565b600060405180830381600087803b15801561126c57600080fd5b505af1158015611280573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b805182516000911461133d5760405162461bcd60e51b815260206004820152603e60248201527f504b5048656c7065723a20436c61696d206b65792074797065206d757374206d60448201527f617463682041757468204d6574686f642064617461206b657920747970650000606482015260840161068c565b60016000611349611965565b6001600160a01b03166371aa9acf3484886000015189602001518a604001518b606001518c608001516040518863ffffffff1660e01b815260040161139396959493929190613763565b60206040518083038185885af11580156113b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113d6919061336a565b9050836040015151846020015151146114015760405162461bcd60e51b815260040161068c9061349d565b8360800151518460600151511461142a5760405162461bcd60e51b815260040161068c906134f3565b8360c00151518460a0015151146114535760405162461bcd60e51b815260040161068c90613548565b8360e00151518460a00151511461147c5760405162461bcd60e51b815260040161068c90613591565b836101000151518460a0015151146114a65760405162461bcd60e51b815260040161068c906135dc565b602084015151156115725760005b846020015151811015611570576114c96108cc565b6001600160a01b0316638a43157883876020015184815181106114ee576114ee613627565b60200260200101518860400151858151811061150c5761150c613627565b60200260200101516040518463ffffffff1660e01b815260040161153293929190613679565b600060405180830381600087803b15801561154c57600080fd5b505af1158015611560573d6000803e3d6000fd5b5050600190920191506114b49050565b505b6060840151511561163e5760005b84606001515181101561163c576115956108cc565b6001600160a01b0316631663c12183876060015184815181106115ba576115ba613627565b6020026020010151886080015185815181106115d8576115d8613627565b60200260200101516040518463ffffffff1660e01b81526004016115fe939291906136ae565b600060405180830381600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b5050600190920191506115809050565b505b60a0840151511561175f5760005b8460a001515181101561175d576116616108cc565b6001600160a01b0316639dd4349b8360405180606001604052808960a00151868151811061169157611691613627565b602002602001015181526020018960c0015186815181106116b4576116b4613627565b602002602001015181526020018960e0015186815181106116d7576116d7613627565b602002602001015181525088610100015185815181106116f9576116f9613627565b60200260200101516040518463ffffffff1660e01b815260040161171f939291906136e1565b600060405180830381600087803b15801561173957600080fd5b505af115801561174d573d6000803e3d6000fd5b50506001909201915061164c9050565b505b60006117696108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b815260040161179691815260200190565b602060405180830381865afa1580156117b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d79190613397565b905084610120015115611879576117ec6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611827578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611846939291906136ae565b600060405180830381600087803b15801561186057600080fd5b505af1158015611874573d6000803e3d6000fd5b505050505b846101400151156118f25761188c611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b81526004016118bb9392919061373f565b600060405180830381600087803b1580156118d557600080fd5b505af11580156118e9573d6000803e3d6000fd5b5050505061195c565b6118fa611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b81526004016119299392919061373f565b600060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050505b50949350505050565b60025460408051632c0b8bf760e01b815290516000926001600160a01b031691638e8dfd16918391632c0b8bf79160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6119c0826106ba565b6119c981612207565b6108c7838361227c565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a49919061336a565b60025460405160e084901b6001600160e01b0319168152611a789291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab99190613397565b6001600160a01b0316336001600160a01b031614611ae95760405162461bcd60e51b815260040161068c906133b4565b6000611af3611965565b6001600160a01b0316637ff00d2e348d8d6040518463ffffffff1660e01b8152600401611b21929190613484565b60206040518083038185885af1158015611b3f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b64919061336a565b90508751895114611b875760405162461bcd60e51b815260040161068c90613548565b8651895114611ba85760405162461bcd60e51b815260040161068c90613591565b8551895114611bc95760405162461bcd60e51b815260040161068c906135dc565b885115611cd15760005b8951811015611ccf57611be46108cc565b6001600160a01b0316639dd4349b8360405180606001604052808e8681518110611c1057611c10613627565b602002602001015181526020018d8681518110611c2f57611c2f613627565b602002602001015181526020018c8681518110611c4e57611c4e613627565b60200260200101518152508a8581518110611c6b57611c6b613627565b60200260200101516040518463ffffffff1660e01b8152600401611c91939291906136e1565b600060405180830381600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b505060019092019150611bd39050565b505b6000611cdb6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401611d0891815260200190565b602060405180830381865afa158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190613397565b90508415611de657611d596108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611d94578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611db3939291906136ae565b600060405180830381600087803b158015611dcd57600080fd5b505af1158015611de1573d6000803e3d6000fd5b505050505b8315611e5a57611df4611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401611e239392919061373f565b600060405180830381600087803b158015611e3d57600080fd5b505af1158015611e51573d6000803e3d6000fd5b50505050611ec4565b611e62611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b8152600401611e919392919061373f565b600060405180830381600087803b158015611eab57600080fd5b505af1158015611ebf573d6000803e3d6000fd5b505050505b855115611fce57611ed361099c565b6001600160a01b031663855eec228388600081518110611ef557611ef5613627565b60200260200101516040518363ffffffff1660e01b8152600401611f1a929190613484565b600060405180830381600087803b158015611f3457600080fd5b505af1158015611f48573d6000803e3d6000fd5b50505050611f5461099c565b6001600160a01b0316639000fee18388600181518110611f7657611f76613627565b60200260200101516040518363ffffffff1660e01b8152600401611f9b929190613484565b600060405180830381600087803b158015611fb557600080fd5b505af1158015611fc9573d6000803e3d6000fd5b505050505b509a9950505050505050505050565b6000806040518061018001604052808b81526020018a815260200160006001600160401b03811115612011576120116125d6565b60405190808252806020026020018201604052801561204457816020015b606081526020019060019003908161202f5790505b508152602001600060405190808252806020026020018201604052801561207f57816020015b606081526020019060019003908161206a5790505b50815260200160006040519080825280602002602001820160405280156120b0578160200160208202803683370190505b50815260200160006040519080825280602002602001820160405280156120eb57816020015b60608152602001906001900390816120d65790505b5081526020018981526020018881526020018781526020018681526020018515158152602001841515815250905061212281610a54565b9a9950505050505050505050565b6121386122e3565b6001600160a01b03811661219d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068c565b6121a681612342565b50565b6121b16122e3565b600280546001600160a01b0319166001600160a01b0383161790556040517f2760073c7cd8cac531d7f643becbfbb74d8b8156443eacf879622532dbbb3cd5906121fc9083906125c2565b60405180910390a150565b6121a68133612392565b61221b8282611298565b6109985760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6122868282611298565b156109985760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b336122ec611289565b6001600160a01b031614610a005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161068c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61239c8282611298565b610998576123a9816123eb565b6123b48360206123fd565b6040516020016123c5929190613803565b60408051601f198184030181529082905262461bcd60e51b825261068c91600401613872565b60606104956001600160a01b03831660145b6060600061240c83600261389b565b6124179060026138b2565b6001600160401b0381111561242e5761242e6125d6565b6040519080825280601f01601f191660200182016040528015612458576020820181803683370190505b509050600360fc1b8160008151811061247357612473613627565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106124a2576124a2613627565b60200101906001600160f81b031916908160001a90535060006124c684600261389b565b6124d19060016138b2565b90505b6001811115612549576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061250557612505613627565b1a60f81b82828151811061251b5761251b613627565b60200101906001600160f81b031916908160001a90535060049490941c93612542816138c5565b90506124d4565b5083156106b35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161068c565b6000602082840312156125aa57600080fd5b81356001600160e01b0319811681146106b357600080fd5b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561260e5761260e6125d6565b60405290565b60405161016081016001600160401b038111828210171561260e5761260e6125d6565b60405161018081016001600160401b038111828210171561260e5761260e6125d6565b60405160a081016001600160401b038111828210171561260e5761260e6125d6565b604051601f8201601f191681016001600160401b03811182821017156126a4576126a46125d6565b604052919050565b60006001600160401b038211156126c5576126c56125d6565b5060051b60200190565b600082601f8301126126e057600080fd5b81356126f36126ee826126ac565b61267c565b8082825260208201915060206060840286010192508583111561271557600080fd5b602085015b83811015612771576060818803121561273257600080fd5b61273a6125ec565b8135815260208083013590820152604082013560ff8116811461275c57600080fd5b6040820152835260209092019160600161271a565b5095945050505050565b6000806001600160401b03841115612795576127956125d6565b50601f8301601f19166020016127aa8161267c565b9150508281528383830111156127bf57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126127e757600080fd5b81356127f56126ee826126ac565b8082825260208201915060208360051b86010192508583111561281757600080fd5b602085015b838110156127715780356001600160401b0381111561283a57600080fd5b8601603f8101881361284b57600080fd5b61285d8860208301356040840161277b565b8452506020928301920161281c565b600082601f83011261287d57600080fd5b813561288b6126ee826126ac565b8082825260208201915060208360051b8601019250858311156128ad57600080fd5b602085015b838110156127715780358352602092830192016128b2565b600082601f8301126128db57600080fd5b81356128e96126ee826126ac565b8082825260208201915060208360051b86010192508583111561290b57600080fd5b602085015b838110156127715780356001600160401b0381111561292e57600080fd5b61293d886020838a010161286c565b84525060209283019201612910565b6001600160a01b03811681146121a657600080fd5b600082601f83011261297257600080fd5b81356129806126ee826126ac565b8082825260208201915060208360051b8601019250858311156129a257600080fd5b602085015b838110156127715780356129ba8161294c565b8352602092830192016129a7565b803580151581146129d857600080fd5b919050565b600061016082840312156129f057600080fd5b6129f8612614565b82358152905060208201356001600160401b03811115612a1757600080fd5b612a23848285016127d6565b60208301525060408201356001600160401b03811115612a4257600080fd5b612a4e848285016128ca565b60408301525060608201356001600160401b03811115612a6d57600080fd5b612a7984828501612961565b60608301525060808201356001600160401b03811115612a9857600080fd5b612aa4848285016128ca565b60808301525060a08201356001600160401b03811115612ac357600080fd5b612acf8482850161286c565b60a08301525060c08201356001600160401b03811115612aee57600080fd5b612afa848285016127d6565b60c08301525060e08201356001600160401b03811115612b1957600080fd5b612b25848285016127d6565b60e0830152506101008201356001600160401b03811115612b4557600080fd5b612b51848285016128ca565b61010083015250612b6561012083016129c8565b610120820152612b7861014083016129c8565b61014082015292915050565b60008060408385031215612b9757600080fd5b82356001600160401b03811115612bad57600080fd5b830160608186031215612bbf57600080fd5b612bc76125ec565b813581526020808301359082015260408201356001600160401b03811115612bee57600080fd5b612bfa878285016126cf565b60408301525092505060208301356001600160401b03811115612c1c57600080fd5b612c28858286016129dd565b9150509250929050565b600080600080600060808688031215612c4a57600080fd5b8535612c558161294c565b94506020860135612c658161294c565b93506040860135925060608601356001600160401b03811115612c8757600080fd5b8601601f81018813612c9857600080fd5b80356001600160401b03811115612cae57600080fd5b886020828401011115612cc057600080fd5b959894975092955050506020019190565b600060208284031215612ce357600080fd5b5035919050565b60008060408385031215612cfd57600080fd5b823591506020830135612d0f8161294c565b809150509250929050565b600082601f830112612d2b57600080fd5b6106b38383356020850161277b565b600060208284031215612d4c57600080fd5b81356001600160401b03811115612d6257600080fd5b82016101808185031215612d7557600080fd5b612d7d612637565b8135815260208201356001600160401b03811115612d9a57600080fd5b612da686828501612d1a565b60208301525060408201356001600160401b03811115612dc557600080fd5b612dd1868285016127d6565b60408301525060608201356001600160401b03811115612df057600080fd5b612dfc868285016128ca565b60608301525060808201356001600160401b03811115612e1b57600080fd5b612e2786828501612961565b60808301525060a08201356001600160401b03811115612e4657600080fd5b612e52868285016128ca565b60a08301525060c08201356001600160401b03811115612e7157600080fd5b612e7d8682850161286c565b60c08301525060e08201356001600160401b03811115612e9c57600080fd5b612ea8868285016127d6565b60e0830152506101008201356001600160401b03811115612ec857600080fd5b612ed4868285016127d6565b610100830152506101208201356001600160401b03811115612ef557600080fd5b612f01868285016128ca565b61012083015250612f1561014083016129c8565b610140820152612f2861016083016129c8565b610160820152949350505050565b600082601f830112612f4757600080fd5b8135612f556126ee826126ac565b8082825260208201915060208360051b860101925085831115612f7757600080fd5b602085015b838110156127715780356001600160401b03811115612f9a57600080fd5b612fa9886020838a0101612d1a565b84525060209283019201612f7c565b60008060408385031215612fcb57600080fd5b8235915060208301356001600160401b03811115612fe857600080fd5b612c2885828601612f36565b6000806040838503121561300757600080fd5b82356001600160401b0381111561301d57600080fd5b830160a0818603121561302f57600080fd5b61303761265a565b8135815260208201356001600160401b0381111561305457600080fd5b61306087828501612d1a565b6020830152506040828101359082015260608201356001600160401b0381111561308957600080fd5b613095878285016126cf565b606083015250608082013591506130ab8261294c565b6080810191909152915060208301356001600160401b03811115612c1c57600080fd5b600381106130ec57634e487b7160e01b600052602160045260246000fd5b9052565b6020810161049582846130ce565b60008060008060008060008060006101208a8c03121561311d57600080fd5b8935985060208a01356001600160401b0381111561313a57600080fd5b6131468c828d01612d1a565b98505060408a01356001600160401b0381111561316257600080fd5b61316e8c828d0161286c565b97505060608a01356001600160401b0381111561318a57600080fd5b6131968c828d016127d6565b96505060808a01356001600160401b038111156131b257600080fd5b6131be8c828d016127d6565b95505060a08a01356001600160401b038111156131da57600080fd5b6131e68c828d016128ca565b94505060c08a01356001600160401b0381111561320257600080fd5b61320e8c828d01612f36565b93505061321d60e08b016129c8565b915061322c6101008b016129c8565b90509295985092959850929598565b600080600080600080600080610100898b03121561325857600080fd5b8835975060208901356001600160401b0381111561327557600080fd5b6132818b828c01612d1a565b97505060408901356001600160401b0381111561329d57600080fd5b6132a98b828c0161286c565b96505060608901356001600160401b038111156132c557600080fd5b6132d18b828c016127d6565b95505060808901356001600160401b038111156132ed57600080fd5b6132f98b828c016127d6565b94505060a08901356001600160401b0381111561331557600080fd5b6133218b828c016128ca565b93505061333060c08a016129c8565b915061333e60e08a016129c8565b90509295985092959890939650565b60006020828403121561335f57600080fd5b81356106b38161294c565b60006020828403121561337c57600080fd5b5051919050565b828152604081016106b360208301846130ce565b6000602082840312156133a957600080fd5b81516106b38161294c565b6020808252605a908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f6060820152796d61696e2077616c6c6574732c2077686f2061726520796f753f60301b608082015260a00190565b60005b8381101561344f578181015183820152602001613437565b50506000910152565b60008151808452613470816020860160208601613434565b601f01601f19169290920160200192915050565b8281526040602082015260006105fb6040830184613458565b60208082526036908201527f504b5048656c7065723a20697066732063696420616e642073636f70652061726040820152750e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d60531b606082015260800190565b60208082526035908201527f504b5048656c7065723a206164647265737320616e642073636f7065206172726040820152740c2f240d8cadccee8d0e640daeae6e840dac2e8c6d605b1b606082015260800190565b6020808252603b908201526000805160206138dd83398151915260408201527a0d2c840c2e4e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d602b1b606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f7075626b6579206172726179206c656e67746873206d757374206d6174636800606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f73636f706573206172726179206c656e67746873206d757374206d6174636800606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020840193506020830160005b8281101561366f578151865260209586019590910190600101613651565b5093949350505050565b8381526060602082015260006136926060830185613458565b82810360408401526136a4818561363d565b9695505050505050565b8381526001600160a01b03831660208201526060604082018190526000906136d89083018461363d565b95945050505050565b8381526060602082015282516060820152600060208401516060608084015261370d60c0840182613458565b90506040850151605f198483030160a085015261372a8282613458565b91505082810360408401526136a4818561363d565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015260c06040820152600061378260c0830187613458565b6060830186905282810360808401528451808252602080870192019060005b818110156137de578351805184526020810151602085015260ff6040820151166040850152506060830192506020840193506001810190506137a1565b50506001600160a01b03851660a085015291506137f89050565b979650505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351613835816017850160208801613434565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613866816028840160208801613434565b01602801949350505050565b6020815260006106b36020830184613458565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761049557610495613885565b8082018082111561049557610495613885565b6000816138d4576138d4613885565b50600019019056fe504b5048656c7065723a2061757468206d6574686f64207479706520616e6420a26469706673582212206ed3a9765d6e7b1d8f7560e6b2760172ce6cf0f560518a132fc0cd9f1a58b8f864736f6c634300081c0033", + "deployedBytecode": "0x60806040526004361061014c5760003560e01c806373cc4111116100bc57806373cc4111146102f6578063778fe5721461030b578063782e2ea51461031e5780638da5cb5b1461033e57806391d148541461035357806391ee4fd5146103735780639dca003214610386578063a217fddf146103b4578063caead0c7146103c9578063d547741f146103de578063db0bf933146103fe578063e4f11df614610411578063f2fde38b14610424578063f95d71b11461044457600080fd5b806301ffc9a7146101515780630e9ed68b1461018657806313af411b146101a8578063150b7a02146101c9578063202f724f14610202578063248a9ca3146102155780632b553551146102355780632f2ff15d146102575780633276558c1461027757806336568abe1461028c5780635043026c146102ac57806350d17b5e146102c1578063715018a6146102e1575b600080fd5b34801561015d57600080fd5b5061017161016c366004612598565b610464565b60405190151581526020015b60405180910390f35b34801561019257600080fd5b5061019b61049b565b60405161017d91906125c2565b6101bb6101b6366004612b84565b610586565b60405190815260200161017d565b3480156101d557600080fd5b506101e96101e4366004612c32565b610603565b6040516001600160e01b0319909116815260200161017d565b6101bb610210366004612b84565b6106a7565b34801561022157600080fd5b506101bb610230366004612cd1565b6106ba565b34801561024157600080fd5b50610255610250366004612cd1565b6106d0565b005b34801561026357600080fd5b50610255610272366004612cea565b6108ab565b34801561028357600080fd5b5061019b6108cc565b34801561029857600080fd5b506102556102a7366004612cea565b61091e565b3480156102b857600080fd5b5061019b61099c565b3480156102cd57600080fd5b5060025461019b906001600160a01b031681565b3480156102ed57600080fd5b506102556109ee565b34801561030257600080fd5b5061019b610a02565b6101bb610319366004612d3a565b610a54565b34801561032a57600080fd5b50610255610339366004612fb8565b611066565b34801561034a57600080fd5b5061019b611289565b34801561035f57600080fd5b5061017161036e366004612cea565b611298565b6101bb610381366004612ff4565b6112c3565b34801561039257600080fd5b506002546103a790600160a01b900460ff1681565b60405161017d91906130f0565b3480156103c057600080fd5b506101bb600081565b3480156103d557600080fd5b5061019b611965565b3480156103ea57600080fd5b506102556103f9366004612cea565b6119b7565b6101bb61040c3660046130fe565b6119d3565b6101bb61041f36600461323b565b611fdd565b34801561043057600080fd5b5061025561043f36600461334d565b612130565b34801561045057600080fd5b5061025561045f36600461334d565b6121a9565b60006001600160e01b03198216637965db0b60e01b148061049557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002546040805163da19ddfb60e01b815290516000926001600160a01b031691638e8dfd1691839163da19ddfb9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610511919061336a565b60025460405160e084901b6001600160e01b03191681526105409291600160a01b900460ff1690600401613383565b602060405180830381865afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190613397565b905090565b6000806040518060a00160405280856000015181526020016040518060400160405280600c81526020016b6e6167612d6b65797365743160a01b815250815260200185602001518152602001856040015181526020016105e461049b565b6001600160a01b0316905290506105fb81846112c3565b949350505050565b600061060d611965565b6001600160a01b0316336001600160a01b0316146106955760405162461bcd60e51b815260206004820152603a60248201527f504b5048656c7065723a206f6e6c792061636365707473207472616e736665726044820152791cc8199c9bdb481d1a19481412d41391950818dbdb9d1c9858dd60321b60648201526084015b60405180910390fd5b50630a85bd0160e11b95945050505050565b60006106b38383610586565b9392505050565b6000908152600160208190526040909120015490565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa158015610722573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610746919061336a565b60025460405160e084901b6001600160e01b03191681526107759291600160a01b900460ff1690600401613383565b602060405180830381865afa158015610792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b69190613397565b6001600160a01b0316336001600160a01b0316146107e65760405162461bcd60e51b815260040161068c906133b4565b60006107f061099c565b60405163b63a767760e01b8152600481018490529091506001600160a01b0382169063b63a767790602401600060405180830381600087803b15801561083557600080fd5b505af1158015610849573d6000803e3d6000fd5b50506040516328cd10c760e11b8152600481018590526001600160a01b038416925063519a218e9150602401600060405180830381600087803b15801561088f57600080fd5b505af11580156108a3573d6000803e3d6000fd5b505050505050565b6108b4826106ba565b6108bd81612207565b6108c78383612211565b505050565b6002546040805163120e5f0760e31b815290516000926001600160a01b031691638e8dfd16918391639072f8389160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6001600160a01b038116331461098e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161068c565b610998828261227c565b5050565b600254604080516316f76bbf60e01b815290516000926001600160a01b031691638e8dfd169183916316f76bbf9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6109f66122e3565b610a006000612342565b565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b600080610a5f611965565b83516020850151604051633ff8069760e11b81526001600160a01b039390931692637ff00d2e923492610a9492600401613484565b60206040518083038185885af1158015610ab2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ad7919061336a565b905082606001515183604001515114610b025760405162461bcd60e51b815260040161068c9061349d565b8260a001515183608001515114610b2b5760405162461bcd60e51b815260040161068c906134f3565b8260e00151518360c001515114610b545760405162461bcd60e51b815260040161068c90613548565b826101000151518360c001515114610b7e5760405162461bcd60e51b815260040161068c90613591565b826101200151518360c001515114610ba85760405162461bcd60e51b815260040161068c906135dc565b60408301515115610c745760005b836040015151811015610c7257610bcb6108cc565b6001600160a01b0316638a4315788386604001518481518110610bf057610bf0613627565b602002602001015187606001518581518110610c0e57610c0e613627565b60200260200101516040518463ffffffff1660e01b8152600401610c3493929190613679565b600060405180830381600087803b158015610c4e57600080fd5b505af1158015610c62573d6000803e3d6000fd5b505060019092019150610bb69050565b505b60808301515115610d405760005b836080015151811015610d3e57610c976108cc565b6001600160a01b0316631663c1218386608001518481518110610cbc57610cbc613627565b60200260200101518760a001518581518110610cda57610cda613627565b60200260200101516040518463ffffffff1660e01b8152600401610d00939291906136ae565b600060405180830381600087803b158015610d1a57600080fd5b505af1158015610d2e573d6000803e3d6000fd5b505060019092019150610c829050565b505b60c08301515115610e625760005b8360c0015151811015610e6057610d636108cc565b6001600160a01b0316639dd4349b8360405180606001604052808860c001518681518110610d9357610d93613627565b602002602001015181526020018860e001518681518110610db657610db6613627565b602002602001015181526020018861010001518681518110610dda57610dda613627565b60200260200101518152508761012001518581518110610dfc57610dfc613627565b60200260200101516040518463ffffffff1660e01b8152600401610e22939291906136e1565b600060405180830381600087803b158015610e3c57600080fd5b505af1158015610e50573d6000803e3d6000fd5b505060019092019150610d4e9050565b505b6000610e6c6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401610e9991815260200190565b602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190613397565b905083610140015115610f7c57610eef6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015610f2a578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401610f49939291906136ae565b600060405180830381600087803b158015610f6357600080fd5b505af1158015610f77573d6000803e3d6000fd5b505050505b83610160015115610ff557610f8f611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401610fbe9392919061373f565b600060405180830381600087803b158015610fd857600080fd5b505af1158015610fec573d6000803e3d6000fd5b5050505061105f565b610ffd611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b815260040161102c9392919061373f565b600060405180830381600087803b15801561104657600080fd5b505af115801561105a573d6000803e3d6000fd5b505050505b5092915050565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa1580156110b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dc919061336a565b60025460405160e084901b6001600160e01b031916815261110b9291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c9190613397565b6001600160a01b0316336001600160a01b03161461117c5760405162461bcd60e51b815260040161068c906133b4565b600061118661099c565b8251909150156108c757806001600160a01b031663855eec2284846000815181106111b3576111b3613627565b60200260200101516040518363ffffffff1660e01b81526004016111d8929190613484565b600060405180830381600087803b1580156111f257600080fd5b505af1158015611206573d6000803e3d6000fd5b50505050806001600160a01b0316639000fee1848460018151811061122d5761122d613627565b60200260200101516040518363ffffffff1660e01b8152600401611252929190613484565b600060405180830381600087803b15801561126c57600080fd5b505af1158015611280573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b805182516000911461133d5760405162461bcd60e51b815260206004820152603e60248201527f504b5048656c7065723a20436c61696d206b65792074797065206d757374206d60448201527f617463682041757468204d6574686f642064617461206b657920747970650000606482015260840161068c565b60016000611349611965565b6001600160a01b03166371aa9acf3484886000015189602001518a604001518b606001518c608001516040518863ffffffff1660e01b815260040161139396959493929190613763565b60206040518083038185885af11580156113b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113d6919061336a565b9050836040015151846020015151146114015760405162461bcd60e51b815260040161068c9061349d565b8360800151518460600151511461142a5760405162461bcd60e51b815260040161068c906134f3565b8360c00151518460a0015151146114535760405162461bcd60e51b815260040161068c90613548565b8360e00151518460a00151511461147c5760405162461bcd60e51b815260040161068c90613591565b836101000151518460a0015151146114a65760405162461bcd60e51b815260040161068c906135dc565b602084015151156115725760005b846020015151811015611570576114c96108cc565b6001600160a01b0316638a43157883876020015184815181106114ee576114ee613627565b60200260200101518860400151858151811061150c5761150c613627565b60200260200101516040518463ffffffff1660e01b815260040161153293929190613679565b600060405180830381600087803b15801561154c57600080fd5b505af1158015611560573d6000803e3d6000fd5b5050600190920191506114b49050565b505b6060840151511561163e5760005b84606001515181101561163c576115956108cc565b6001600160a01b0316631663c12183876060015184815181106115ba576115ba613627565b6020026020010151886080015185815181106115d8576115d8613627565b60200260200101516040518463ffffffff1660e01b81526004016115fe939291906136ae565b600060405180830381600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b5050600190920191506115809050565b505b60a0840151511561175f5760005b8460a001515181101561175d576116616108cc565b6001600160a01b0316639dd4349b8360405180606001604052808960a00151868151811061169157611691613627565b602002602001015181526020018960c0015186815181106116b4576116b4613627565b602002602001015181526020018960e0015186815181106116d7576116d7613627565b602002602001015181525088610100015185815181106116f9576116f9613627565b60200260200101516040518463ffffffff1660e01b815260040161171f939291906136e1565b600060405180830381600087803b15801561173957600080fd5b505af115801561174d573d6000803e3d6000fd5b50506001909201915061164c9050565b505b60006117696108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b815260040161179691815260200190565b602060405180830381865afa1580156117b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d79190613397565b905084610120015115611879576117ec6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611827578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611846939291906136ae565b600060405180830381600087803b15801561186057600080fd5b505af1158015611874573d6000803e3d6000fd5b505050505b846101400151156118f25761188c611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b81526004016118bb9392919061373f565b600060405180830381600087803b1580156118d557600080fd5b505af11580156118e9573d6000803e3d6000fd5b5050505061195c565b6118fa611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b81526004016119299392919061373f565b600060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050505b50949350505050565b60025460408051632c0b8bf760e01b815290516000926001600160a01b031691638e8dfd16918391632c0b8bf79160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6119c0826106ba565b6119c981612207565b6108c7838361227c565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a49919061336a565b60025460405160e084901b6001600160e01b0319168152611a789291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab99190613397565b6001600160a01b0316336001600160a01b031614611ae95760405162461bcd60e51b815260040161068c906133b4565b6000611af3611965565b6001600160a01b0316637ff00d2e348d8d6040518463ffffffff1660e01b8152600401611b21929190613484565b60206040518083038185885af1158015611b3f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b64919061336a565b90508751895114611b875760405162461bcd60e51b815260040161068c90613548565b8651895114611ba85760405162461bcd60e51b815260040161068c90613591565b8551895114611bc95760405162461bcd60e51b815260040161068c906135dc565b885115611cd15760005b8951811015611ccf57611be46108cc565b6001600160a01b0316639dd4349b8360405180606001604052808e8681518110611c1057611c10613627565b602002602001015181526020018d8681518110611c2f57611c2f613627565b602002602001015181526020018c8681518110611c4e57611c4e613627565b60200260200101518152508a8581518110611c6b57611c6b613627565b60200260200101516040518463ffffffff1660e01b8152600401611c91939291906136e1565b600060405180830381600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b505060019092019150611bd39050565b505b6000611cdb6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401611d0891815260200190565b602060405180830381865afa158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190613397565b90508415611de657611d596108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611d94578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611db3939291906136ae565b600060405180830381600087803b158015611dcd57600080fd5b505af1158015611de1573d6000803e3d6000fd5b505050505b8315611e5a57611df4611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401611e239392919061373f565b600060405180830381600087803b158015611e3d57600080fd5b505af1158015611e51573d6000803e3d6000fd5b50505050611ec4565b611e62611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b8152600401611e919392919061373f565b600060405180830381600087803b158015611eab57600080fd5b505af1158015611ebf573d6000803e3d6000fd5b505050505b855115611fce57611ed361099c565b6001600160a01b031663855eec228388600081518110611ef557611ef5613627565b60200260200101516040518363ffffffff1660e01b8152600401611f1a929190613484565b600060405180830381600087803b158015611f3457600080fd5b505af1158015611f48573d6000803e3d6000fd5b50505050611f5461099c565b6001600160a01b0316639000fee18388600181518110611f7657611f76613627565b60200260200101516040518363ffffffff1660e01b8152600401611f9b929190613484565b600060405180830381600087803b158015611fb557600080fd5b505af1158015611fc9573d6000803e3d6000fd5b505050505b509a9950505050505050505050565b6000806040518061018001604052808b81526020018a815260200160006001600160401b03811115612011576120116125d6565b60405190808252806020026020018201604052801561204457816020015b606081526020019060019003908161202f5790505b508152602001600060405190808252806020026020018201604052801561207f57816020015b606081526020019060019003908161206a5790505b50815260200160006040519080825280602002602001820160405280156120b0578160200160208202803683370190505b50815260200160006040519080825280602002602001820160405280156120eb57816020015b60608152602001906001900390816120d65790505b5081526020018981526020018881526020018781526020018681526020018515158152602001841515815250905061212281610a54565b9a9950505050505050505050565b6121386122e3565b6001600160a01b03811661219d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068c565b6121a681612342565b50565b6121b16122e3565b600280546001600160a01b0319166001600160a01b0383161790556040517f2760073c7cd8cac531d7f643becbfbb74d8b8156443eacf879622532dbbb3cd5906121fc9083906125c2565b60405180910390a150565b6121a68133612392565b61221b8282611298565b6109985760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6122868282611298565b156109985760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b336122ec611289565b6001600160a01b031614610a005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161068c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61239c8282611298565b610998576123a9816123eb565b6123b48360206123fd565b6040516020016123c5929190613803565b60408051601f198184030181529082905262461bcd60e51b825261068c91600401613872565b60606104956001600160a01b03831660145b6060600061240c83600261389b565b6124179060026138b2565b6001600160401b0381111561242e5761242e6125d6565b6040519080825280601f01601f191660200182016040528015612458576020820181803683370190505b509050600360fc1b8160008151811061247357612473613627565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106124a2576124a2613627565b60200101906001600160f81b031916908160001a90535060006124c684600261389b565b6124d19060016138b2565b90505b6001811115612549576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061250557612505613627565b1a60f81b82828151811061251b5761251b613627565b60200101906001600160f81b031916908160001a90535060049490941c93612542816138c5565b90506124d4565b5083156106b35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161068c565b6000602082840312156125aa57600080fd5b81356001600160e01b0319811681146106b357600080fd5b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561260e5761260e6125d6565b60405290565b60405161016081016001600160401b038111828210171561260e5761260e6125d6565b60405161018081016001600160401b038111828210171561260e5761260e6125d6565b60405160a081016001600160401b038111828210171561260e5761260e6125d6565b604051601f8201601f191681016001600160401b03811182821017156126a4576126a46125d6565b604052919050565b60006001600160401b038211156126c5576126c56125d6565b5060051b60200190565b600082601f8301126126e057600080fd5b81356126f36126ee826126ac565b61267c565b8082825260208201915060206060840286010192508583111561271557600080fd5b602085015b83811015612771576060818803121561273257600080fd5b61273a6125ec565b8135815260208083013590820152604082013560ff8116811461275c57600080fd5b6040820152835260209092019160600161271a565b5095945050505050565b6000806001600160401b03841115612795576127956125d6565b50601f8301601f19166020016127aa8161267c565b9150508281528383830111156127bf57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126127e757600080fd5b81356127f56126ee826126ac565b8082825260208201915060208360051b86010192508583111561281757600080fd5b602085015b838110156127715780356001600160401b0381111561283a57600080fd5b8601603f8101881361284b57600080fd5b61285d8860208301356040840161277b565b8452506020928301920161281c565b600082601f83011261287d57600080fd5b813561288b6126ee826126ac565b8082825260208201915060208360051b8601019250858311156128ad57600080fd5b602085015b838110156127715780358352602092830192016128b2565b600082601f8301126128db57600080fd5b81356128e96126ee826126ac565b8082825260208201915060208360051b86010192508583111561290b57600080fd5b602085015b838110156127715780356001600160401b0381111561292e57600080fd5b61293d886020838a010161286c565b84525060209283019201612910565b6001600160a01b03811681146121a657600080fd5b600082601f83011261297257600080fd5b81356129806126ee826126ac565b8082825260208201915060208360051b8601019250858311156129a257600080fd5b602085015b838110156127715780356129ba8161294c565b8352602092830192016129a7565b803580151581146129d857600080fd5b919050565b600061016082840312156129f057600080fd5b6129f8612614565b82358152905060208201356001600160401b03811115612a1757600080fd5b612a23848285016127d6565b60208301525060408201356001600160401b03811115612a4257600080fd5b612a4e848285016128ca565b60408301525060608201356001600160401b03811115612a6d57600080fd5b612a7984828501612961565b60608301525060808201356001600160401b03811115612a9857600080fd5b612aa4848285016128ca565b60808301525060a08201356001600160401b03811115612ac357600080fd5b612acf8482850161286c565b60a08301525060c08201356001600160401b03811115612aee57600080fd5b612afa848285016127d6565b60c08301525060e08201356001600160401b03811115612b1957600080fd5b612b25848285016127d6565b60e0830152506101008201356001600160401b03811115612b4557600080fd5b612b51848285016128ca565b61010083015250612b6561012083016129c8565b610120820152612b7861014083016129c8565b61014082015292915050565b60008060408385031215612b9757600080fd5b82356001600160401b03811115612bad57600080fd5b830160608186031215612bbf57600080fd5b612bc76125ec565b813581526020808301359082015260408201356001600160401b03811115612bee57600080fd5b612bfa878285016126cf565b60408301525092505060208301356001600160401b03811115612c1c57600080fd5b612c28858286016129dd565b9150509250929050565b600080600080600060808688031215612c4a57600080fd5b8535612c558161294c565b94506020860135612c658161294c565b93506040860135925060608601356001600160401b03811115612c8757600080fd5b8601601f81018813612c9857600080fd5b80356001600160401b03811115612cae57600080fd5b886020828401011115612cc057600080fd5b959894975092955050506020019190565b600060208284031215612ce357600080fd5b5035919050565b60008060408385031215612cfd57600080fd5b823591506020830135612d0f8161294c565b809150509250929050565b600082601f830112612d2b57600080fd5b6106b38383356020850161277b565b600060208284031215612d4c57600080fd5b81356001600160401b03811115612d6257600080fd5b82016101808185031215612d7557600080fd5b612d7d612637565b8135815260208201356001600160401b03811115612d9a57600080fd5b612da686828501612d1a565b60208301525060408201356001600160401b03811115612dc557600080fd5b612dd1868285016127d6565b60408301525060608201356001600160401b03811115612df057600080fd5b612dfc868285016128ca565b60608301525060808201356001600160401b03811115612e1b57600080fd5b612e2786828501612961565b60808301525060a08201356001600160401b03811115612e4657600080fd5b612e52868285016128ca565b60a08301525060c08201356001600160401b03811115612e7157600080fd5b612e7d8682850161286c565b60c08301525060e08201356001600160401b03811115612e9c57600080fd5b612ea8868285016127d6565b60e0830152506101008201356001600160401b03811115612ec857600080fd5b612ed4868285016127d6565b610100830152506101208201356001600160401b03811115612ef557600080fd5b612f01868285016128ca565b61012083015250612f1561014083016129c8565b610140820152612f2861016083016129c8565b610160820152949350505050565b600082601f830112612f4757600080fd5b8135612f556126ee826126ac565b8082825260208201915060208360051b860101925085831115612f7757600080fd5b602085015b838110156127715780356001600160401b03811115612f9a57600080fd5b612fa9886020838a0101612d1a565b84525060209283019201612f7c565b60008060408385031215612fcb57600080fd5b8235915060208301356001600160401b03811115612fe857600080fd5b612c2885828601612f36565b6000806040838503121561300757600080fd5b82356001600160401b0381111561301d57600080fd5b830160a0818603121561302f57600080fd5b61303761265a565b8135815260208201356001600160401b0381111561305457600080fd5b61306087828501612d1a565b6020830152506040828101359082015260608201356001600160401b0381111561308957600080fd5b613095878285016126cf565b606083015250608082013591506130ab8261294c565b6080810191909152915060208301356001600160401b03811115612c1c57600080fd5b600381106130ec57634e487b7160e01b600052602160045260246000fd5b9052565b6020810161049582846130ce565b60008060008060008060008060006101208a8c03121561311d57600080fd5b8935985060208a01356001600160401b0381111561313a57600080fd5b6131468c828d01612d1a565b98505060408a01356001600160401b0381111561316257600080fd5b61316e8c828d0161286c565b97505060608a01356001600160401b0381111561318a57600080fd5b6131968c828d016127d6565b96505060808a01356001600160401b038111156131b257600080fd5b6131be8c828d016127d6565b95505060a08a01356001600160401b038111156131da57600080fd5b6131e68c828d016128ca565b94505060c08a01356001600160401b0381111561320257600080fd5b61320e8c828d01612f36565b93505061321d60e08b016129c8565b915061322c6101008b016129c8565b90509295985092959850929598565b600080600080600080600080610100898b03121561325857600080fd5b8835975060208901356001600160401b0381111561327557600080fd5b6132818b828c01612d1a565b97505060408901356001600160401b0381111561329d57600080fd5b6132a98b828c0161286c565b96505060608901356001600160401b038111156132c557600080fd5b6132d18b828c016127d6565b95505060808901356001600160401b038111156132ed57600080fd5b6132f98b828c016127d6565b94505060a08901356001600160401b0381111561331557600080fd5b6133218b828c016128ca565b93505061333060c08a016129c8565b915061333e60e08a016129c8565b90509295985092959890939650565b60006020828403121561335f57600080fd5b81356106b38161294c565b60006020828403121561337c57600080fd5b5051919050565b828152604081016106b360208301846130ce565b6000602082840312156133a957600080fd5b81516106b38161294c565b6020808252605a908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f6060820152796d61696e2077616c6c6574732c2077686f2061726520796f753f60301b608082015260a00190565b60005b8381101561344f578181015183820152602001613437565b50506000910152565b60008151808452613470816020860160208601613434565b601f01601f19169290920160200192915050565b8281526040602082015260006105fb6040830184613458565b60208082526036908201527f504b5048656c7065723a20697066732063696420616e642073636f70652061726040820152750e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d60531b606082015260800190565b60208082526035908201527f504b5048656c7065723a206164647265737320616e642073636f7065206172726040820152740c2f240d8cadccee8d0e640daeae6e840dac2e8c6d605b1b606082015260800190565b6020808252603b908201526000805160206138dd83398151915260408201527a0d2c840c2e4e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d602b1b606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f7075626b6579206172726179206c656e67746873206d757374206d6174636800606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f73636f706573206172726179206c656e67746873206d757374206d6174636800606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020840193506020830160005b8281101561366f578151865260209586019590910190600101613651565b5093949350505050565b8381526060602082015260006136926060830185613458565b82810360408401526136a4818561363d565b9695505050505050565b8381526001600160a01b03831660208201526060604082018190526000906136d89083018461363d565b95945050505050565b8381526060602082015282516060820152600060208401516060608084015261370d60c0840182613458565b90506040850151605f198483030160a085015261372a8282613458565b91505082810360408401526136a4818561363d565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015260c06040820152600061378260c0830187613458565b6060830186905282810360808401528451808252602080870192019060005b818110156137de578351805184526020810151602085015260ff6040820151166040850152506060830192506020840193506001810190506137a1565b50506001600160a01b03851660a085015291506137f89050565b979650505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351613835816017850160208801613434565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613866816028840160208801613434565b01602801949350505050565b6020815260006106b36020830184613458565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761049557610495613885565b8082018082111561049557610495613885565b6000816138d4576138d4613885565b50600019019056fe504b5048656c7065723a2061757468206d6574686f64207479706520616e6420a26469706673582212206ed3a9765d6e7b1d8f7560e6b2760172ce6cf0f560518a132fc0cd9f1a58b8f864736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/rust/lit-core/lit-blockchain-lite/abis/PKPNFTMetadata.json b/rust/lit-core/lit-blockchain-lite/abis/PKPNFTMetadata.json index f2f8bc79..6e0a3f49 100644 --- a/rust/lit-core/lit-blockchain-lite/abis/PKPNFTMetadata.json +++ b/rust/lit-core/lit-blockchain-lite/abis/PKPNFTMetadata.json @@ -156,8 +156,8 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600f57600080fd5b50604051611c7d380380611c7d833981016040819052602c916076565b600080546001600160a01b0384166001600160a01b03198216811783558392916001600160a81b03191617600160a01b836002811115606b57606b60bd565b0217905550505060d3565b60008060408385031215608857600080fd5b82516001600160a01b0381168114609e57600080fd5b60208401519092506003811060b257600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b611b9b806100e26000396000f3fe608060405234801561001057600080fd5b50600436106100785760003560e01c8063451d89fa1461007d57806350d17b5e146100a6578063519a218e146100d1578063855eec22146100e65780639000fee1146100f9578063950462ee1461010c5780639dca00321461011f578063b63a767714610140575b600080fd5b61009061008b366004610fb0565b610153565b60405161009d9190611010565b60405180910390f35b6000546100b9906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b6100e46100df366004611043565b61030c565b005b6100e46100f436600461105c565b610456565b6100e461010736600461105c565b610589565b61009061011a3660046110ce565b6106b7565b60005461013390600160a01b900460ff1681565b60405161009d919061114a565b6100e461014e366004611043565b6106f3565b6060600082516002610165919061116e565b6001600160401b0381111561017c5761017c610f02565b6040519080825280601f01601f1916602001820160405280156101a6576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b84518110156102e2578182518683815181106101f2576101f2611185565b0160200151610204919060f81c6111b1565b8151811061021457610214611185565b01602001516001600160f81b0319168361022f83600261116e565b8151811061023f5761023f611185565b60200101906001600160f81b031916908160001a90535081825186838151811061026b5761026b611185565b016020015161027d919060f81c6111c5565b8151811061028d5761028d611185565b01602001516001600160f81b031916836102a883600261116e565b6102b39060016111d9565b815181106102c3576102c3611185565b60200101906001600160f81b031916908160001a9053506001016101d4565b50816040516020016102f49190611208565b60405160208183030381529060405292505050919050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa15801561035e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103829190611232565b60005460405160e084901b6001600160e01b03191681526103b19291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156103ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f2919061125f565b6001600160a01b0316336001600160a01b03161461042b5760405162461bcd60e51b81526004016104229061127c565b60405180910390fd5b60408051602080820183526000808352848152600190915291909120906104529082611376565b5050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156104a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cc9190611232565b60005460405160e084901b6001600160e01b03191681526104fb9291600160a01b900460ff169060040161124b565b602060405180830381865afa158015610518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053c919061125f565b6001600160a01b0316336001600160a01b03161461056c5760405162461bcd60e51b81526004016104229061127c565b60008281526001602052604090206105848282611376565b505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156105db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ff9190611232565b60005460405160e084901b6001600160e01b031916815261062e9291600160a01b900460ff169060040161124b565b602060405180830381865afa15801561064b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066f919061125f565b6001600160a01b0316336001600160a01b03161461069f5760405162461bcd60e51b81526004016104229061127c565b60008281526002602052604090206105848282611376565b606060006106c6858585610830565b9050806040516020016106d99190611434565b6040516020818303038152906040529150505b9392505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190611232565b60005460405160e084901b6001600160e01b03191681526107989291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156107b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d9919061125f565b6001600160a01b0316336001600160a01b0316146108095760405162461bcd60e51b81526004016104229061127c565b60408051602080820183526000808352848152600290915291909120906104529082611376565b6060600060405180610480016040528061045681526020016116d061045691399050600061085d85610153565b9050600061086a85610a84565b9050600061087788610aa0565b600089815260016020526040812080549293509091610895906112ee565b80601f01602080910402602001604051908101604052809291908181526020018280546108c1906112ee565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b505050505090506000600260008b81526020019081526020016000208054610935906112ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610961906112ee565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b50505050509050815160001480156109c65750805115155b156109f257826040516020016109dc9190611479565b6040516020818303038152906040529150610a46565b815115801590610a0157508051155b15610a0d575084610a46565b8151158015610a1b57508051155b15610a465782604051602001610a319190611479565b60405160208183030381529060405291508590505b610a768282878787604051602001610a629594939291906114aa565b604051602081830303815290604052610b32565b9a9950505050505050505050565b6060610a9a6001600160a01b0383166014610c91565b92915050565b60606000610aad83610e2c565b60010190506000816001600160401b03811115610acc57610acc610f02565b6040519080825280601f01601f191660200182016040528015610af6576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610b0057509392505050565b60608151600003610b5157505060408051602081019091526000815290565b6000604051806060016040528060408152602001611b266040913990506000600384516002610b8091906111d9565b610b8a91906111b1565b610b9590600461116e565b6001600160401b03811115610bac57610bac610f02565b6040519080825280601f01601f191660200182016040528015610bd6576020820181803683370190505b50905060018201602082018586518701602081018051600082525b82841015610c4c576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450610bf1565b9052505085516003900660018114610c6b5760028114610c7e57610c86565b603d6001830353603d6002830353610c86565b603d60018303535b509195945050505050565b60606000610ca083600261116e565b610cab9060026111d9565b6001600160401b03811115610cc257610cc2610f02565b6040519080825280601f01601f191660200182016040528015610cec576020820181803683370190505b509050600360fc1b81600081518110610d0757610d07611185565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d3657610d36611185565b60200101906001600160f81b031916908160001a9053506000610d5a84600261116e565b610d659060016111d9565b90505b6001811115610ddd576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d9957610d99611185565b1a60f81b828281518110610daf57610daf611185565b60200101906001600160f81b031916908160001a90535060049490941c93610dd6816116b8565b9050610d68565b5083156106ec5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610422565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610e6b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b8310610e95576904ee2d6d415b85acef8160201b830492506020015b662386f26fc100008310610eb357662386f26fc10000830492506010015b6305f5e1008310610ecb576305f5e100830492506008015b6127108310610edf57612710830492506004015b60648310610ef1576064830492506002015b600a8310610a9a5760010192915050565b634e487b7160e01b600052604160045260246000fd5b6000806001600160401b03841115610f3257610f32610f02565b50604051601f19601f85018116603f011681018181106001600160401b0382111715610f6057610f60610f02565b604052838152905080828401851015610f7857600080fd5b83836020830137600060208583010152509392505050565b600082601f830112610fa157600080fd5b6106ec83833560208501610f18565b600060208284031215610fc257600080fd5b81356001600160401b03811115610fd857600080fd5b610fe484828501610f90565b949350505050565b60005b83811015611007578181015183820152602001610fef565b50506000910152565b602081526000825180602084015261102f816040850160208701610fec565b601f01601f19169190910160400192915050565b60006020828403121561105557600080fd5b5035919050565b6000806040838503121561106f57600080fd5b8235915060208301356001600160401b0381111561108c57600080fd5b8301601f8101851361109d57600080fd5b6110ac85823560208401610f18565b9150509250929050565b6001600160a01b03811681146110cb57600080fd5b50565b6000806000606084860312156110e357600080fd5b8335925060208401356001600160401b0381111561110057600080fd5b61110c86828701610f90565b925050604084013561111d816110b6565b809150509250925092565b6003811061114657634e487b7160e01b600052602160045260246000fd5b9052565b60208101610a9a8284611128565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a9a57610a9a611158565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826111c0576111c061119b565b500490565b6000826111d4576111d461119b565b500690565b80820180821115610a9a57610a9a611158565b600081516111fe818560208601610fec565b9290920192915050565b61060f60f31b815260008251611225816002850160208701610fec565b9190910160020192915050565b60006020828403121561124457600080fd5b5051919050565b828152604081016106ec6020830184611128565b60006020828403121561127157600080fd5b81516106ec816110b6565b6020808252604c908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f60608201526b6d61696e2077616c6c65747360a01b608082015260a00190565b600181811c9082168061130257607f821691505b60208210810361132257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561058457806000526020600020601f840160051c8101602085101561134f5750805b601f840160051c820191505b8181101561136f576000815560010161135b565b5050505050565b81516001600160401b0381111561138f5761138f610f02565b6113a38161139d84546112ee565b84611328565b6020601f8211600181146113d757600083156113bf5750848201515b600019600385901b1c1916600184901b17845561136f565b600084815260208120601f198516915b8281101561140757878501518255602094850194600190920191016113e7565b50848210156114255786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161146c81601d850160208701610fec565b91909101601d0192915050565b684c697420504b50202360b81b81526000825161149d816009850160208701610fec565b9190910160090192915050565b683d913730b6b2911d1160b91b815285516000906114cf816009850160208b01610fec565b7f222c20226465736372697074696f6e223a202254686973204e465420656e74696009918401918201527f746c65732074686520686f6c64657220746f207573652061204c69742050726f60298201527f746f636f6c20504b502c20616e6420746f206772616e7420616363657373207460498201527f6f206f7468657220757365727320616e64204c697420416374696f6e7320746f60698201527f20757365207468697320504b50222c22696d6167655f64617461223a20220000608982015286516115a48160a7840160208b01610fec565b6009818301019150507f222c2261747472696275746573223a205b7b2274726169745f74797065223a20609e8201527711283ab13634b19025b2bc911610113b30b63ab2911d101160411b60be8201526116ac61169c61169661165b61165561161060d687018c6111ec565b7f227d2c207b2274726169745f74797065223a20224554482057616c6c6574204181527232323932b9b9911610113b30b63ab2911d101160691b602082015260330190565b896111ec565b7f227d2c207b2274726169745f74797065223a2022546f6b656e204944222c20228152683b30b63ab2911d101160b91b602082015260290190565b866111ec565b63227d5d7d60e01b815260040190565b98975050505050505050565b6000816116c7576116c7611158565b50600019019056fe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130383027206865696768743d2731303830272066696c6c3d276e6f6e652720786d6c6e733a763d2768747470733a2f2f76656374612e696f2f6e616e6f273e3c7061746820643d274d3336332e303736203339322e323237732d2e3937372031382e3532342d33362e3837342037382e393437632d34312e3537362037302e3031382d34352e343831203135312e3937382d332e303137203232302e342038392e353231203134342e323435203333322e343831203134312e3532203432322e3535362e3038392033342e3833322d35342e3730372034342e3831362d3131372e3437392033322e3932342d3138312e323438203020302d32382e3831392d3133332e3134342d3132372e3233372d3231372e30393920312e35353320312e33303820352e3336392031392e31323220362e3130312032362e37323220322e3234312032332e3335342e3034352034372e3833382d372e3738372037302e3036322d352e3734362031362e33332d31332e3731312033302e3436372d32372e3137382034312e33363820302d332e3831312d2e3935342d31302e3633352d2e3937362d31322e3931382d2e3634342d34362e3530382d31382e3635392d38392e3538322d34382e3031312d3132352e3734332d32352e3634372d33312e3535322d36302e3831322d35332e3038392d39372e38342d36382e3933322e39333120332e31393120322e3636322031362e34313920322e3930362031392e30333320312e3930382032312e39353820322e3236332035322e3731332d2e3632312037342e363439732d372e3833322033332e3837382d31342e3535342035342e343431632d31302e3138342033312e3137352d32342e30352035342e3238352d34312e3632312038322e3030342d332e323420352e3039362d31322e3931332031392e3037382d31382e3038322032362e313436203020302d382e3839372d35362e3139312d34302e3636372d38372e393231682d2e3032327a272066696c6c3d2723303030272f3e3c7061746820643d274d3536322e352032372e32386c3431302e323739203233362e3837346331332e39323320382e3033392032322e352032322e3839352032322e352033382e393731763437332e373563302031362e3037362d382e3537372033302e3933322d32322e352033382e3937314c3536322e3520313035322e3732632d31332e39323320382e30342d33312e30373720382e30342d343520304c3130372e323231203831352e383436632d31332e3932332d382e3033392d32322e352d32322e3839352d32322e352d33382e393731762d3437332e37356134352034352030203020312032322e352d33382e3937314c3531372e352032372e323861343520343520302030203120343520307a27207374726f6b653d272330303027207374726f6b652d77696474683d2732342e3735272f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208f1399b085bffde06578f1dd04ad36217eed47fba06d75a31f5ce9e67151788264736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100785760003560e01c8063451d89fa1461007d57806350d17b5e146100a6578063519a218e146100d1578063855eec22146100e65780639000fee1146100f9578063950462ee1461010c5780639dca00321461011f578063b63a767714610140575b600080fd5b61009061008b366004610fb0565b610153565b60405161009d9190611010565b60405180910390f35b6000546100b9906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b6100e46100df366004611043565b61030c565b005b6100e46100f436600461105c565b610456565b6100e461010736600461105c565b610589565b61009061011a3660046110ce565b6106b7565b60005461013390600160a01b900460ff1681565b60405161009d919061114a565b6100e461014e366004611043565b6106f3565b6060600082516002610165919061116e565b6001600160401b0381111561017c5761017c610f02565b6040519080825280601f01601f1916602001820160405280156101a6576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b84518110156102e2578182518683815181106101f2576101f2611185565b0160200151610204919060f81c6111b1565b8151811061021457610214611185565b01602001516001600160f81b0319168361022f83600261116e565b8151811061023f5761023f611185565b60200101906001600160f81b031916908160001a90535081825186838151811061026b5761026b611185565b016020015161027d919060f81c6111c5565b8151811061028d5761028d611185565b01602001516001600160f81b031916836102a883600261116e565b6102b39060016111d9565b815181106102c3576102c3611185565b60200101906001600160f81b031916908160001a9053506001016101d4565b50816040516020016102f49190611208565b60405160208183030381529060405292505050919050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa15801561035e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103829190611232565b60005460405160e084901b6001600160e01b03191681526103b19291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156103ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f2919061125f565b6001600160a01b0316336001600160a01b03161461042b5760405162461bcd60e51b81526004016104229061127c565b60405180910390fd5b60408051602080820183526000808352848152600190915291909120906104529082611376565b5050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156104a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cc9190611232565b60005460405160e084901b6001600160e01b03191681526104fb9291600160a01b900460ff169060040161124b565b602060405180830381865afa158015610518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053c919061125f565b6001600160a01b0316336001600160a01b03161461056c5760405162461bcd60e51b81526004016104229061127c565b60008281526001602052604090206105848282611376565b505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156105db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ff9190611232565b60005460405160e084901b6001600160e01b031916815261062e9291600160a01b900460ff169060040161124b565b602060405180830381865afa15801561064b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066f919061125f565b6001600160a01b0316336001600160a01b03161461069f5760405162461bcd60e51b81526004016104229061127c565b60008281526002602052604090206105848282611376565b606060006106c6858585610830565b9050806040516020016106d99190611434565b6040516020818303038152906040529150505b9392505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190611232565b60005460405160e084901b6001600160e01b03191681526107989291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156107b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d9919061125f565b6001600160a01b0316336001600160a01b0316146108095760405162461bcd60e51b81526004016104229061127c565b60408051602080820183526000808352848152600290915291909120906104529082611376565b6060600060405180610480016040528061045681526020016116d061045691399050600061085d85610153565b9050600061086a85610a84565b9050600061087788610aa0565b600089815260016020526040812080549293509091610895906112ee565b80601f01602080910402602001604051908101604052809291908181526020018280546108c1906112ee565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b505050505090506000600260008b81526020019081526020016000208054610935906112ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610961906112ee565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b50505050509050815160001480156109c65750805115155b156109f257826040516020016109dc9190611479565b6040516020818303038152906040529150610a46565b815115801590610a0157508051155b15610a0d575084610a46565b8151158015610a1b57508051155b15610a465782604051602001610a319190611479565b60405160208183030381529060405291508590505b610a768282878787604051602001610a629594939291906114aa565b604051602081830303815290604052610b32565b9a9950505050505050505050565b6060610a9a6001600160a01b0383166014610c91565b92915050565b60606000610aad83610e2c565b60010190506000816001600160401b03811115610acc57610acc610f02565b6040519080825280601f01601f191660200182016040528015610af6576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610b0057509392505050565b60608151600003610b5157505060408051602081019091526000815290565b6000604051806060016040528060408152602001611b266040913990506000600384516002610b8091906111d9565b610b8a91906111b1565b610b9590600461116e565b6001600160401b03811115610bac57610bac610f02565b6040519080825280601f01601f191660200182016040528015610bd6576020820181803683370190505b50905060018201602082018586518701602081018051600082525b82841015610c4c576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450610bf1565b9052505085516003900660018114610c6b5760028114610c7e57610c86565b603d6001830353603d6002830353610c86565b603d60018303535b509195945050505050565b60606000610ca083600261116e565b610cab9060026111d9565b6001600160401b03811115610cc257610cc2610f02565b6040519080825280601f01601f191660200182016040528015610cec576020820181803683370190505b509050600360fc1b81600081518110610d0757610d07611185565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d3657610d36611185565b60200101906001600160f81b031916908160001a9053506000610d5a84600261116e565b610d659060016111d9565b90505b6001811115610ddd576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d9957610d99611185565b1a60f81b828281518110610daf57610daf611185565b60200101906001600160f81b031916908160001a90535060049490941c93610dd6816116b8565b9050610d68565b5083156106ec5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610422565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610e6b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b8310610e95576904ee2d6d415b85acef8160201b830492506020015b662386f26fc100008310610eb357662386f26fc10000830492506010015b6305f5e1008310610ecb576305f5e100830492506008015b6127108310610edf57612710830492506004015b60648310610ef1576064830492506002015b600a8310610a9a5760010192915050565b634e487b7160e01b600052604160045260246000fd5b6000806001600160401b03841115610f3257610f32610f02565b50604051601f19601f85018116603f011681018181106001600160401b0382111715610f6057610f60610f02565b604052838152905080828401851015610f7857600080fd5b83836020830137600060208583010152509392505050565b600082601f830112610fa157600080fd5b6106ec83833560208501610f18565b600060208284031215610fc257600080fd5b81356001600160401b03811115610fd857600080fd5b610fe484828501610f90565b949350505050565b60005b83811015611007578181015183820152602001610fef565b50506000910152565b602081526000825180602084015261102f816040850160208701610fec565b601f01601f19169190910160400192915050565b60006020828403121561105557600080fd5b5035919050565b6000806040838503121561106f57600080fd5b8235915060208301356001600160401b0381111561108c57600080fd5b8301601f8101851361109d57600080fd5b6110ac85823560208401610f18565b9150509250929050565b6001600160a01b03811681146110cb57600080fd5b50565b6000806000606084860312156110e357600080fd5b8335925060208401356001600160401b0381111561110057600080fd5b61110c86828701610f90565b925050604084013561111d816110b6565b809150509250925092565b6003811061114657634e487b7160e01b600052602160045260246000fd5b9052565b60208101610a9a8284611128565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a9a57610a9a611158565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826111c0576111c061119b565b500490565b6000826111d4576111d461119b565b500690565b80820180821115610a9a57610a9a611158565b600081516111fe818560208601610fec565b9290920192915050565b61060f60f31b815260008251611225816002850160208701610fec565b9190910160020192915050565b60006020828403121561124457600080fd5b5051919050565b828152604081016106ec6020830184611128565b60006020828403121561127157600080fd5b81516106ec816110b6565b6020808252604c908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f60608201526b6d61696e2077616c6c65747360a01b608082015260a00190565b600181811c9082168061130257607f821691505b60208210810361132257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561058457806000526020600020601f840160051c8101602085101561134f5750805b601f840160051c820191505b8181101561136f576000815560010161135b565b5050505050565b81516001600160401b0381111561138f5761138f610f02565b6113a38161139d84546112ee565b84611328565b6020601f8211600181146113d757600083156113bf5750848201515b600019600385901b1c1916600184901b17845561136f565b600084815260208120601f198516915b8281101561140757878501518255602094850194600190920191016113e7565b50848210156114255786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161146c81601d850160208701610fec565b91909101601d0192915050565b684c697420504b50202360b81b81526000825161149d816009850160208701610fec565b9190910160090192915050565b683d913730b6b2911d1160b91b815285516000906114cf816009850160208b01610fec565b7f222c20226465736372697074696f6e223a202254686973204e465420656e74696009918401918201527f746c65732074686520686f6c64657220746f207573652061204c69742050726f60298201527f746f636f6c20504b502c20616e6420746f206772616e7420616363657373207460498201527f6f206f7468657220757365727320616e64204c697420416374696f6e7320746f60698201527f20757365207468697320504b50222c22696d6167655f64617461223a20220000608982015286516115a48160a7840160208b01610fec565b6009818301019150507f222c2261747472696275746573223a205b7b2274726169745f74797065223a20609e8201527711283ab13634b19025b2bc911610113b30b63ab2911d101160411b60be8201526116ac61169c61169661165b61165561161060d687018c6111ec565b7f227d2c207b2274726169745f74797065223a20224554482057616c6c6574204181527232323932b9b9911610113b30b63ab2911d101160691b602082015260330190565b896111ec565b7f227d2c207b2274726169745f74797065223a2022546f6b656e204944222c20228152683b30b63ab2911d101160b91b602082015260290190565b866111ec565b63227d5d7d60e01b815260040190565b98975050505050505050565b6000816116c7576116c7611158565b50600019019056fe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130383027206865696768743d2731303830272066696c6c3d276e6f6e652720786d6c6e733a763d2768747470733a2f2f76656374612e696f2f6e616e6f273e3c7061746820643d274d3336332e303736203339322e323237732d2e3937372031382e3532342d33362e3837342037382e393437632d34312e3537362037302e3031382d34352e343831203135312e3937382d332e303137203232302e342038392e353231203134342e323435203333322e343831203134312e3532203432322e3535362e3038392033342e3833322d35342e3730372034342e3831362d3131372e3437392033322e3932342d3138312e323438203020302d32382e3831392d3133332e3134342d3132372e3233372d3231372e30393920312e35353320312e33303820352e3336392031392e31323220362e3130312032362e37323220322e3234312032332e3335342e3034352034372e3833382d372e3738372037302e3036322d352e3734362031362e33332d31332e3731312033302e3436372d32372e3137382034312e33363820302d332e3831312d2e3935342d31302e3633352d2e3937362d31322e3931382d2e3634342d34362e3530382d31382e3635392d38392e3538322d34382e3031312d3132352e3734332d32352e3634372d33312e3535322d36302e3831322d35332e3038392d39372e38342d36382e3933322e39333120332e31393120322e3636322031362e34313920322e3930362031392e30333320312e3930382032312e39353820322e3236332035322e3731332d2e3632312037342e363439732d372e3833322033332e3837382d31342e3535342035342e343431632d31302e3138342033312e3137352d32342e30352035342e3238352d34312e3632312038322e3030342d332e323420352e3039362d31322e3931332031392e3037382d31382e3038322032362e313436203020302d382e3839372d35362e3139312d34302e3636372d38372e393231682d2e3032327a272066696c6c3d2723303030272f3e3c7061746820643d274d3536322e352032372e32386c3431302e323739203233362e3837346331332e39323320382e3033392032322e352032322e3839352032322e352033382e393731763437332e373563302031362e3037362d382e3537372033302e3933322d32322e352033382e3937314c3536322e3520313035322e3732632d31332e39323320382e30342d33312e30373720382e30342d343520304c3130372e323231203831352e383436632d31332e3932332d382e3033392d32322e352d32322e3839352d32322e352d33382e393731762d3437332e37356134352034352030203020312032322e352d33382e3937314c3531372e352032372e323861343520343520302030203120343520307a27207374726f6b653d272330303027207374726f6b652d77696474683d2732342e3735272f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208f1399b085bffde06578f1dd04ad36217eed47fba06d75a31f5ce9e67151788264736f6c634300081c0033", + "bytecode": "0x6080604052348015600f57600080fd5b50604051611c7d380380611c7d833981016040819052602c916076565b600080546001600160a01b0384166001600160a01b03198216811783558392916001600160a81b03191617600160a01b836002811115606b57606b60bd565b0217905550505060d3565b60008060408385031215608857600080fd5b82516001600160a01b0381168114609e57600080fd5b60208401519092506003811060b257600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b611b9b806100e26000396000f3fe608060405234801561001057600080fd5b50600436106100785760003560e01c8063451d89fa1461007d57806350d17b5e146100a6578063519a218e146100d1578063855eec22146100e65780639000fee1146100f9578063950462ee1461010c5780639dca00321461011f578063b63a767714610140575b600080fd5b61009061008b366004610fb0565b610153565b60405161009d9190611010565b60405180910390f35b6000546100b9906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b6100e46100df366004611043565b61030c565b005b6100e46100f436600461105c565b610456565b6100e461010736600461105c565b610589565b61009061011a3660046110ce565b6106b7565b60005461013390600160a01b900460ff1681565b60405161009d919061114a565b6100e461014e366004611043565b6106f3565b6060600082516002610165919061116e565b6001600160401b0381111561017c5761017c610f02565b6040519080825280601f01601f1916602001820160405280156101a6576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b84518110156102e2578182518683815181106101f2576101f2611185565b0160200151610204919060f81c6111b1565b8151811061021457610214611185565b01602001516001600160f81b0319168361022f83600261116e565b8151811061023f5761023f611185565b60200101906001600160f81b031916908160001a90535081825186838151811061026b5761026b611185565b016020015161027d919060f81c6111c5565b8151811061028d5761028d611185565b01602001516001600160f81b031916836102a883600261116e565b6102b39060016111d9565b815181106102c3576102c3611185565b60200101906001600160f81b031916908160001a9053506001016101d4565b50816040516020016102f49190611208565b60405160208183030381529060405292505050919050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa15801561035e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103829190611232565b60005460405160e084901b6001600160e01b03191681526103b19291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156103ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f2919061125f565b6001600160a01b0316336001600160a01b03161461042b5760405162461bcd60e51b81526004016104229061127c565b60405180910390fd5b60408051602080820183526000808352848152600190915291909120906104529082611376565b5050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156104a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cc9190611232565b60005460405160e084901b6001600160e01b03191681526104fb9291600160a01b900460ff169060040161124b565b602060405180830381865afa158015610518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053c919061125f565b6001600160a01b0316336001600160a01b03161461056c5760405162461bcd60e51b81526004016104229061127c565b60008281526001602052604090206105848282611376565b505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156105db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ff9190611232565b60005460405160e084901b6001600160e01b031916815261062e9291600160a01b900460ff169060040161124b565b602060405180830381865afa15801561064b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066f919061125f565b6001600160a01b0316336001600160a01b03161461069f5760405162461bcd60e51b81526004016104229061127c565b60008281526002602052604090206105848282611376565b606060006106c6858585610830565b9050806040516020016106d99190611434565b6040516020818303038152906040529150505b9392505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190611232565b60005460405160e084901b6001600160e01b03191681526107989291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156107b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d9919061125f565b6001600160a01b0316336001600160a01b0316146108095760405162461bcd60e51b81526004016104229061127c565b60408051602080820183526000808352848152600290915291909120906104529082611376565b6060600060405180610480016040528061045681526020016116d061045691399050600061085d85610153565b9050600061086a85610a84565b9050600061087788610aa0565b600089815260016020526040812080549293509091610895906112ee565b80601f01602080910402602001604051908101604052809291908181526020018280546108c1906112ee565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b505050505090506000600260008b81526020019081526020016000208054610935906112ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610961906112ee565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b50505050509050815160001480156109c65750805115155b156109f257826040516020016109dc9190611479565b6040516020818303038152906040529150610a46565b815115801590610a0157508051155b15610a0d575084610a46565b8151158015610a1b57508051155b15610a465782604051602001610a319190611479565b60405160208183030381529060405291508590505b610a768282878787604051602001610a629594939291906114aa565b604051602081830303815290604052610b32565b9a9950505050505050505050565b6060610a9a6001600160a01b0383166014610c91565b92915050565b60606000610aad83610e2c565b60010190506000816001600160401b03811115610acc57610acc610f02565b6040519080825280601f01601f191660200182016040528015610af6576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610b0057509392505050565b60608151600003610b5157505060408051602081019091526000815290565b6000604051806060016040528060408152602001611b266040913990506000600384516002610b8091906111d9565b610b8a91906111b1565b610b9590600461116e565b6001600160401b03811115610bac57610bac610f02565b6040519080825280601f01601f191660200182016040528015610bd6576020820181803683370190505b50905060018201602082018586518701602081018051600082525b82841015610c4c576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450610bf1565b9052505085516003900660018114610c6b5760028114610c7e57610c86565b603d6001830353603d6002830353610c86565b603d60018303535b509195945050505050565b60606000610ca083600261116e565b610cab9060026111d9565b6001600160401b03811115610cc257610cc2610f02565b6040519080825280601f01601f191660200182016040528015610cec576020820181803683370190505b509050600360fc1b81600081518110610d0757610d07611185565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d3657610d36611185565b60200101906001600160f81b031916908160001a9053506000610d5a84600261116e565b610d659060016111d9565b90505b6001811115610ddd576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d9957610d99611185565b1a60f81b828281518110610daf57610daf611185565b60200101906001600160f81b031916908160001a90535060049490941c93610dd6816116b8565b9050610d68565b5083156106ec5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610422565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610e6b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b8310610e95576904ee2d6d415b85acef8160201b830492506020015b662386f26fc100008310610eb357662386f26fc10000830492506010015b6305f5e1008310610ecb576305f5e100830492506008015b6127108310610edf57612710830492506004015b60648310610ef1576064830492506002015b600a8310610a9a5760010192915050565b634e487b7160e01b600052604160045260246000fd5b6000806001600160401b03841115610f3257610f32610f02565b50604051601f19601f85018116603f011681018181106001600160401b0382111715610f6057610f60610f02565b604052838152905080828401851015610f7857600080fd5b83836020830137600060208583010152509392505050565b600082601f830112610fa157600080fd5b6106ec83833560208501610f18565b600060208284031215610fc257600080fd5b81356001600160401b03811115610fd857600080fd5b610fe484828501610f90565b949350505050565b60005b83811015611007578181015183820152602001610fef565b50506000910152565b602081526000825180602084015261102f816040850160208701610fec565b601f01601f19169190910160400192915050565b60006020828403121561105557600080fd5b5035919050565b6000806040838503121561106f57600080fd5b8235915060208301356001600160401b0381111561108c57600080fd5b8301601f8101851361109d57600080fd5b6110ac85823560208401610f18565b9150509250929050565b6001600160a01b03811681146110cb57600080fd5b50565b6000806000606084860312156110e357600080fd5b8335925060208401356001600160401b0381111561110057600080fd5b61110c86828701610f90565b925050604084013561111d816110b6565b809150509250925092565b6003811061114657634e487b7160e01b600052602160045260246000fd5b9052565b60208101610a9a8284611128565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a9a57610a9a611158565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826111c0576111c061119b565b500490565b6000826111d4576111d461119b565b500690565b80820180821115610a9a57610a9a611158565b600081516111fe818560208601610fec565b9290920192915050565b61060f60f31b815260008251611225816002850160208701610fec565b9190910160020192915050565b60006020828403121561124457600080fd5b5051919050565b828152604081016106ec6020830184611128565b60006020828403121561127157600080fd5b81516106ec816110b6565b6020808252604c908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f60608201526b6d61696e2077616c6c65747360a01b608082015260a00190565b600181811c9082168061130257607f821691505b60208210810361132257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561058457806000526020600020601f840160051c8101602085101561134f5750805b601f840160051c820191505b8181101561136f576000815560010161135b565b5050505050565b81516001600160401b0381111561138f5761138f610f02565b6113a38161139d84546112ee565b84611328565b6020601f8211600181146113d757600083156113bf5750848201515b600019600385901b1c1916600184901b17845561136f565b600084815260208120601f198516915b8281101561140757878501518255602094850194600190920191016113e7565b50848210156114255786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161146c81601d850160208701610fec565b91909101601d0192915050565b684c697420504b50202360b81b81526000825161149d816009850160208701610fec565b9190910160090192915050565b683d913730b6b2911d1160b91b815285516000906114cf816009850160208b01610fec565b7f222c20226465736372697074696f6e223a202254686973204e465420656e74696009918401918201527f746c65732074686520686f6c64657220746f207573652061204c69742050726f60298201527f746f636f6c20504b502c20616e6420746f206772616e7420616363657373207460498201527f6f206f7468657220757365727320616e64204c697420416374696f6e7320746f60698201527f20757365207468697320504b50222c22696d6167655f64617461223a20220000608982015286516115a48160a7840160208b01610fec565b6009818301019150507f222c2261747472696275746573223a205b7b2274726169745f74797065223a20609e8201527711283ab13634b19025b2bc911610113b30b63ab2911d101160411b60be8201526116ac61169c61169661165b61165561161060d687018c6111ec565b7f227d2c207b2274726169745f74797065223a20224554482057616c6c6574204181527232323932b9b9911610113b30b63ab2911d101160691b602082015260330190565b896111ec565b7f227d2c207b2274726169745f74797065223a2022546f6b656e204944222c20228152683b30b63ab2911d101160b91b602082015260290190565b866111ec565b63227d5d7d60e01b815260040190565b98975050505050505050565b6000816116c7576116c7611158565b50600019019056fe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130383027206865696768743d2731303830272066696c6c3d276e6f6e652720786d6c6e733a763d2768747470733a2f2f76656374612e696f2f6e616e6f273e3c7061746820643d274d3336332e303736203339322e323237732d2e3937372031382e3532342d33362e3837342037382e393437632d34312e3537362037302e3031382d34352e343831203135312e3937382d332e303137203232302e342038392e353231203134342e323435203333322e343831203134312e3532203432322e3535362e3038392033342e3833322d35342e3730372034342e3831362d3131372e3437392033322e3932342d3138312e323438203020302d32382e3831392d3133332e3134342d3132372e3233372d3231372e30393920312e35353320312e33303820352e3336392031392e31323220362e3130312032362e37323220322e3234312032332e3335342e3034352034372e3833382d372e3738372037302e3036322d352e3734362031362e33332d31332e3731312033302e3436372d32372e3137382034312e33363820302d332e3831312d2e3935342d31302e3633352d2e3937362d31322e3931382d2e3634342d34362e3530382d31382e3635392d38392e3538322d34382e3031312d3132352e3734332d32352e3634372d33312e3535322d36302e3831322d35332e3038392d39372e38342d36382e3933322e39333120332e31393120322e3636322031362e34313920322e3930362031392e30333320312e3930382032312e39353820322e3236332035322e3731332d2e3632312037342e363439732d372e3833322033332e3837382d31342e3535342035342e343431632d31302e3138342033312e3137352d32342e30352035342e3238352d34312e3632312038322e3030342d332e323420352e3039362d31322e3931332031392e3037382d31382e3038322032362e313436203020302d382e3839372d35362e3139312d34302e3636372d38372e393231682d2e3032327a272066696c6c3d2723303030272f3e3c7061746820643d274d3536322e352032372e32386c3431302e323739203233362e3837346331332e39323320382e3033392032322e352032322e3839352032322e352033382e393731763437332e373563302031362e3037362d382e3537372033302e3933322d32322e352033382e3937314c3536322e3520313035322e3732632d31332e39323320382e30342d33312e30373720382e30342d343520304c3130372e323231203831352e383436632d31332e3932332d382e3033392d32322e352d32322e3839352d32322e352d33382e393731762d3437332e37356134352034352030203020312032322e352d33382e3937314c3531372e352032372e323861343520343520302030203120343520307a27207374726f6b653d272330303027207374726f6b652d77696474683d2732342e3735272f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220119f3eff15d9f5ea1c055f3790173296030e59973e2ad660e8711a55e2f0331364736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100785760003560e01c8063451d89fa1461007d57806350d17b5e146100a6578063519a218e146100d1578063855eec22146100e65780639000fee1146100f9578063950462ee1461010c5780639dca00321461011f578063b63a767714610140575b600080fd5b61009061008b366004610fb0565b610153565b60405161009d9190611010565b60405180910390f35b6000546100b9906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b6100e46100df366004611043565b61030c565b005b6100e46100f436600461105c565b610456565b6100e461010736600461105c565b610589565b61009061011a3660046110ce565b6106b7565b60005461013390600160a01b900460ff1681565b60405161009d919061114a565b6100e461014e366004611043565b6106f3565b6060600082516002610165919061116e565b6001600160401b0381111561017c5761017c610f02565b6040519080825280601f01601f1916602001820160405280156101a6576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b84518110156102e2578182518683815181106101f2576101f2611185565b0160200151610204919060f81c6111b1565b8151811061021457610214611185565b01602001516001600160f81b0319168361022f83600261116e565b8151811061023f5761023f611185565b60200101906001600160f81b031916908160001a90535081825186838151811061026b5761026b611185565b016020015161027d919060f81c6111c5565b8151811061028d5761028d611185565b01602001516001600160f81b031916836102a883600261116e565b6102b39060016111d9565b815181106102c3576102c3611185565b60200101906001600160f81b031916908160001a9053506001016101d4565b50816040516020016102f49190611208565b60405160208183030381529060405292505050919050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa15801561035e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103829190611232565b60005460405160e084901b6001600160e01b03191681526103b19291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156103ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f2919061125f565b6001600160a01b0316336001600160a01b03161461042b5760405162461bcd60e51b81526004016104229061127c565b60405180910390fd5b60408051602080820183526000808352848152600190915291909120906104529082611376565b5050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156104a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cc9190611232565b60005460405160e084901b6001600160e01b03191681526104fb9291600160a01b900460ff169060040161124b565b602060405180830381865afa158015610518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053c919061125f565b6001600160a01b0316336001600160a01b03161461056c5760405162461bcd60e51b81526004016104229061127c565b60008281526001602052604090206105848282611376565b505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156105db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ff9190611232565b60005460405160e084901b6001600160e01b031916815261062e9291600160a01b900460ff169060040161124b565b602060405180830381865afa15801561064b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066f919061125f565b6001600160a01b0316336001600160a01b03161461069f5760405162461bcd60e51b81526004016104229061127c565b60008281526002602052604090206105848282611376565b606060006106c6858585610830565b9050806040516020016106d99190611434565b6040516020818303038152906040529150505b9392505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190611232565b60005460405160e084901b6001600160e01b03191681526107989291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156107b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d9919061125f565b6001600160a01b0316336001600160a01b0316146108095760405162461bcd60e51b81526004016104229061127c565b60408051602080820183526000808352848152600290915291909120906104529082611376565b6060600060405180610480016040528061045681526020016116d061045691399050600061085d85610153565b9050600061086a85610a84565b9050600061087788610aa0565b600089815260016020526040812080549293509091610895906112ee565b80601f01602080910402602001604051908101604052809291908181526020018280546108c1906112ee565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b505050505090506000600260008b81526020019081526020016000208054610935906112ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610961906112ee565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b50505050509050815160001480156109c65750805115155b156109f257826040516020016109dc9190611479565b6040516020818303038152906040529150610a46565b815115801590610a0157508051155b15610a0d575084610a46565b8151158015610a1b57508051155b15610a465782604051602001610a319190611479565b60405160208183030381529060405291508590505b610a768282878787604051602001610a629594939291906114aa565b604051602081830303815290604052610b32565b9a9950505050505050505050565b6060610a9a6001600160a01b0383166014610c91565b92915050565b60606000610aad83610e2c565b60010190506000816001600160401b03811115610acc57610acc610f02565b6040519080825280601f01601f191660200182016040528015610af6576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610b0057509392505050565b60608151600003610b5157505060408051602081019091526000815290565b6000604051806060016040528060408152602001611b266040913990506000600384516002610b8091906111d9565b610b8a91906111b1565b610b9590600461116e565b6001600160401b03811115610bac57610bac610f02565b6040519080825280601f01601f191660200182016040528015610bd6576020820181803683370190505b50905060018201602082018586518701602081018051600082525b82841015610c4c576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450610bf1565b9052505085516003900660018114610c6b5760028114610c7e57610c86565b603d6001830353603d6002830353610c86565b603d60018303535b509195945050505050565b60606000610ca083600261116e565b610cab9060026111d9565b6001600160401b03811115610cc257610cc2610f02565b6040519080825280601f01601f191660200182016040528015610cec576020820181803683370190505b509050600360fc1b81600081518110610d0757610d07611185565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d3657610d36611185565b60200101906001600160f81b031916908160001a9053506000610d5a84600261116e565b610d659060016111d9565b90505b6001811115610ddd576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d9957610d99611185565b1a60f81b828281518110610daf57610daf611185565b60200101906001600160f81b031916908160001a90535060049490941c93610dd6816116b8565b9050610d68565b5083156106ec5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610422565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610e6b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b8310610e95576904ee2d6d415b85acef8160201b830492506020015b662386f26fc100008310610eb357662386f26fc10000830492506010015b6305f5e1008310610ecb576305f5e100830492506008015b6127108310610edf57612710830492506004015b60648310610ef1576064830492506002015b600a8310610a9a5760010192915050565b634e487b7160e01b600052604160045260246000fd5b6000806001600160401b03841115610f3257610f32610f02565b50604051601f19601f85018116603f011681018181106001600160401b0382111715610f6057610f60610f02565b604052838152905080828401851015610f7857600080fd5b83836020830137600060208583010152509392505050565b600082601f830112610fa157600080fd5b6106ec83833560208501610f18565b600060208284031215610fc257600080fd5b81356001600160401b03811115610fd857600080fd5b610fe484828501610f90565b949350505050565b60005b83811015611007578181015183820152602001610fef565b50506000910152565b602081526000825180602084015261102f816040850160208701610fec565b601f01601f19169190910160400192915050565b60006020828403121561105557600080fd5b5035919050565b6000806040838503121561106f57600080fd5b8235915060208301356001600160401b0381111561108c57600080fd5b8301601f8101851361109d57600080fd5b6110ac85823560208401610f18565b9150509250929050565b6001600160a01b03811681146110cb57600080fd5b50565b6000806000606084860312156110e357600080fd5b8335925060208401356001600160401b0381111561110057600080fd5b61110c86828701610f90565b925050604084013561111d816110b6565b809150509250925092565b6003811061114657634e487b7160e01b600052602160045260246000fd5b9052565b60208101610a9a8284611128565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a9a57610a9a611158565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826111c0576111c061119b565b500490565b6000826111d4576111d461119b565b500690565b80820180821115610a9a57610a9a611158565b600081516111fe818560208601610fec565b9290920192915050565b61060f60f31b815260008251611225816002850160208701610fec565b9190910160020192915050565b60006020828403121561124457600080fd5b5051919050565b828152604081016106ec6020830184611128565b60006020828403121561127157600080fd5b81516106ec816110b6565b6020808252604c908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f60608201526b6d61696e2077616c6c65747360a01b608082015260a00190565b600181811c9082168061130257607f821691505b60208210810361132257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561058457806000526020600020601f840160051c8101602085101561134f5750805b601f840160051c820191505b8181101561136f576000815560010161135b565b5050505050565b81516001600160401b0381111561138f5761138f610f02565b6113a38161139d84546112ee565b84611328565b6020601f8211600181146113d757600083156113bf5750848201515b600019600385901b1c1916600184901b17845561136f565b600084815260208120601f198516915b8281101561140757878501518255602094850194600190920191016113e7565b50848210156114255786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161146c81601d850160208701610fec565b91909101601d0192915050565b684c697420504b50202360b81b81526000825161149d816009850160208701610fec565b9190910160090192915050565b683d913730b6b2911d1160b91b815285516000906114cf816009850160208b01610fec565b7f222c20226465736372697074696f6e223a202254686973204e465420656e74696009918401918201527f746c65732074686520686f6c64657220746f207573652061204c69742050726f60298201527f746f636f6c20504b502c20616e6420746f206772616e7420616363657373207460498201527f6f206f7468657220757365727320616e64204c697420416374696f6e7320746f60698201527f20757365207468697320504b50222c22696d6167655f64617461223a20220000608982015286516115a48160a7840160208b01610fec565b6009818301019150507f222c2261747472696275746573223a205b7b2274726169745f74797065223a20609e8201527711283ab13634b19025b2bc911610113b30b63ab2911d101160411b60be8201526116ac61169c61169661165b61165561161060d687018c6111ec565b7f227d2c207b2274726169745f74797065223a20224554482057616c6c6574204181527232323932b9b9911610113b30b63ab2911d101160691b602082015260330190565b896111ec565b7f227d2c207b2274726169745f74797065223a2022546f6b656e204944222c20228152683b30b63ab2911d101160b91b602082015260290190565b866111ec565b63227d5d7d60e01b815260040190565b98975050505050505050565b6000816116c7576116c7611158565b50600019019056fe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130383027206865696768743d2731303830272066696c6c3d276e6f6e652720786d6c6e733a763d2768747470733a2f2f76656374612e696f2f6e616e6f273e3c7061746820643d274d3336332e303736203339322e323237732d2e3937372031382e3532342d33362e3837342037382e393437632d34312e3537362037302e3031382d34352e343831203135312e3937382d332e303137203232302e342038392e353231203134342e323435203333322e343831203134312e3532203432322e3535362e3038392033342e3833322d35342e3730372034342e3831362d3131372e3437392033322e3932342d3138312e323438203020302d32382e3831392d3133332e3134342d3132372e3233372d3231372e30393920312e35353320312e33303820352e3336392031392e31323220362e3130312032362e37323220322e3234312032332e3335342e3034352034372e3833382d372e3738372037302e3036322d352e3734362031362e33332d31332e3731312033302e3436372d32372e3137382034312e33363820302d332e3831312d2e3935342d31302e3633352d2e3937362d31322e3931382d2e3634342d34362e3530382d31382e3635392d38392e3538322d34382e3031312d3132352e3734332d32352e3634372d33312e3535322d36302e3831322d35332e3038392d39372e38342d36382e3933322e39333120332e31393120322e3636322031362e34313920322e3930362031392e30333320312e3930382032312e39353820322e3236332035322e3731332d2e3632312037342e363439732d372e3833322033332e3837382d31342e3535342035342e343431632d31302e3138342033312e3137352d32342e30352035342e3238352d34312e3632312038322e3030342d332e323420352e3039362d31322e3931332031392e3037382d31382e3038322032362e313436203020302d382e3839372d35362e3139312d34302e3636372d38372e393231682d2e3032327a272066696c6c3d2723303030272f3e3c7061746820643d274d3536322e352032372e32386c3431302e323739203233362e3837346331332e39323320382e3033392032322e352032322e3839352032322e352033382e393731763437332e373563302031362e3037362d382e3537372033302e3933322d32322e352033382e3937314c3536322e3520313035322e3732632d31332e39323320382e30342d33312e30373720382e30342d343520304c3130372e323231203831352e383436632d31332e3932332d382e3033392d32322e352d32322e3839352d32322e352d33382e393731762d3437332e37356134352034352030203020312032322e352d33382e3937314c3531372e352032372e323861343520343520302030203120343520307a27207374726f6b653d272330303027207374726f6b652d77696474683d2732342e3735272f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220119f3eff15d9f5ea1c055f3790173296030e59973e2ad660e8711a55e2f0331364736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/rust/lit-core/lit-blockchain-lite/abis/PubkeyRouter.json b/rust/lit-core/lit-blockchain-lite/abis/PubkeyRouter.json index 814aec26..5c48ab5e 100644 --- a/rust/lit-core/lit-blockchain-lite/abis/PubkeyRouter.json +++ b/rust/lit-core/lit-blockchain-lite/abis/PubkeyRouter.json @@ -501,6 +501,12 @@ "internalType": "bytes32", "name": "derivedKeyId", "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" } ], "name": "PubkeyRoutingDataSet", @@ -622,6 +628,156 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "getTrustedForwarder", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" + } + ], + "name": "setRoutingData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" + } + ], + "name": "setRoutingDataAsAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "forwarder", + "type": "address" + } + ], + "name": "setTrustedForwarder", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "identifier", + "type": "string" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "internalType": "struct IPubkeyRouter.RootKey[]", + "name": "newRootKeys", + "type": "tuple[]" + } + ], + "name": "voteForRootKeys", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -920,6 +1076,11 @@ "internalType": "bytes32", "name": "derivedKeyId", "type": "bytes32" + }, + { + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" } ], "internalType": "struct LibPubkeyRouterStorage.PubkeyRoutingData", @@ -930,19 +1091,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getTrustedForwarder", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -988,6 +1136,11 @@ "internalType": "bytes32", "name": "derivedKeyId", "type": "bytes32" + }, + { + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" } ], "internalType": "struct LibPubkeyRouterStorage.PubkeyRoutingData", @@ -997,133 +1150,6 @@ ], "stateMutability": "view", "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newResolverAddress", - "type": "address" - } - ], - "name": "setContractResolver", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - }, - { - "internalType": "address", - "name": "stakingContractAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "keyType", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "derivedKeyId", - "type": "bytes32" - } - ], - "name": "setRoutingData", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - }, - { - "internalType": "address", - "name": "stakingContract", - "type": "address" - }, - { - "internalType": "uint256", - "name": "keyType", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "derivedKeyId", - "type": "bytes32" - } - ], - "name": "setRoutingDataAsAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "forwarder", - "type": "address" - } - ], - "name": "setTrustedForwarder", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "stakingContractAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "identifier", - "type": "string" - }, - { - "components": [ - { - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "keyType", - "type": "uint256" - } - ], - "internalType": "struct IPubkeyRouter.RootKey[]", - "name": "newRootKeys", - "type": "tuple[]" - } - ], - "name": "voteForRootKeys", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" } ], "deployedBytecode": "", diff --git a/rust/lit-core/lit-blockchain-lite/abis/Staking.json b/rust/lit-core/lit-blockchain-lite/abis/Staking.json index 59258849..08eb31f7 100644 --- a/rust/lit-core/lit-blockchain-lite/abis/Staking.json +++ b/rust/lit-core/lit-blockchain-lite/abis/Staking.json @@ -394,6 +394,11 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "CallerNotOwner", + "type": "error" + }, { "inputs": [ { @@ -583,6 +588,71 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "realmId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "maxConcurrentRequests", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPresignCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minPresignCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "peerCheckingIntervalSecs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPresignConcurrency", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "rpcHealthcheckEnabled", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "minEpochForRewards", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "permittedValidatorsOn", + "type": "bool" + }, + { + "internalType": "string", + "name": "defaultKeySet", + "type": "string" + } + ], + "internalType": "struct LibStakingStorage.RealmConfig", + "name": "newConfig", + "type": "tuple" + } + ], + "name": "setRealmConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -694,11 +764,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "CallerNotOwner", - "type": "error" - }, { "inputs": [], "name": "CallerNotOwnerOrDevopsAdmin", @@ -1332,11 +1397,6 @@ "name": "tokenRewardPerTokenPerEpoch", "type": "uint256" }, - { - "internalType": "uint256[]", - "name": "keyTypes", - "type": "uint256[]" - }, { "internalType": "uint256", "name": "minimumValidatorCount", @@ -1688,66 +1748,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "realmId", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "maxConcurrentRequests", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPresignCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minPresignCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "peerCheckingIntervalSecs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPresignConcurrency", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "rpcHealthcheckEnabled", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "minEpochForRewards", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "permittedValidatorsOn", - "type": "bool" - } - ], - "internalType": "struct LibStakingStorage.RealmConfig", - "name": "newConfig", - "type": "tuple" - } - ], - "name": "setRealmConfig", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -2689,9 +2689,9 @@ "type": "uint256[]" }, { - "internalType": "address[]", - "name": "recoveryPartyMembers", - "type": "address[]" + "internalType": "bytes", + "name": "recoverySessionId", + "type": "bytes" } ], "internalType": "struct LibStakingStorage.KeySetConfig", @@ -2749,9 +2749,9 @@ "type": "uint256[]" }, { - "internalType": "address[]", - "name": "recoveryPartyMembers", - "type": "address[]" + "internalType": "bytes", + "name": "recoverySessionId", + "type": "bytes" } ], "internalType": "struct LibStakingStorage.KeySetConfig[]", @@ -2807,9 +2807,9 @@ "type": "uint256[]" }, { - "internalType": "address[]", - "name": "recoveryPartyMembers", - "type": "address[]" + "internalType": "bytes", + "name": "recoverySessionId", + "type": "bytes" } ], "internalType": "struct LibStakingStorage.KeySetConfig", @@ -3303,67 +3303,6 @@ "name": "ComplaintConfigSet", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "newTokenRewardPerTokenPerEpoch", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "newKeyTypes", - "type": "uint256[]" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMinimumValidatorCount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMaxConcurrentRequests", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMaxPresignCount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMinPresignCount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newPeerCheckingIntervalSecs", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMaxPresignConcurrency", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bool", - "name": "newRpcHealthcheckEnabled", - "type": "bool" - } - ], - "name": "ConfigSet", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -4683,19 +4622,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getKeyTypes", - "outputs": [ - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -5990,11 +5916,6 @@ "name": "tokenRewardPerTokenPerEpoch", "type": "uint256" }, - { - "internalType": "uint256[]", - "name": "keyTypes", - "type": "uint256[]" - }, { "internalType": "uint256", "name": "minimumValidatorCount", @@ -6645,6 +6566,11 @@ "internalType": "bool", "name": "permittedValidatorsOn", "type": "bool" + }, + { + "internalType": "string", + "name": "defaultKeySet", + "type": "string" } ], "internalType": "struct LibStakingStorage.RealmConfig", diff --git a/rust/lit-core/lit-blockchain-lite/src/contracts/arbitrum_key_deriver.rs b/rust/lit-core/lit-blockchain-lite/src/contracts/arbitrum_key_deriver.rs index 95ca8c6b..2d450833 100644 --- a/rust/lit-core/lit-blockchain-lite/src/contracts/arbitrum_key_deriver.rs +++ b/rust/lit-core/lit-blockchain-lite/src/contracts/arbitrum_key_deriver.rs @@ -562,13 +562,13 @@ pub mod arbitrum_key_deriver { ::ethers::core::abi::Abi, > = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\x11\xCA8\x03\x80a\x11\xCA\x839\x81\x01`@\x81\x90Ra\0/\x91a\x01\xA4V[a\0G`\0\x80Q` a\x11\xAA\x839\x81Q\x91R3a\0\xADV[a\0_`\0\x80Q` a\x11\xAA\x839\x81Q\x91R\x80a\0\xBBV[`\x01\x80T`\x01`\x01`\xA0\x1B\x03\x84\x16`\x01`\x01`\xA0\x1B\x03\x19\x82\x16\x81\x17\x83U\x83\x92\x91`\x01`\x01`\xA8\x1B\x03\x19\x16\x17`\x01`\xA0\x1B\x83`\x02\x81\x11\x15a\0\xA1Wa\0\xA1a\x01\xEEV[\x02\x17\x90UPPPa\x02\x04V[a\0\xB7\x82\x82a\x01\x06V[PPV[`\0\x82\x81R` \x81\x90R`@\x80\x82 `\x01\x01\x80T\x90\x84\x90U\x90Q\x90\x91\x83\x91\x83\x91\x86\x91\x7F\xBDy\xB8o\xFE\n\xB8\xE8waQQB\x17\xCD|\xAC\xD5,\x90\x9FfG\\:\xF4N\x12\x9F\x0B\0\xFF\x91\x90\xA4PPPV[`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 T`\xFF\x16a\0\xB7W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x01`3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[`\0\x80`@\x83\x85\x03\x12\x15a\x01\xB7W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x01\xCEW`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x03\x81\x10a\x01\xE3W`\0\x80\xFD[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[a\x0F\x97\x80a\x02\x13`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xBAW`\x005`\xE0\x1C\x80c\x01\xFF\xC9\xA7\x14a\0\xBFW\x80c$\x8A\x9C\xA3\x14a\0\xE7W\x80c//\xF1]\x14a\x01\x08W\x80c6V\x8A\xBE\x14a\x01\x1DW\x80cP\xD1{^\x14a\x010W\x80cu\xB28\xFC\x14a\x01[W\x80c\x91\xD1HT\x14a\x01\x82W\x80c\x9D\xCA\x002\x14a\x01\x95W\x80c\xA2\x17\xFD\xDF\x14a\x01\xB6W\x80c\xA3,+\x99\x14a\x01\xBEW\x80c\xB2N\xD3\x08\x14a\x01\xDFW\x80c\xD5Gt\x1F\x14a\x02\x06W\x80c\xF9]q\xB1\x14a\x02\x19W\x80c\xFE\x89\xC9p\x14a\x02,W[`\0\x80\xFD[a\0\xD2a\0\xCD6`\x04a\t\x8DV[a\x02RV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xFAa\0\xF56`\x04a\t\xB7V[a\x02\x89V[`@Q\x90\x81R` \x01a\0\xDEV[a\x01\x1Ba\x01\x166`\x04a\t\xE5V[a\x02\x9EV[\0[a\x01\x1Ba\x01+6`\x04a\t\xE5V[a\x02\xBFV[`\x01Ta\x01C\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xDEV[a\0\xFA\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\x81V[a\0\xD2a\x01\x906`\x04a\t\xE5V[a\x03BV[`\x01Ta\x01\xA9\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\xDE\x91\x90a\n7V[a\0\xFA`\0\x81V[a\x01\xD1a\x01\xCC6`\x04a\n\xDAV[a\x03kV[`@Qa\0\xDE\x92\x91\x90a\x0C\x92V[a\0\xFA\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9\x81V[a\x01\x1Ba\x02\x146`\x04a\t\xE5V[a\x04\xF6V[a\x01\x1Ba\x02'6`\x04a\x0C\xB5V[a\x05\x12V[a\0\xFA~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x02\x83WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x02\xA7\x82a\x02\x89V[a\x02\xB0\x81a\x05_V[a\x02\xBA\x83\x83a\x05lV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x034W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x03>\x82\x82a\x05\xF0V[PPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[`\0```\0a\x03|\x86\x86\x86a\x06UV[\x90P`\0\x81`\0\x81Q\x81\x10a\x03\x93Wa\x03\x93a\x0C\xD2V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16`\0\x03a\x03\xD0WP\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9a\x03\xF2V[P~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd[`\x01T`@QcGF\xFE\x8B`\xE1\x1B\x81R`\0\x91`\x01`\x01`\xA0\x1B\x03\x81\x16\x91c\x8E\x8D\xFD\x16\x91a\x04/\x91\x86\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x0C\xE8V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04LW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04p\x91\x90a\x0C\xFCV[\x90P`\0\x81`\x01`\x01`\xA0\x1B\x03\x16c\xECr3g\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04\xA0\x91\x90a\r\x19V[`\0`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xBDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra\x04\xE5\x91\x90\x81\x01\x90a\r,V[`\x01\x9A\x90\x99P\x97PPPPPPPPV[a\x04\xFF\x82a\x02\x89V[a\x05\x08\x81a\x05_V[a\x02\xBA\x83\x83a\x05\xF0V[\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECBa\x05<\x81a\x05_V[P`\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[a\x05i\x813a\x07\x87V[PV[a\x05v\x82\x82a\x03BV[a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x05\xAC3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x05\xFA\x82\x82a\x03BV[\x15a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x06\xEFW\x84\x86\x82\x81Q\x81\x10a\x06\x86Wa\x06\x86a\x0C\xD2V[` \x02` \x01\x01Q` \x01Q\x03a\x06\xE7W\x82\x86\x82\x81Q\x81\x10a\x06\xAAWa\x06\xAAa\x0C\xD2V[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x06\xC7\x92\x91\x90a\r\xA2V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x06\xE3\x90a\r\xE7V[\x92PP[`\x01\x01a\x06jV[P\x83`\x02\x03a\x07\x01W`\x01\x93Pa\x07\x0EV[\x83`\x03\x03a\x07\x0EW`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x0F7`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x07e\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x0E\x0CV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x98PPPPPPPPP[\x93\x92PPPV[a\x07\x91\x82\x82a\x03BV[a\x03>Wa\x07\x9E\x81a\x07\xE0V[a\x07\xA9\x83` a\x07\xF2V[`@Q` \x01a\x07\xBA\x92\x91\x90a\x0E\x86V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x03+\x91`\x04\x01a\r\x19V[``a\x02\x83`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\x08\x01\x83`\x02a\x0E\xF5V[a\x08\x0C\x90`\x02a\x0F\x0CV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x08#Wa\x08#a\nEV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x08MW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\x08hWa\x08ha\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\x08\x97Wa\x08\x97a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x08\xBB\x84`\x02a\x0E\xF5V[a\x08\xC6\x90`\x01a\x0F\x0CV[\x90P[`\x01\x81\x11\x15a\t>Wo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x08\xFAWa\x08\xFAa\x0C\xD2V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\t\x10Wa\t\x10a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\t7\x81a\x0F\x1FV[\x90Pa\x08\xC9V[P\x83\x15a\x07\x80W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x03+V[`\0` \x82\x84\x03\x12\x15a\t\x9FW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x07\x80W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\t\xC9W`\0\x80\xFD[P5\x91\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x05iW`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\t\xF8W`\0\x80\xFD[\x825\x91P` \x83\x015a\n\n\x81a\t\xD0V[\x80\x91PP\x92P\x92\x90PV[`\x03\x81\x10a\n3WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x02\x83\x82\x84a\n\x15V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n}Wa\n}a\nEV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n\xABWa\n\xABa\nEV[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\n\xCCWa\n\xCCa\nEV[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x80`\0``\x84\x86\x03\x12\x15a\n\xEFW`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x0CW`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x0B\x1DW`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B6Wa\x0B6a\nEV[\x80`\x05\x1Ba\x0BF` \x82\x01a\n\x83V[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x0BbW`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x0C-W\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x87W`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x0B\x9DW`\0\x80\xFD[a\x0B\xA5a\n[V[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xBEW`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x0B\xD3W`\0\x80\xFD[\x805a\x0B\xE6a\x0B\xE1\x82a\n\xB3V[a\n\x83V[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x0B\xFBW`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x0BiV[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x0C]W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0CEV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x0C~\x81` \x86\x01` \x86\x01a\x0CBV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x15\x15\x81R`@` \x82\x01R`\0a\x0C\xAD`@\x83\x01\x84a\x0CfV[\x94\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x0C\xC7W`\0\x80\xFD[\x815a\x07\x80\x81a\t\xD0V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x82\x81R`@\x81\x01a\x07\x80` \x83\x01\x84a\n\x15V[`\0` \x82\x84\x03\x12\x15a\r\x0EW`\0\x80\xFD[\x81Qa\x07\x80\x81a\t\xD0V[` \x81R`\0a\x07\x80` \x83\x01\x84a\x0CfV[`\0` \x82\x84\x03\x12\x15a\r>W`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\rTW`\0\x80\xFD[\x82\x01`\x1F\x81\x01\x84\x13a\reW`\0\x80\xFD[\x80Qa\rsa\x0B\xE1\x82a\n\xB3V[\x81\x81R\x85` \x83\x85\x01\x01\x11\x15a\r\x88W`\0\x80\xFD[a\r\x99\x82` \x83\x01` \x86\x01a\x0CBV[\x95\x94PPPPPV[`\0\x83Qa\r\xB4\x81\x84` \x88\x01a\x0CBV[\x83Q\x90\x83\x01\x90a\r\xC8\x81\x83` \x88\x01a\x0CBV[\x01\x94\x93PPPPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x0E\x03Wa\x0E\x03a\r\xD1V[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x0EN\x81`)\x85\x01` \x89\x01a\x0CBV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x0Eu\x81`-\x84\x01` \x88\x01a\x0CBV[\x01`-\x01\x99\x98PPPPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x0E\xB8\x81`\x17\x85\x01` \x88\x01a\x0CBV[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x0E\xE9\x81`(\x84\x01` \x88\x01a\x0CBV[\x01`(\x01\x94\x93PPPPV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x02\x83Wa\x02\x83a\r\xD1V[\x80\x82\x01\x80\x82\x11\x15a\x02\x83Wa\x02\x83a\r\xD1V[`\0\x81a\x0F.Wa\x0F.a\r\xD1V[P`\0\x19\x01\x90V\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 7$;\xC4>x\xAC4\xBBE\xBF\xE2CE\x0C(\x1Fa\xD2&\xE1,\xDA\xB0K(\x99\x83*D\xFFwdsolcC\0\x08\x1C\x003\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB"; + const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\x11\xCA8\x03\x80a\x11\xCA\x839\x81\x01`@\x81\x90Ra\0/\x91a\x01\xA4V[a\0G`\0\x80Q` a\x11\xAA\x839\x81Q\x91R3a\0\xADV[a\0_`\0\x80Q` a\x11\xAA\x839\x81Q\x91R\x80a\0\xBBV[`\x01\x80T`\x01`\x01`\xA0\x1B\x03\x84\x16`\x01`\x01`\xA0\x1B\x03\x19\x82\x16\x81\x17\x83U\x83\x92\x91`\x01`\x01`\xA8\x1B\x03\x19\x16\x17`\x01`\xA0\x1B\x83`\x02\x81\x11\x15a\0\xA1Wa\0\xA1a\x01\xEEV[\x02\x17\x90UPPPa\x02\x04V[a\0\xB7\x82\x82a\x01\x06V[PPV[`\0\x82\x81R` \x81\x90R`@\x80\x82 `\x01\x01\x80T\x90\x84\x90U\x90Q\x90\x91\x83\x91\x83\x91\x86\x91\x7F\xBDy\xB8o\xFE\n\xB8\xE8waQQB\x17\xCD|\xAC\xD5,\x90\x9FfG\\:\xF4N\x12\x9F\x0B\0\xFF\x91\x90\xA4PPPV[`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 T`\xFF\x16a\0\xB7W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x01`3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[`\0\x80`@\x83\x85\x03\x12\x15a\x01\xB7W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x01\xCEW`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x03\x81\x10a\x01\xE3W`\0\x80\xFD[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[a\x0F\x97\x80a\x02\x13`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xBAW`\x005`\xE0\x1C\x80c\x01\xFF\xC9\xA7\x14a\0\xBFW\x80c$\x8A\x9C\xA3\x14a\0\xE7W\x80c//\xF1]\x14a\x01\x08W\x80c6V\x8A\xBE\x14a\x01\x1DW\x80cP\xD1{^\x14a\x010W\x80cu\xB28\xFC\x14a\x01[W\x80c\x91\xD1HT\x14a\x01\x82W\x80c\x9D\xCA\x002\x14a\x01\x95W\x80c\xA2\x17\xFD\xDF\x14a\x01\xB6W\x80c\xA3,+\x99\x14a\x01\xBEW\x80c\xB2N\xD3\x08\x14a\x01\xDFW\x80c\xD5Gt\x1F\x14a\x02\x06W\x80c\xF9]q\xB1\x14a\x02\x19W\x80c\xFE\x89\xC9p\x14a\x02,W[`\0\x80\xFD[a\0\xD2a\0\xCD6`\x04a\t\x8DV[a\x02RV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xFAa\0\xF56`\x04a\t\xB7V[a\x02\x89V[`@Q\x90\x81R` \x01a\0\xDEV[a\x01\x1Ba\x01\x166`\x04a\t\xE5V[a\x02\x9EV[\0[a\x01\x1Ba\x01+6`\x04a\t\xE5V[a\x02\xBFV[`\x01Ta\x01C\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xDEV[a\0\xFA\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\x81V[a\0\xD2a\x01\x906`\x04a\t\xE5V[a\x03BV[`\x01Ta\x01\xA9\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\xDE\x91\x90a\n7V[a\0\xFA`\0\x81V[a\x01\xD1a\x01\xCC6`\x04a\n\xDAV[a\x03kV[`@Qa\0\xDE\x92\x91\x90a\x0C\x92V[a\0\xFA\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9\x81V[a\x01\x1Ba\x02\x146`\x04a\t\xE5V[a\x04\xF6V[a\x01\x1Ba\x02'6`\x04a\x0C\xB5V[a\x05\x12V[a\0\xFA~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x02\x83WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x02\xA7\x82a\x02\x89V[a\x02\xB0\x81a\x05_V[a\x02\xBA\x83\x83a\x05lV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x034W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x03>\x82\x82a\x05\xF0V[PPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[`\0```\0a\x03|\x86\x86\x86a\x06UV[\x90P`\0\x81`\0\x81Q\x81\x10a\x03\x93Wa\x03\x93a\x0C\xD2V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16`\0\x03a\x03\xD0WP\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9a\x03\xF2V[P~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd[`\x01T`@QcGF\xFE\x8B`\xE1\x1B\x81R`\0\x91`\x01`\x01`\xA0\x1B\x03\x81\x16\x91c\x8E\x8D\xFD\x16\x91a\x04/\x91\x86\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x0C\xE8V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04LW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04p\x91\x90a\x0C\xFCV[\x90P`\0\x81`\x01`\x01`\xA0\x1B\x03\x16c\xECr3g\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04\xA0\x91\x90a\r\x19V[`\0`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xBDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra\x04\xE5\x91\x90\x81\x01\x90a\r,V[`\x01\x9A\x90\x99P\x97PPPPPPPPV[a\x04\xFF\x82a\x02\x89V[a\x05\x08\x81a\x05_V[a\x02\xBA\x83\x83a\x05\xF0V[\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECBa\x05<\x81a\x05_V[P`\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[a\x05i\x813a\x07\x87V[PV[a\x05v\x82\x82a\x03BV[a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x05\xAC3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x05\xFA\x82\x82a\x03BV[\x15a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x06\xEFW\x84\x86\x82\x81Q\x81\x10a\x06\x86Wa\x06\x86a\x0C\xD2V[` \x02` \x01\x01Q` \x01Q\x03a\x06\xE7W\x82\x86\x82\x81Q\x81\x10a\x06\xAAWa\x06\xAAa\x0C\xD2V[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x06\xC7\x92\x91\x90a\r\xA2V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x06\xE3\x90a\r\xE7V[\x92PP[`\x01\x01a\x06jV[P\x83`\x02\x03a\x07\x01W`\x01\x93Pa\x07\x0EV[\x83`\x03\x03a\x07\x0EW`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x0F7`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x07e\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x0E\x0CV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x98PPPPPPPPP[\x93\x92PPPV[a\x07\x91\x82\x82a\x03BV[a\x03>Wa\x07\x9E\x81a\x07\xE0V[a\x07\xA9\x83` a\x07\xF2V[`@Q` \x01a\x07\xBA\x92\x91\x90a\x0E\x86V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x03+\x91`\x04\x01a\r\x19V[``a\x02\x83`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\x08\x01\x83`\x02a\x0E\xF5V[a\x08\x0C\x90`\x02a\x0F\x0CV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x08#Wa\x08#a\nEV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x08MW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\x08hWa\x08ha\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\x08\x97Wa\x08\x97a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x08\xBB\x84`\x02a\x0E\xF5V[a\x08\xC6\x90`\x01a\x0F\x0CV[\x90P[`\x01\x81\x11\x15a\t>Wo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x08\xFAWa\x08\xFAa\x0C\xD2V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\t\x10Wa\t\x10a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\t7\x81a\x0F\x1FV[\x90Pa\x08\xC9V[P\x83\x15a\x07\x80W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x03+V[`\0` \x82\x84\x03\x12\x15a\t\x9FW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x07\x80W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\t\xC9W`\0\x80\xFD[P5\x91\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x05iW`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\t\xF8W`\0\x80\xFD[\x825\x91P` \x83\x015a\n\n\x81a\t\xD0V[\x80\x91PP\x92P\x92\x90PV[`\x03\x81\x10a\n3WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x02\x83\x82\x84a\n\x15V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n}Wa\n}a\nEV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n\xABWa\n\xABa\nEV[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\n\xCCWa\n\xCCa\nEV[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x80`\0``\x84\x86\x03\x12\x15a\n\xEFW`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x0CW`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x0B\x1DW`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B6Wa\x0B6a\nEV[\x80`\x05\x1Ba\x0BF` \x82\x01a\n\x83V[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x0BbW`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x0C-W\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x87W`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x0B\x9DW`\0\x80\xFD[a\x0B\xA5a\n[V[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xBEW`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x0B\xD3W`\0\x80\xFD[\x805a\x0B\xE6a\x0B\xE1\x82a\n\xB3V[a\n\x83V[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x0B\xFBW`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x0BiV[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x0C]W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0CEV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x0C~\x81` \x86\x01` \x86\x01a\x0CBV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x15\x15\x81R`@` \x82\x01R`\0a\x0C\xAD`@\x83\x01\x84a\x0CfV[\x94\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x0C\xC7W`\0\x80\xFD[\x815a\x07\x80\x81a\t\xD0V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x82\x81R`@\x81\x01a\x07\x80` \x83\x01\x84a\n\x15V[`\0` \x82\x84\x03\x12\x15a\r\x0EW`\0\x80\xFD[\x81Qa\x07\x80\x81a\t\xD0V[` \x81R`\0a\x07\x80` \x83\x01\x84a\x0CfV[`\0` \x82\x84\x03\x12\x15a\r>W`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\rTW`\0\x80\xFD[\x82\x01`\x1F\x81\x01\x84\x13a\reW`\0\x80\xFD[\x80Qa\rsa\x0B\xE1\x82a\n\xB3V[\x81\x81R\x85` \x83\x85\x01\x01\x11\x15a\r\x88W`\0\x80\xFD[a\r\x99\x82` \x83\x01` \x86\x01a\x0CBV[\x95\x94PPPPPV[`\0\x83Qa\r\xB4\x81\x84` \x88\x01a\x0CBV[\x83Q\x90\x83\x01\x90a\r\xC8\x81\x83` \x88\x01a\x0CBV[\x01\x94\x93PPPPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x0E\x03Wa\x0E\x03a\r\xD1V[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x0EN\x81`)\x85\x01` \x89\x01a\x0CBV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x0Eu\x81`-\x84\x01` \x88\x01a\x0CBV[\x01`-\x01\x99\x98PPPPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x0E\xB8\x81`\x17\x85\x01` \x88\x01a\x0CBV[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x0E\xE9\x81`(\x84\x01` \x88\x01a\x0CBV[\x01`(\x01\x94\x93PPPPV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x02\x83Wa\x02\x83a\r\xD1V[\x80\x82\x01\x80\x82\x11\x15a\x02\x83Wa\x02\x83a\r\xD1V[`\0\x81a\x0F.Wa\x0F.a\r\xD1V[P`\0\x19\x01\x90V\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 \xBD\xC8a+\xB2]}\x87\x97\x18\xD9\x19\xF8\xD4\x8AS\x9A\x8FZ\xEAh\x80G\xD2!\x85a\"\xDCxapdsolcC\0\x08\x1C\x003\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB"; /// The bytecode of the contract. pub static ARBITRUMKEYDERIVER_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __BYTECODE, ); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xBAW`\x005`\xE0\x1C\x80c\x01\xFF\xC9\xA7\x14a\0\xBFW\x80c$\x8A\x9C\xA3\x14a\0\xE7W\x80c//\xF1]\x14a\x01\x08W\x80c6V\x8A\xBE\x14a\x01\x1DW\x80cP\xD1{^\x14a\x010W\x80cu\xB28\xFC\x14a\x01[W\x80c\x91\xD1HT\x14a\x01\x82W\x80c\x9D\xCA\x002\x14a\x01\x95W\x80c\xA2\x17\xFD\xDF\x14a\x01\xB6W\x80c\xA3,+\x99\x14a\x01\xBEW\x80c\xB2N\xD3\x08\x14a\x01\xDFW\x80c\xD5Gt\x1F\x14a\x02\x06W\x80c\xF9]q\xB1\x14a\x02\x19W\x80c\xFE\x89\xC9p\x14a\x02,W[`\0\x80\xFD[a\0\xD2a\0\xCD6`\x04a\t\x8DV[a\x02RV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xFAa\0\xF56`\x04a\t\xB7V[a\x02\x89V[`@Q\x90\x81R` \x01a\0\xDEV[a\x01\x1Ba\x01\x166`\x04a\t\xE5V[a\x02\x9EV[\0[a\x01\x1Ba\x01+6`\x04a\t\xE5V[a\x02\xBFV[`\x01Ta\x01C\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xDEV[a\0\xFA\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\x81V[a\0\xD2a\x01\x906`\x04a\t\xE5V[a\x03BV[`\x01Ta\x01\xA9\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\xDE\x91\x90a\n7V[a\0\xFA`\0\x81V[a\x01\xD1a\x01\xCC6`\x04a\n\xDAV[a\x03kV[`@Qa\0\xDE\x92\x91\x90a\x0C\x92V[a\0\xFA\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9\x81V[a\x01\x1Ba\x02\x146`\x04a\t\xE5V[a\x04\xF6V[a\x01\x1Ba\x02'6`\x04a\x0C\xB5V[a\x05\x12V[a\0\xFA~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x02\x83WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x02\xA7\x82a\x02\x89V[a\x02\xB0\x81a\x05_V[a\x02\xBA\x83\x83a\x05lV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x034W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x03>\x82\x82a\x05\xF0V[PPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[`\0```\0a\x03|\x86\x86\x86a\x06UV[\x90P`\0\x81`\0\x81Q\x81\x10a\x03\x93Wa\x03\x93a\x0C\xD2V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16`\0\x03a\x03\xD0WP\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9a\x03\xF2V[P~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd[`\x01T`@QcGF\xFE\x8B`\xE1\x1B\x81R`\0\x91`\x01`\x01`\xA0\x1B\x03\x81\x16\x91c\x8E\x8D\xFD\x16\x91a\x04/\x91\x86\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x0C\xE8V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04LW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04p\x91\x90a\x0C\xFCV[\x90P`\0\x81`\x01`\x01`\xA0\x1B\x03\x16c\xECr3g\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04\xA0\x91\x90a\r\x19V[`\0`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xBDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra\x04\xE5\x91\x90\x81\x01\x90a\r,V[`\x01\x9A\x90\x99P\x97PPPPPPPPV[a\x04\xFF\x82a\x02\x89V[a\x05\x08\x81a\x05_V[a\x02\xBA\x83\x83a\x05\xF0V[\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECBa\x05<\x81a\x05_V[P`\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[a\x05i\x813a\x07\x87V[PV[a\x05v\x82\x82a\x03BV[a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x05\xAC3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x05\xFA\x82\x82a\x03BV[\x15a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x06\xEFW\x84\x86\x82\x81Q\x81\x10a\x06\x86Wa\x06\x86a\x0C\xD2V[` \x02` \x01\x01Q` \x01Q\x03a\x06\xE7W\x82\x86\x82\x81Q\x81\x10a\x06\xAAWa\x06\xAAa\x0C\xD2V[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x06\xC7\x92\x91\x90a\r\xA2V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x06\xE3\x90a\r\xE7V[\x92PP[`\x01\x01a\x06jV[P\x83`\x02\x03a\x07\x01W`\x01\x93Pa\x07\x0EV[\x83`\x03\x03a\x07\x0EW`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x0F7`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x07e\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x0E\x0CV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x98PPPPPPPPP[\x93\x92PPPV[a\x07\x91\x82\x82a\x03BV[a\x03>Wa\x07\x9E\x81a\x07\xE0V[a\x07\xA9\x83` a\x07\xF2V[`@Q` \x01a\x07\xBA\x92\x91\x90a\x0E\x86V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x03+\x91`\x04\x01a\r\x19V[``a\x02\x83`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\x08\x01\x83`\x02a\x0E\xF5V[a\x08\x0C\x90`\x02a\x0F\x0CV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x08#Wa\x08#a\nEV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x08MW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\x08hWa\x08ha\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\x08\x97Wa\x08\x97a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x08\xBB\x84`\x02a\x0E\xF5V[a\x08\xC6\x90`\x01a\x0F\x0CV[\x90P[`\x01\x81\x11\x15a\t>Wo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x08\xFAWa\x08\xFAa\x0C\xD2V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\t\x10Wa\t\x10a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\t7\x81a\x0F\x1FV[\x90Pa\x08\xC9V[P\x83\x15a\x07\x80W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x03+V[`\0` \x82\x84\x03\x12\x15a\t\x9FW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x07\x80W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\t\xC9W`\0\x80\xFD[P5\x91\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x05iW`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\t\xF8W`\0\x80\xFD[\x825\x91P` \x83\x015a\n\n\x81a\t\xD0V[\x80\x91PP\x92P\x92\x90PV[`\x03\x81\x10a\n3WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x02\x83\x82\x84a\n\x15V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n}Wa\n}a\nEV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n\xABWa\n\xABa\nEV[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\n\xCCWa\n\xCCa\nEV[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x80`\0``\x84\x86\x03\x12\x15a\n\xEFW`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x0CW`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x0B\x1DW`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B6Wa\x0B6a\nEV[\x80`\x05\x1Ba\x0BF` \x82\x01a\n\x83V[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x0BbW`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x0C-W\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x87W`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x0B\x9DW`\0\x80\xFD[a\x0B\xA5a\n[V[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xBEW`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x0B\xD3W`\0\x80\xFD[\x805a\x0B\xE6a\x0B\xE1\x82a\n\xB3V[a\n\x83V[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x0B\xFBW`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x0BiV[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x0C]W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0CEV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x0C~\x81` \x86\x01` \x86\x01a\x0CBV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x15\x15\x81R`@` \x82\x01R`\0a\x0C\xAD`@\x83\x01\x84a\x0CfV[\x94\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x0C\xC7W`\0\x80\xFD[\x815a\x07\x80\x81a\t\xD0V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x82\x81R`@\x81\x01a\x07\x80` \x83\x01\x84a\n\x15V[`\0` \x82\x84\x03\x12\x15a\r\x0EW`\0\x80\xFD[\x81Qa\x07\x80\x81a\t\xD0V[` \x81R`\0a\x07\x80` \x83\x01\x84a\x0CfV[`\0` \x82\x84\x03\x12\x15a\r>W`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\rTW`\0\x80\xFD[\x82\x01`\x1F\x81\x01\x84\x13a\reW`\0\x80\xFD[\x80Qa\rsa\x0B\xE1\x82a\n\xB3V[\x81\x81R\x85` \x83\x85\x01\x01\x11\x15a\r\x88W`\0\x80\xFD[a\r\x99\x82` \x83\x01` \x86\x01a\x0CBV[\x95\x94PPPPPV[`\0\x83Qa\r\xB4\x81\x84` \x88\x01a\x0CBV[\x83Q\x90\x83\x01\x90a\r\xC8\x81\x83` \x88\x01a\x0CBV[\x01\x94\x93PPPPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x0E\x03Wa\x0E\x03a\r\xD1V[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x0EN\x81`)\x85\x01` \x89\x01a\x0CBV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x0Eu\x81`-\x84\x01` \x88\x01a\x0CBV[\x01`-\x01\x99\x98PPPPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x0E\xB8\x81`\x17\x85\x01` \x88\x01a\x0CBV[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x0E\xE9\x81`(\x84\x01` \x88\x01a\x0CBV[\x01`(\x01\x94\x93PPPPV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x02\x83Wa\x02\x83a\r\xD1V[\x80\x82\x01\x80\x82\x11\x15a\x02\x83Wa\x02\x83a\r\xD1V[`\0\x81a\x0F.Wa\x0F.a\r\xD1V[P`\0\x19\x01\x90V\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 7$;\xC4>x\xAC4\xBBE\xBF\xE2CE\x0C(\x1Fa\xD2&\xE1,\xDA\xB0K(\x99\x83*D\xFFwdsolcC\0\x08\x1C\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xBAW`\x005`\xE0\x1C\x80c\x01\xFF\xC9\xA7\x14a\0\xBFW\x80c$\x8A\x9C\xA3\x14a\0\xE7W\x80c//\xF1]\x14a\x01\x08W\x80c6V\x8A\xBE\x14a\x01\x1DW\x80cP\xD1{^\x14a\x010W\x80cu\xB28\xFC\x14a\x01[W\x80c\x91\xD1HT\x14a\x01\x82W\x80c\x9D\xCA\x002\x14a\x01\x95W\x80c\xA2\x17\xFD\xDF\x14a\x01\xB6W\x80c\xA3,+\x99\x14a\x01\xBEW\x80c\xB2N\xD3\x08\x14a\x01\xDFW\x80c\xD5Gt\x1F\x14a\x02\x06W\x80c\xF9]q\xB1\x14a\x02\x19W\x80c\xFE\x89\xC9p\x14a\x02,W[`\0\x80\xFD[a\0\xD2a\0\xCD6`\x04a\t\x8DV[a\x02RV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xFAa\0\xF56`\x04a\t\xB7V[a\x02\x89V[`@Q\x90\x81R` \x01a\0\xDEV[a\x01\x1Ba\x01\x166`\x04a\t\xE5V[a\x02\x9EV[\0[a\x01\x1Ba\x01+6`\x04a\t\xE5V[a\x02\xBFV[`\x01Ta\x01C\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xDEV[a\0\xFA\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\x81V[a\0\xD2a\x01\x906`\x04a\t\xE5V[a\x03BV[`\x01Ta\x01\xA9\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\xDE\x91\x90a\n7V[a\0\xFA`\0\x81V[a\x01\xD1a\x01\xCC6`\x04a\n\xDAV[a\x03kV[`@Qa\0\xDE\x92\x91\x90a\x0C\x92V[a\0\xFA\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9\x81V[a\x01\x1Ba\x02\x146`\x04a\t\xE5V[a\x04\xF6V[a\x01\x1Ba\x02'6`\x04a\x0C\xB5V[a\x05\x12V[a\0\xFA~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x02\x83WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x02\xA7\x82a\x02\x89V[a\x02\xB0\x81a\x05_V[a\x02\xBA\x83\x83a\x05lV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x034W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x03>\x82\x82a\x05\xF0V[PPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[`\0```\0a\x03|\x86\x86\x86a\x06UV[\x90P`\0\x81`\0\x81Q\x81\x10a\x03\x93Wa\x03\x93a\x0C\xD2V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16`\0\x03a\x03\xD0WP\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9a\x03\xF2V[P~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd[`\x01T`@QcGF\xFE\x8B`\xE1\x1B\x81R`\0\x91`\x01`\x01`\xA0\x1B\x03\x81\x16\x91c\x8E\x8D\xFD\x16\x91a\x04/\x91\x86\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x0C\xE8V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04LW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04p\x91\x90a\x0C\xFCV[\x90P`\0\x81`\x01`\x01`\xA0\x1B\x03\x16c\xECr3g\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04\xA0\x91\x90a\r\x19V[`\0`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xBDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra\x04\xE5\x91\x90\x81\x01\x90a\r,V[`\x01\x9A\x90\x99P\x97PPPPPPPPV[a\x04\xFF\x82a\x02\x89V[a\x05\x08\x81a\x05_V[a\x02\xBA\x83\x83a\x05\xF0V[\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECBa\x05<\x81a\x05_V[P`\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[a\x05i\x813a\x07\x87V[PV[a\x05v\x82\x82a\x03BV[a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x05\xAC3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x05\xFA\x82\x82a\x03BV[\x15a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x06\xEFW\x84\x86\x82\x81Q\x81\x10a\x06\x86Wa\x06\x86a\x0C\xD2V[` \x02` \x01\x01Q` \x01Q\x03a\x06\xE7W\x82\x86\x82\x81Q\x81\x10a\x06\xAAWa\x06\xAAa\x0C\xD2V[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x06\xC7\x92\x91\x90a\r\xA2V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x06\xE3\x90a\r\xE7V[\x92PP[`\x01\x01a\x06jV[P\x83`\x02\x03a\x07\x01W`\x01\x93Pa\x07\x0EV[\x83`\x03\x03a\x07\x0EW`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x0F7`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x07e\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x0E\x0CV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x98PPPPPPPPP[\x93\x92PPPV[a\x07\x91\x82\x82a\x03BV[a\x03>Wa\x07\x9E\x81a\x07\xE0V[a\x07\xA9\x83` a\x07\xF2V[`@Q` \x01a\x07\xBA\x92\x91\x90a\x0E\x86V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x03+\x91`\x04\x01a\r\x19V[``a\x02\x83`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\x08\x01\x83`\x02a\x0E\xF5V[a\x08\x0C\x90`\x02a\x0F\x0CV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x08#Wa\x08#a\nEV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x08MW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\x08hWa\x08ha\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\x08\x97Wa\x08\x97a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x08\xBB\x84`\x02a\x0E\xF5V[a\x08\xC6\x90`\x01a\x0F\x0CV[\x90P[`\x01\x81\x11\x15a\t>Wo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x08\xFAWa\x08\xFAa\x0C\xD2V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\t\x10Wa\t\x10a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\t7\x81a\x0F\x1FV[\x90Pa\x08\xC9V[P\x83\x15a\x07\x80W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x03+V[`\0` \x82\x84\x03\x12\x15a\t\x9FW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x07\x80W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\t\xC9W`\0\x80\xFD[P5\x91\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x05iW`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\t\xF8W`\0\x80\xFD[\x825\x91P` \x83\x015a\n\n\x81a\t\xD0V[\x80\x91PP\x92P\x92\x90PV[`\x03\x81\x10a\n3WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x02\x83\x82\x84a\n\x15V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n}Wa\n}a\nEV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n\xABWa\n\xABa\nEV[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\n\xCCWa\n\xCCa\nEV[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x80`\0``\x84\x86\x03\x12\x15a\n\xEFW`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x0CW`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x0B\x1DW`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B6Wa\x0B6a\nEV[\x80`\x05\x1Ba\x0BF` \x82\x01a\n\x83V[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x0BbW`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x0C-W\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x87W`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x0B\x9DW`\0\x80\xFD[a\x0B\xA5a\n[V[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xBEW`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x0B\xD3W`\0\x80\xFD[\x805a\x0B\xE6a\x0B\xE1\x82a\n\xB3V[a\n\x83V[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x0B\xFBW`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x0BiV[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x0C]W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0CEV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x0C~\x81` \x86\x01` \x86\x01a\x0CBV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x15\x15\x81R`@` \x82\x01R`\0a\x0C\xAD`@\x83\x01\x84a\x0CfV[\x94\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x0C\xC7W`\0\x80\xFD[\x815a\x07\x80\x81a\t\xD0V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x82\x81R`@\x81\x01a\x07\x80` \x83\x01\x84a\n\x15V[`\0` \x82\x84\x03\x12\x15a\r\x0EW`\0\x80\xFD[\x81Qa\x07\x80\x81a\t\xD0V[` \x81R`\0a\x07\x80` \x83\x01\x84a\x0CfV[`\0` \x82\x84\x03\x12\x15a\r>W`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\rTW`\0\x80\xFD[\x82\x01`\x1F\x81\x01\x84\x13a\reW`\0\x80\xFD[\x80Qa\rsa\x0B\xE1\x82a\n\xB3V[\x81\x81R\x85` \x83\x85\x01\x01\x11\x15a\r\x88W`\0\x80\xFD[a\r\x99\x82` \x83\x01` \x86\x01a\x0CBV[\x95\x94PPPPPV[`\0\x83Qa\r\xB4\x81\x84` \x88\x01a\x0CBV[\x83Q\x90\x83\x01\x90a\r\xC8\x81\x83` \x88\x01a\x0CBV[\x01\x94\x93PPPPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x0E\x03Wa\x0E\x03a\r\xD1V[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x0EN\x81`)\x85\x01` \x89\x01a\x0CBV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x0Eu\x81`-\x84\x01` \x88\x01a\x0CBV[\x01`-\x01\x99\x98PPPPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x0E\xB8\x81`\x17\x85\x01` \x88\x01a\x0CBV[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x0E\xE9\x81`(\x84\x01` \x88\x01a\x0CBV[\x01`(\x01\x94\x93PPPPV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x02\x83Wa\x02\x83a\r\xD1V[\x80\x82\x01\x80\x82\x11\x15a\x02\x83Wa\x02\x83a\r\xD1V[`\0\x81a\x0F.Wa\x0F.a\r\xD1V[P`\0\x19\x01\x90V\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 \xBD\xC8a+\xB2]}\x87\x97\x18\xD9\x19\xF8\xD4\x8AS\x9A\x8FZ\xEAh\x80G\xD2!\x85a\"\xDCxapdsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static ARBITRUMKEYDERIVER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __DEPLOYED_BYTECODE, diff --git a/rust/lit-core/lit-blockchain-lite/src/contracts/backup_recovery.rs b/rust/lit-core/lit-blockchain-lite/src/contracts/backup_recovery.rs index f9804188..5caa6160 100644 --- a/rust/lit-core/lit-blockchain-lite/src/contracts/backup_recovery.rs +++ b/rust/lit-core/lit-blockchain-lite/src/contracts/backup_recovery.rs @@ -970,6 +970,13 @@ pub mod backup_recovery { ::std::borrow::ToOwned::to_owned("bytes"), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("keySetId"), + kind: ::ethers::core::abi::ethabi::ParamType::String, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("string"), + ), + }, ], outputs: ::std::vec![], constant: ::core::option::Option::None, @@ -2206,14 +2213,18 @@ pub mod backup_recovery { .method_hash([93, 28, 27, 61], party_members) .expect("method not found (this should never happen)") } - ///Calls the contract's `registerRecoveryKeys` (0x960cb990) function + ///Calls the contract's `registerRecoveryKeys` (0xa6fdb149) function pub fn register_recovery_keys( &self, recovery_keys: ::std::vec::Vec, session_id: ::ethers::core::types::Bytes, + key_set_id: ::std::string::String, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([150, 12, 185, 144], (recovery_keys, session_id)) + .method_hash( + [166, 253, 177, 73], + (recovery_keys, session_id, key_set_id), + ) .expect("method not found (this should never happen)") } ///Calls the contract's `setBackupPartyState` (0xb347cccc) function @@ -4151,7 +4162,7 @@ pub mod backup_recovery { pub struct RegisterNewBackupPartyCall { pub party_members: ::std::vec::Vec<::ethers::core::types::Address>, } - ///Container type for all input parameters for the `registerRecoveryKeys` function with signature `registerRecoveryKeys((bytes,uint256)[],bytes)` and selector `0x960cb990` + ///Container type for all input parameters for the `registerRecoveryKeys` function with signature `registerRecoveryKeys((bytes,uint256)[],bytes,string)` and selector `0xa6fdb149` #[derive( Clone, ::ethers::contract::EthCall, @@ -4166,11 +4177,12 @@ pub mod backup_recovery { )] #[ethcall( name = "registerRecoveryKeys", - abi = "registerRecoveryKeys((bytes,uint256)[],bytes)" + abi = "registerRecoveryKeys((bytes,uint256)[],bytes,string)" )] pub struct RegisterRecoveryKeysCall { pub recovery_keys: ::std::vec::Vec, pub session_id: ::ethers::core::types::Bytes, + pub key_set_id: ::std::string::String, } ///Container type for all input parameters for the `setBackupPartyState` function with signature `setBackupPartyState(bytes[],address[])` and selector `0xb347cccc` #[derive( diff --git a/rust/lit-core/lit-blockchain-lite/src/contracts/contract_resolver.rs b/rust/lit-core/lit-blockchain-lite/src/contracts/contract_resolver.rs index 78b3c460..ef6c2899 100644 --- a/rust/lit-core/lit-blockchain-lite/src/contracts/contract_resolver.rs +++ b/rust/lit-core/lit-blockchain-lite/src/contracts/contract_resolver.rs @@ -462,6 +462,30 @@ pub mod contract_resolver { }, ], ), + ( + ::std::borrow::ToOwned::to_owned("PUB_KEY_ROUTER_VIEWS_CONTRACT"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned( + "PUB_KEY_ROUTER_VIEWS_CONTRACT", + ), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( + 32usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes32"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], + ), ( ::std::borrow::ToOwned::to_owned("RATE_LIMIT_NFT_CONTRACT"), ::std::vec![ @@ -1150,13 +1174,13 @@ pub mod contract_resolver { ::ethers::core::abi::Abi, > = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\x14g8\x03\x80a\x14g\x839\x81\x01`@\x81\x90Ra\0/\x91a\x01\xE0V[a\0G`\0\x80Q` a\x14G\x839\x81Q\x91R3a\0\xE9V[a\0_`\0\x80Q` a\x14G\x839\x81Q\x91R\x80a\0\xF7V[`\x01\x80`\0\x83`\x02\x81\x11\x15a\0vWa\0va\x02\x08V[`\x02\x81\x11\x15a\0\x87Wa\0\x87a\x02\x08V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\x83\x9A\xD2t=@b\xDFW\x9E\xDF8\x18\xF6B\xB7\x1E\xE0h\x8A5\xD6\xBCD8\xEFS\x14\xCE\xCE\x80\x15\x81`@Qa\0\xDB\x91\x90a\x02\x1EV[`@Q\x80\x91\x03\x90\xA1Pa\x02FV[a\0\xF3\x82\x82a\x01BV[PPV[`\0\x82\x81R` \x81\x90R`@\x80\x82 `\x01\x01\x80T\x90\x84\x90U\x90Q\x90\x91\x83\x91\x83\x91\x86\x91\x7F\xBDy\xB8o\xFE\n\xB8\xE8waQQB\x17\xCD|\xAC\xD5,\x90\x9FfG\\:\xF4N\x12\x9F\x0B\0\xFF\x91\x90\xA4PPPV[`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 T`\xFF\x16a\0\xF3W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x01\x9C3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[`\0` \x82\x84\x03\x12\x15a\x01\xF2W`\0\x80\xFD[\x81Q`\x03\x81\x10a\x02\x01W`\0\x80\xFD[\x93\x92PPPV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[` \x81\x01`\x03\x83\x10a\x02@WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x91\x90R\x90V[a\x11\xF2\x80a\x02U`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x01\xBCW`\x005`\xE0\x1C\x80c|\xAD\xF6\x9F\x11a\0\xF5W\x80c|\xAD\xF6\x9F\x14a\x04\x17W\x80c}J\x03\xBD\x14a\x04>W\x80c}\x9D(\x80\x14a\x04eW\x80c\x7F\x90 \x9F\x14a\x04\x8CW\x80c\x85\xCB\x11\x91\x14a\x04\xB3W\x80c\x8C\x156\xDF\x14a\x04\xDAW\x80c\x8D\xEB8\x93\x14a\x05\x01W\x80c\x8E\x8D\xFD\x16\x14a\x05\x14W\x80c\x90r\xF88\x14a\x05'W\x80c\x91\xD1HT\x14a\x05NW\x80c\x97z\x80p\x14a\x05aW\x80c\xA2\x17\xFD\xDF\x14a\x05\x88W\x80c\xAD\x1C\x8A\x86\x14a\x05\x90W\x80c\xCD\xDC\xAC\xE5\x14a\x05\xB7W\x80c\xD5Gt\x1F\x14a\x05\xDEW\x80c\xDA\x19\xDD\xFB\x14a\x05\xF1W\x80c\xDF8\x06\x93\x14a\x06\x18W\x80c\xF8\xAE\x93\xB4\x14a\x06?W`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01\xC1W\x80c\x11\xEE\x8F\xF7\x14a\x01\xE9W\x80c\x16\xF7k\xBF\x14a\x02\x1EW\x80c\x17\x85\xF5<\x14a\x02EW\x80c!\x9C&j\x14a\x02ZW\x80c$\x8A\x9C\xA3\x14a\x02\x81W\x80c&h\xF3\x05\x14a\x02\x94W\x80c,\x0B\x8B\xF7\x14a\x02\xBBW\x80c.H\x85\xE8\x14a\x02\xE2W\x80c//\xF1]\x14a\x03\tW\x80c6V\x8A\xBE\x14a\x03\x1CW\x80c>\xBFy\x85\x14a\x03/W\x80cB\x16\xE7:\x14a\x03{W\x80cQ\xAD\n\x80\x14a\x03\xA2W\x80cZ\xF2\x7Fy\x14a\x03\xB5W\x80cpH\x02u\x14a\x03\xDCW\x80ct\xBC\x819\x14a\x03\xEFW\x80cu\xB28\xFC\x14a\x04\x02W[`\0\x80\xFD[a\x01\xD4a\x01\xCF6`\x04a\x0E\xB1V[a\x06fV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x02\x10\x7FX\xA0\x04N\x0E\xCD\x81\x02^9\x8B\xF1\x81Pu\xD1#L\xBA\xC3t\x96\x14\xB0\xB3:@L.\xE2\xBA\xBF\x81V[`@Q\x90\x81R` \x01a\x01\xE0V[a\x02\x10\x7F\xF1OC\x1D\xAD\xC8.}\xBC^7\x9Fq#NW5\xC9\x18~C'\xA7\xC6\xAC\x01MU\xD1\xB7rz\x81V[a\x02Xa\x02S6`\x04a\x0E\xF7V[a\x06\x9DV[\0[a\x02\x10\x7FO\xD3\xE0Hz\x03\x82\xFB\x02|w\xB1\xAELV6r\xC9\xFB0\xA7Hy\x85_\x0C\x86\xC3v\xCF\x96\xEA\x81V[a\x02\x10a\x02\x8F6`\x04a\x0F\x12V[a\x07NV[a\x02\x10\x7F\xB1\xF7\x98\x13\xBCv0\xA5*\xE9H\xBC\x99x\x13\x97\xE4\t\xD0\xDD5!\x95;\xF7\xD8\xD7\xA2\xDBaG\xF7\x81V[a\x02\x10\x7F\xB7\xB4\xFD\xE9\x94M<\x13\xE9\xA7\x885C\x1C3\xA5\x08M\x90\xA7\xF0\xC7=\xEFv\xD7\x88c\x15\xFE\x87\xB0\x81V[a\x02\x10\x7F\xB91\xB2q\x9A\xEB*e\xA5\x03_\xA0\xA1\x90\xBF\xDCL\x86\"\xCE\x8C\xBF\xF7\xA3\xD1\xABBS\x1F\xB1\xA9\x18\x81V[a\x02Xa\x03\x176`\x04a\x0F+V[a\x07cV[a\x02Xa\x03*6`\x04a\x0F+V[a\x07\x84V[a\x03ca\x03=6`\x04a\x0FfV[`\x02` \x90\x81R`\0\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 T`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xE0V[a\x02\x10\x7FLA\xAEEK\xEBk\xBB\xE9\xBEP\xAC\xCC\x95z;\x156\xE4\x8B\x83Z\x86\x91\x9A\xF9\x81\xB5$M\xB7U\x81V[a\x02Xa\x03\xB06`\x04a\x0F\x89V[a\x07\xFEV[a\x02\x10\x7F\xA2\xC772\xDEez\xD0\xF3n\r\xDB\xB2q\x0FK\x13\xE8\xDD\xE4d!8k\xB9-\x1E\x17\x9D\xAEMM\x81V[a\x02Xa\x03\xEA6`\x04a\x0E\xF7V[a\t\x82V[a\x02Xa\x03\xFD6`\x04a\x0F\xC5V[a\t\xB2V[a\x02\x10`\0\x80Q` a\x11\x9D\x839\x81Q\x91R\x81V[a\x02\x10\x7Ft\x84]\xE3|\xFA\xBD5v3!KG\xFA\x91\xCC\xD1\x9B\x05\xB7\xC5\xA0\x8A\xC2,\x18\x7F\x81\x1F\xB6+\xCA\x81V[a\x02\x10\x7F\x9F5\xEF>\x0C&R\xA8\xBB\x87G\xD9/@\x7F\xCD9\xA7v\x8D\xAC\xC7\xF1e\x81\xC7\xA7\x1F\x10>Ub\x81V[a\x02\x10\x7F\xC2o\xAE\xDA\xEE\xDA/\xB9Jf\xD7\x86\xAA\x89\xC4\xA1\x8B\xB7\x90\xFA\0\x9D\x9D\xA9JT\x1D\x92\x18\\\xA9\x16\x81V[a\x02\x10\x7F\xC6gO\x98\xBA5\xC0\x1C\x13\x0E\x08\x19]\xD2lpF`7G:\x06\x8CZ\xAAG\nx=\x99\xC1l\x81V[a\x02\x10\x7F\xAEy\xA95sp\x12\xD0f\xE7\x1802i.R\x1F\xFE\x1A\xDE+\xED\xA2g\xE2>\x02\xB1\xD6\xE9\x11\x87\x81V[a\x02\x10\x7F\xAA\x06\xD1\x08\xDB\xD7\xBF\x97k\x16\xB7\xBFZ\xDB)\xD2\xD0\xEF,8\\\xA8\xB9\xD83\xCC\x80/3\x94-r\x81V[a\x02Xa\x05\x0F6`\x04a\x0F\xC5V[a\nnV[a\x03ca\x05\"6`\x04a\x0FfV[a\x0B\x12V[a\x02\x10\x7FT\x95<#\x06\x8B\x8F\xC4\xC0sc\x01\xB5\x0F\x10\x02}kF\x93'\xDE\x1F\xD4(A\xA5\x07+\x1B\xCE\xBE\x81V[a\x01\xD4a\x05\\6`\x04a\x0F+V[a\x0BhV[a\x02\x10\x7F'\xD7d\xEA*J8eCK\xBFJ9\x11\x10\x14\x96D\xBE1D\x8F4y\xFD\x15\xB4C\x88uWe\x81V[a\x02\x10`\0\x81V[a\x02\x10\x7F:h\xDB\xFD\x8B\xBBd\x01\\B\xBC\x13\x1C8\x8D\xEAye\xE2\x8C\x10\x04\xD0\x9B9\xF5\x95\0\xC3\xA7c\xEC\x81V[a\x02\x10\x7F\x0F'\xB9\xE4k\x89\xC5\xC7B\xE2\x80\x94\xDC\xEF\xE5\xE9F\xC3\xB9\x8F\x0F\xBE\xD8}\x9F\xCF[\x10\xBA\x96\x84\xEC\x81V[a\x02Xa\x05\xEC6`\x04a\x0F+V[a\x0B\x91V[a\x02\x10\x7F\x08\t\t\xC1\x8C\x95\x8C\xE5\xA2\xD3d\x81ix$\xE4w1\x93#\xD01T\xCE\xBA;x\xF2\x8Aa\x88{\x81V[a\x02\x10\x7F\xB4\xBF\x99\x9Bh\xD8\x08]\xBB\xF7\xA0\xEC/Z-f\x08s\x93[\xDF\x1E\xD0\x8E\xB4!\xACm\xCB\xC0\x03b\x81V[a\x02\x10\x7F\xDD[\x9B\x8A^\x8E\x01\xF2\x96.\xD7\xE9\x83\xD5\x8F\xE3.\x1Ff\xAA\x88\xDDz\xB3\x07p\xFA\x9Bw\xDArC\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x06\x97WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x80Q` a\x11\x9D\x839\x81Q\x91Ra\x06\xB5\x81a\x0B\xADV[3`\x01`\x01`\xA0\x1B\x03\x83\x16\x03a\x072W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`7`$\x82\x01R\x7FCannot remove self as admin. Ha`D\x82\x01Rv;2\x90:42\x9072\xBB\x900\xB26\xB4\xB7\x1027\x904\xBA\x17`I\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x07J`\0\x80Q` a\x11\x9D\x839\x81Q\x91R\x83a\x0B\xBAV[PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x07l\x82a\x07NV[a\x07u\x81a\x0B\xADV[a\x07\x7F\x83\x83a\x0C\x1FV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x07\xF4W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x07)V[a\x07J\x82\x82a\x0B\xBAV[a\x08\x16`\0\x80Q` a\x11\x9D\x839\x81Q\x91R3a\x0BhV[a\x083W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x83`\x02\x81\x11\x15a\x08IWa\x08Ia\x0F\xE0V[`\x02\x81\x11\x15a\x08ZWa\x08Za\x0F\xE0V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\xFF\x16\x15\x15`\x01\x14a\x08\xD7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FThe provided Env is not valid fo`D\x82\x01Rn\x1C\x88\x1D\x1A\x1A\\\xC8\x18\xDB\xDB\x9D\x1C\x98X\xDD`\x8A\x1B`d\x82\x01R`\x84\x01a\x07)V[\x80`\x02`\0\x85\x81R` \x01\x90\x81R` \x01`\0 `\0\x84`\x02\x81\x11\x15a\x08\xFFWa\x08\xFFa\x0F\xE0V[`\x02\x81\x11\x15a\t\x10Wa\t\x10a\x0F\xE0V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\x01`\x01`\xA0\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`\xA0\x1B\x03\x16\x02\x17\x90UP\x7F3\xF0\x14\x89\x0F\x10\x92)\xBB\xCF\x8D\xD4r\x04\xC1S\xA2\xC0\xFF\x1CW*a\xDE\"\r\x103e0\xF5=\x83\x83\x83`@Qa\tu\x93\x92\x91\x90a\x10\x18V[`@Q\x80\x91\x03\x90\xA1PPPV[`\0\x80Q` a\x11\x9D\x839\x81Q\x91Ra\t\x9A\x81a\x0B\xADV[a\x07J`\0\x80Q` a\x11\x9D\x839\x81Q\x91R\x83a\x0C\x1FV[a\t\xCA`\0\x80Q` a\x11\x9D\x839\x81Q\x91R3a\x0BhV[a\t\xE7W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01\x80`\0\x83`\x02\x81\x11\x15a\t\xFEWa\t\xFEa\x0F\xE0V[`\x02\x81\x11\x15a\n\x0FWa\n\x0Fa\x0F\xE0V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\x83\x9A\xD2t=@b\xDFW\x9E\xDF8\x18\xF6B\xB7\x1E\xE0h\x8A5\xD6\xBCD8\xEFS\x14\xCE\xCE\x80\x15\x81`@Qa\nc\x91\x90a\x10EV[`@Q\x80\x91\x03\x90\xA1PV[a\n\x86`\0\x80Q` a\x11\x9D\x839\x81Q\x91R3a\x0BhV[a\n\xA3W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x82`\x02\x81\x11\x15a\n\xB9Wa\n\xB9a\x0F\xE0V[`\x02\x81\x11\x15a\n\xCAWa\n\xCAa\x0F\xE0V[\x81R` \x81\x01\x91\x90\x91R`@\x90\x81\x01`\0 \x80T`\xFF\x19\x16\x90UQ\x7F?\x17\x8F\x17\xDA\xE6\xCA\xF8\xCA\t\xC4\x85u\x02\xBA\xF7tN\x85\x97\xDEB\xD6Ydv\xFE\x9E\x06\xB8\xADG\x90a\nc\x90\x83\x90a\x10EV[`\0\x82\x81R`\x02` \x81\x90R`@\x82 \x90\x82\x90\x84\x90\x81\x11\x15a\x0B6Wa\x0B6a\x0F\xE0V[`\x02\x81\x11\x15a\x0BGWa\x0BGa\x0F\xE0V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\x01`\x01`\xA0\x1B\x03\x16\x93\x92PPPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a\x0B\x9A\x82a\x07NV[a\x0B\xA3\x81a\x0B\xADV[a\x07\x7F\x83\x83a\x0B\xBAV[a\x0B\xB7\x813a\x0C\xA3V[PV[a\x0B\xC4\x82\x82a\x0BhV[\x15a\x07JW`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[a\x0C)\x82\x82a\x0BhV[a\x07JW`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x0C_3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x0C\xAD\x82\x82a\x0BhV[a\x07JWa\x0C\xBA\x81a\x0C\xFCV[a\x0C\xC5\x83` a\r\x0EV[`@Q` \x01a\x0C\xD6\x92\x91\x90a\x10wV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x07)\x91`\x04\x01a\x10\xE6V[``a\x06\x97`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\r\x1D\x83`\x02a\x11/V[a\r(\x90`\x02a\x11FV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\r@Wa\r@a\x11YV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\rjW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\x85Wa\r\x85a\x11oV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r\xB4Wa\r\xB4a\x11oV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\r\xD8\x84`\x02a\x11/V[a\r\xE3\x90`\x01a\x11FV[\x90P[`\x01\x81\x11\x15a\x0E[Wo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x0E\x17Wa\x0E\x17a\x11oV[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\x0E-Wa\x0E-a\x11oV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\x0ET\x81a\x11\x85V[\x90Pa\r\xE6V[P\x83\x15a\x0E\xAAW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x07)V[\x93\x92PPPV[`\0` \x82\x84\x03\x12\x15a\x0E\xC3W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x0E\xAAW`\0\x80\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0E\xF2W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x0F\tW`\0\x80\xFD[a\x0E\xAA\x82a\x0E\xDBV[`\0` \x82\x84\x03\x12\x15a\x0F$W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x0F>W`\0\x80\xFD[\x825\x91Pa\x0FN` \x84\x01a\x0E\xDBV[\x90P\x92P\x92\x90PV[\x805`\x03\x81\x10a\x0E\xF2W`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x0FyW`\0\x80\xFD[\x825\x91Pa\x0FN` \x84\x01a\x0FWV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x0F\x9EW`\0\x80\xFD[\x835\x92Pa\x0F\xAE` \x85\x01a\x0FWV[\x91Pa\x0F\xBC`@\x85\x01a\x0E\xDBV[\x90P\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15a\x0F\xD7W`\0\x80\xFD[a\x0E\xAA\x82a\x0FWV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x03\x81\x10a\x10\x14WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[\x83\x81R``\x81\x01a\x10,` \x83\x01\x85a\x0F\xF6V[`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16`@\x91\x90\x91\x01R\x92\x91PPV[` \x81\x01a\x06\x97\x82\x84a\x0F\xF6V[`\0[\x83\x81\x10\x15a\x10nW\x81\x81\x01Q\x83\x82\x01R` \x01a\x10VV[PP`\0\x91\x01RV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x10\xA9\x81`\x17\x85\x01` \x88\x01a\x10SV[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x10\xDA\x81`(\x84\x01` \x88\x01a\x10SV[\x01`(\x01\x94\x93PPPPV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x11\x05\x81`@\x85\x01` \x87\x01a\x10SV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x06\x97Wa\x06\x97a\x11\x19V[\x80\x82\x01\x80\x82\x11\x15a\x06\x97Wa\x06\x97a\x11\x19V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81a\x11\x94Wa\x11\x94a\x11\x19V[P`\0\x19\x01\x90V\xFE\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\xA2dipfsX\"\x12 \xBC\xFBZ\xA3%\x1D\xDF3\xA8sl\x96\x89\xBD\x99\xCE\xA1\xDF[\xAA\x0F\xAC8|Ui\x13rX%\xC9rdsolcC\0\x08\x1C\x003\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB"; + const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\x14\x998\x03\x80a\x14\x99\x839\x81\x01`@\x81\x90Ra\0/\x91a\x01\xE0V[a\0G`\0\x80Q` a\x14y\x839\x81Q\x91R3a\0\xE9V[a\0_`\0\x80Q` a\x14y\x839\x81Q\x91R\x80a\0\xF7V[`\x01\x80`\0\x83`\x02\x81\x11\x15a\0vWa\0va\x02\x08V[`\x02\x81\x11\x15a\0\x87Wa\0\x87a\x02\x08V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\x83\x9A\xD2t=@b\xDFW\x9E\xDF8\x18\xF6B\xB7\x1E\xE0h\x8A5\xD6\xBCD8\xEFS\x14\xCE\xCE\x80\x15\x81`@Qa\0\xDB\x91\x90a\x02\x1EV[`@Q\x80\x91\x03\x90\xA1Pa\x02FV[a\0\xF3\x82\x82a\x01BV[PPV[`\0\x82\x81R` \x81\x90R`@\x80\x82 `\x01\x01\x80T\x90\x84\x90U\x90Q\x90\x91\x83\x91\x83\x91\x86\x91\x7F\xBDy\xB8o\xFE\n\xB8\xE8waQQB\x17\xCD|\xAC\xD5,\x90\x9FfG\\:\xF4N\x12\x9F\x0B\0\xFF\x91\x90\xA4PPPV[`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 T`\xFF\x16a\0\xF3W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x01\x9C3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[`\0` \x82\x84\x03\x12\x15a\x01\xF2W`\0\x80\xFD[\x81Q`\x03\x81\x10a\x02\x01W`\0\x80\xFD[\x93\x92PPPV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[` \x81\x01`\x03\x83\x10a\x02@WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x91\x90R\x90V[a\x12$\x80a\x02U`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x01\xC7W`\x005`\xE0\x1C\x80c|\xAD\xF6\x9F\x11a\x01\0W\x80c|\xAD\xF6\x9F\x14a\x04\"W\x80c}J\x03\xBD\x14a\x04IW\x80c}\x9D(\x80\x14a\x04pW\x80c\x7F\x90 \x9F\x14a\x04\x97W\x80c\x81\xD4\x95x\x14a\x04\xBEW\x80c\x85\xCB\x11\x91\x14a\x04\xE5W\x80c\x8C\x156\xDF\x14a\x05\x0CW\x80c\x8D\xEB8\x93\x14a\x053W\x80c\x8E\x8D\xFD\x16\x14a\x05FW\x80c\x90r\xF88\x14a\x05YW\x80c\x91\xD1HT\x14a\x05\x80W\x80c\x97z\x80p\x14a\x05\x93W\x80c\xA2\x17\xFD\xDF\x14a\x05\xBAW\x80c\xAD\x1C\x8A\x86\x14a\x05\xC2W\x80c\xCD\xDC\xAC\xE5\x14a\x05\xE9W\x80c\xD5Gt\x1F\x14a\x06\x10W\x80c\xDA\x19\xDD\xFB\x14a\x06#W\x80c\xDF8\x06\x93\x14a\x06JW\x80c\xF8\xAE\x93\xB4\x14a\x06qW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01\xCCW\x80c\x11\xEE\x8F\xF7\x14a\x01\xF4W\x80c\x16\xF7k\xBF\x14a\x02)W\x80c\x17\x85\xF5<\x14a\x02PW\x80c!\x9C&j\x14a\x02eW\x80c$\x8A\x9C\xA3\x14a\x02\x8CW\x80c&h\xF3\x05\x14a\x02\x9FW\x80c,\x0B\x8B\xF7\x14a\x02\xC6W\x80c.H\x85\xE8\x14a\x02\xEDW\x80c//\xF1]\x14a\x03\x14W\x80c6V\x8A\xBE\x14a\x03'W\x80c>\xBFy\x85\x14a\x03:W\x80cB\x16\xE7:\x14a\x03\x86W\x80cQ\xAD\n\x80\x14a\x03\xADW\x80cZ\xF2\x7Fy\x14a\x03\xC0W\x80cpH\x02u\x14a\x03\xE7W\x80ct\xBC\x819\x14a\x03\xFAW\x80cu\xB28\xFC\x14a\x04\rW[`\0\x80\xFD[a\x01\xDFa\x01\xDA6`\x04a\x0E\xE3V[a\x06\x98V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x02\x1B\x7FX\xA0\x04N\x0E\xCD\x81\x02^9\x8B\xF1\x81Pu\xD1#L\xBA\xC3t\x96\x14\xB0\xB3:@L.\xE2\xBA\xBF\x81V[`@Q\x90\x81R` \x01a\x01\xEBV[a\x02\x1B\x7F\xF1OC\x1D\xAD\xC8.}\xBC^7\x9Fq#NW5\xC9\x18~C'\xA7\xC6\xAC\x01MU\xD1\xB7rz\x81V[a\x02ca\x02^6`\x04a\x0F)V[a\x06\xCFV[\0[a\x02\x1B\x7FO\xD3\xE0Hz\x03\x82\xFB\x02|w\xB1\xAELV6r\xC9\xFB0\xA7Hy\x85_\x0C\x86\xC3v\xCF\x96\xEA\x81V[a\x02\x1Ba\x02\x9A6`\x04a\x0FDV[a\x07\x80V[a\x02\x1B\x7F\xB1\xF7\x98\x13\xBCv0\xA5*\xE9H\xBC\x99x\x13\x97\xE4\t\xD0\xDD5!\x95;\xF7\xD8\xD7\xA2\xDBaG\xF7\x81V[a\x02\x1B\x7F\xB7\xB4\xFD\xE9\x94M<\x13\xE9\xA7\x885C\x1C3\xA5\x08M\x90\xA7\xF0\xC7=\xEFv\xD7\x88c\x15\xFE\x87\xB0\x81V[a\x02\x1B\x7F\xB91\xB2q\x9A\xEB*e\xA5\x03_\xA0\xA1\x90\xBF\xDCL\x86\"\xCE\x8C\xBF\xF7\xA3\xD1\xABBS\x1F\xB1\xA9\x18\x81V[a\x02ca\x03\"6`\x04a\x0F]V[a\x07\x95V[a\x02ca\x0356`\x04a\x0F]V[a\x07\xB6V[a\x03na\x03H6`\x04a\x0F\x98V[`\x02` \x90\x81R`\0\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 T`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xEBV[a\x02\x1B\x7FLA\xAEEK\xEBk\xBB\xE9\xBEP\xAC\xCC\x95z;\x156\xE4\x8B\x83Z\x86\x91\x9A\xF9\x81\xB5$M\xB7U\x81V[a\x02ca\x03\xBB6`\x04a\x0F\xBBV[a\x080V[a\x02\x1B\x7F\xA2\xC772\xDEez\xD0\xF3n\r\xDB\xB2q\x0FK\x13\xE8\xDD\xE4d!8k\xB9-\x1E\x17\x9D\xAEMM\x81V[a\x02ca\x03\xF56`\x04a\x0F)V[a\t\xB4V[a\x02ca\x04\x086`\x04a\x0F\xF7V[a\t\xE4V[a\x02\x1B`\0\x80Q` a\x11\xCF\x839\x81Q\x91R\x81V[a\x02\x1B\x7Ft\x84]\xE3|\xFA\xBD5v3!KG\xFA\x91\xCC\xD1\x9B\x05\xB7\xC5\xA0\x8A\xC2,\x18\x7F\x81\x1F\xB6+\xCA\x81V[a\x02\x1B\x7F\x9F5\xEF>\x0C&R\xA8\xBB\x87G\xD9/@\x7F\xCD9\xA7v\x8D\xAC\xC7\xF1e\x81\xC7\xA7\x1F\x10>Ub\x81V[a\x02\x1B\x7F\xC2o\xAE\xDA\xEE\xDA/\xB9Jf\xD7\x86\xAA\x89\xC4\xA1\x8B\xB7\x90\xFA\0\x9D\x9D\xA9JT\x1D\x92\x18\\\xA9\x16\x81V[a\x02\x1B\x7F\xC6gO\x98\xBA5\xC0\x1C\x13\x0E\x08\x19]\xD2lpF`7G:\x06\x8CZ\xAAG\nx=\x99\xC1l\x81V[a\x02\x1B\x7FWIm\xE40\x02\x8F2,Y+\x0FsQ\x10\xEB4\xF1\xAE\x81\x84\xA9K\xC5\x1D@\xB0\x84{TF\x9B\x81V[a\x02\x1B\x7F\xAEy\xA95sp\x12\xD0f\xE7\x1802i.R\x1F\xFE\x1A\xDE+\xED\xA2g\xE2>\x02\xB1\xD6\xE9\x11\x87\x81V[a\x02\x1B\x7F\xAA\x06\xD1\x08\xDB\xD7\xBF\x97k\x16\xB7\xBFZ\xDB)\xD2\xD0\xEF,8\\\xA8\xB9\xD83\xCC\x80/3\x94-r\x81V[a\x02ca\x05A6`\x04a\x0F\xF7V[a\n\xA0V[a\x03na\x05T6`\x04a\x0F\x98V[a\x0BDV[a\x02\x1B\x7FT\x95<#\x06\x8B\x8F\xC4\xC0sc\x01\xB5\x0F\x10\x02}kF\x93'\xDE\x1F\xD4(A\xA5\x07+\x1B\xCE\xBE\x81V[a\x01\xDFa\x05\x8E6`\x04a\x0F]V[a\x0B\x9AV[a\x02\x1B\x7F'\xD7d\xEA*J8eCK\xBFJ9\x11\x10\x14\x96D\xBE1D\x8F4y\xFD\x15\xB4C\x88uWe\x81V[a\x02\x1B`\0\x81V[a\x02\x1B\x7F:h\xDB\xFD\x8B\xBBd\x01\\B\xBC\x13\x1C8\x8D\xEAye\xE2\x8C\x10\x04\xD0\x9B9\xF5\x95\0\xC3\xA7c\xEC\x81V[a\x02\x1B\x7F\x0F'\xB9\xE4k\x89\xC5\xC7B\xE2\x80\x94\xDC\xEF\xE5\xE9F\xC3\xB9\x8F\x0F\xBE\xD8}\x9F\xCF[\x10\xBA\x96\x84\xEC\x81V[a\x02ca\x06\x1E6`\x04a\x0F]V[a\x0B\xC3V[a\x02\x1B\x7F\x08\t\t\xC1\x8C\x95\x8C\xE5\xA2\xD3d\x81ix$\xE4w1\x93#\xD01T\xCE\xBA;x\xF2\x8Aa\x88{\x81V[a\x02\x1B\x7F\xB4\xBF\x99\x9Bh\xD8\x08]\xBB\xF7\xA0\xEC/Z-f\x08s\x93[\xDF\x1E\xD0\x8E\xB4!\xACm\xCB\xC0\x03b\x81V[a\x02\x1B\x7F\xDD[\x9B\x8A^\x8E\x01\xF2\x96.\xD7\xE9\x83\xD5\x8F\xE3.\x1Ff\xAA\x88\xDDz\xB3\x07p\xFA\x9Bw\xDArC\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x06\xC9WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x80Q` a\x11\xCF\x839\x81Q\x91Ra\x06\xE7\x81a\x0B\xDFV[3`\x01`\x01`\xA0\x1B\x03\x83\x16\x03a\x07dW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`7`$\x82\x01R\x7FCannot remove self as admin. Ha`D\x82\x01Rv;2\x90:42\x9072\xBB\x900\xB26\xB4\xB7\x1027\x904\xBA\x17`I\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x07|`\0\x80Q` a\x11\xCF\x839\x81Q\x91R\x83a\x0B\xECV[PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x07\x9E\x82a\x07\x80V[a\x07\xA7\x81a\x0B\xDFV[a\x07\xB1\x83\x83a\x0CQV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x08&W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x07[V[a\x07|\x82\x82a\x0B\xECV[a\x08H`\0\x80Q` a\x11\xCF\x839\x81Q\x91R3a\x0B\x9AV[a\x08eW`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x83`\x02\x81\x11\x15a\x08{Wa\x08{a\x10\x12V[`\x02\x81\x11\x15a\x08\x8CWa\x08\x8Ca\x10\x12V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\xFF\x16\x15\x15`\x01\x14a\t\tW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FThe provided Env is not valid fo`D\x82\x01Rn\x1C\x88\x1D\x1A\x1A\\\xC8\x18\xDB\xDB\x9D\x1C\x98X\xDD`\x8A\x1B`d\x82\x01R`\x84\x01a\x07[V[\x80`\x02`\0\x85\x81R` \x01\x90\x81R` \x01`\0 `\0\x84`\x02\x81\x11\x15a\t1Wa\t1a\x10\x12V[`\x02\x81\x11\x15a\tBWa\tBa\x10\x12V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\x01`\x01`\xA0\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`\xA0\x1B\x03\x16\x02\x17\x90UP\x7F3\xF0\x14\x89\x0F\x10\x92)\xBB\xCF\x8D\xD4r\x04\xC1S\xA2\xC0\xFF\x1CW*a\xDE\"\r\x103e0\xF5=\x83\x83\x83`@Qa\t\xA7\x93\x92\x91\x90a\x10JV[`@Q\x80\x91\x03\x90\xA1PPPV[`\0\x80Q` a\x11\xCF\x839\x81Q\x91Ra\t\xCC\x81a\x0B\xDFV[a\x07|`\0\x80Q` a\x11\xCF\x839\x81Q\x91R\x83a\x0CQV[a\t\xFC`\0\x80Q` a\x11\xCF\x839\x81Q\x91R3a\x0B\x9AV[a\n\x19W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01\x80`\0\x83`\x02\x81\x11\x15a\n0Wa\n0a\x10\x12V[`\x02\x81\x11\x15a\nAWa\nAa\x10\x12V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\x83\x9A\xD2t=@b\xDFW\x9E\xDF8\x18\xF6B\xB7\x1E\xE0h\x8A5\xD6\xBCD8\xEFS\x14\xCE\xCE\x80\x15\x81`@Qa\n\x95\x91\x90a\x10wV[`@Q\x80\x91\x03\x90\xA1PV[a\n\xB8`\0\x80Q` a\x11\xCF\x839\x81Q\x91R3a\x0B\x9AV[a\n\xD5W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x82`\x02\x81\x11\x15a\n\xEBWa\n\xEBa\x10\x12V[`\x02\x81\x11\x15a\n\xFCWa\n\xFCa\x10\x12V[\x81R` \x81\x01\x91\x90\x91R`@\x90\x81\x01`\0 \x80T`\xFF\x19\x16\x90UQ\x7F?\x17\x8F\x17\xDA\xE6\xCA\xF8\xCA\t\xC4\x85u\x02\xBA\xF7tN\x85\x97\xDEB\xD6Ydv\xFE\x9E\x06\xB8\xADG\x90a\n\x95\x90\x83\x90a\x10wV[`\0\x82\x81R`\x02` \x81\x90R`@\x82 \x90\x82\x90\x84\x90\x81\x11\x15a\x0BhWa\x0Bha\x10\x12V[`\x02\x81\x11\x15a\x0ByWa\x0Bya\x10\x12V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\x01`\x01`\xA0\x1B\x03\x16\x93\x92PPPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a\x0B\xCC\x82a\x07\x80V[a\x0B\xD5\x81a\x0B\xDFV[a\x07\xB1\x83\x83a\x0B\xECV[a\x0B\xE9\x813a\x0C\xD5V[PV[a\x0B\xF6\x82\x82a\x0B\x9AV[\x15a\x07|W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[a\x0C[\x82\x82a\x0B\x9AV[a\x07|W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x0C\x913\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x0C\xDF\x82\x82a\x0B\x9AV[a\x07|Wa\x0C\xEC\x81a\r.V[a\x0C\xF7\x83` a\r@V[`@Q` \x01a\r\x08\x92\x91\x90a\x10\xA9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x07[\x91`\x04\x01a\x11\x18V[``a\x06\xC9`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\rO\x83`\x02a\x11aV[a\rZ\x90`\x02a\x11xV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\rrWa\rra\x11\x8BV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\r\x9CW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\xB7Wa\r\xB7a\x11\xA1V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r\xE6Wa\r\xE6a\x11\xA1V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x0E\n\x84`\x02a\x11aV[a\x0E\x15\x90`\x01a\x11xV[\x90P[`\x01\x81\x11\x15a\x0E\x8DWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x0EIWa\x0EIa\x11\xA1V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\x0E_Wa\x0E_a\x11\xA1V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\x0E\x86\x81a\x11\xB7V[\x90Pa\x0E\x18V[P\x83\x15a\x0E\xDCW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x07[V[\x93\x92PPPV[`\0` \x82\x84\x03\x12\x15a\x0E\xF5W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x0E\xDCW`\0\x80\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0F$W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x0F;W`\0\x80\xFD[a\x0E\xDC\x82a\x0F\rV[`\0` \x82\x84\x03\x12\x15a\x0FVW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x0FpW`\0\x80\xFD[\x825\x91Pa\x0F\x80` \x84\x01a\x0F\rV[\x90P\x92P\x92\x90PV[\x805`\x03\x81\x10a\x0F$W`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x0F\xABW`\0\x80\xFD[\x825\x91Pa\x0F\x80` \x84\x01a\x0F\x89V[`\0\x80`\0``\x84\x86\x03\x12\x15a\x0F\xD0W`\0\x80\xFD[\x835\x92Pa\x0F\xE0` \x85\x01a\x0F\x89V[\x91Pa\x0F\xEE`@\x85\x01a\x0F\rV[\x90P\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15a\x10\tW`\0\x80\xFD[a\x0E\xDC\x82a\x0F\x89V[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x03\x81\x10a\x10FWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[\x83\x81R``\x81\x01a\x10^` \x83\x01\x85a\x10(V[`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16`@\x91\x90\x91\x01R\x92\x91PPV[` \x81\x01a\x06\xC9\x82\x84a\x10(V[`\0[\x83\x81\x10\x15a\x10\xA0W\x81\x81\x01Q\x83\x82\x01R` \x01a\x10\x88V[PP`\0\x91\x01RV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x10\xDB\x81`\x17\x85\x01` \x88\x01a\x10\x85V[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x11\x0C\x81`(\x84\x01` \x88\x01a\x10\x85V[\x01`(\x01\x94\x93PPPPV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x117\x81`@\x85\x01` \x87\x01a\x10\x85V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x06\xC9Wa\x06\xC9a\x11KV[\x80\x82\x01\x80\x82\x11\x15a\x06\xC9Wa\x06\xC9a\x11KV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81a\x11\xC6Wa\x11\xC6a\x11KV[P`\0\x19\x01\x90V\xFE\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\xA2dipfsX\"\x12 e'hp\xAE\xCC\x95\xD0\x02j9\xA8\xA0\x8D\xC1\xB9\xA7&IlM\x88\xB6Eo*\xC6@TW\x80c}\x9D(\x80\x14a\x04eW\x80c\x7F\x90 \x9F\x14a\x04\x8CW\x80c\x85\xCB\x11\x91\x14a\x04\xB3W\x80c\x8C\x156\xDF\x14a\x04\xDAW\x80c\x8D\xEB8\x93\x14a\x05\x01W\x80c\x8E\x8D\xFD\x16\x14a\x05\x14W\x80c\x90r\xF88\x14a\x05'W\x80c\x91\xD1HT\x14a\x05NW\x80c\x97z\x80p\x14a\x05aW\x80c\xA2\x17\xFD\xDF\x14a\x05\x88W\x80c\xAD\x1C\x8A\x86\x14a\x05\x90W\x80c\xCD\xDC\xAC\xE5\x14a\x05\xB7W\x80c\xD5Gt\x1F\x14a\x05\xDEW\x80c\xDA\x19\xDD\xFB\x14a\x05\xF1W\x80c\xDF8\x06\x93\x14a\x06\x18W\x80c\xF8\xAE\x93\xB4\x14a\x06?W`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01\xC1W\x80c\x11\xEE\x8F\xF7\x14a\x01\xE9W\x80c\x16\xF7k\xBF\x14a\x02\x1EW\x80c\x17\x85\xF5<\x14a\x02EW\x80c!\x9C&j\x14a\x02ZW\x80c$\x8A\x9C\xA3\x14a\x02\x81W\x80c&h\xF3\x05\x14a\x02\x94W\x80c,\x0B\x8B\xF7\x14a\x02\xBBW\x80c.H\x85\xE8\x14a\x02\xE2W\x80c//\xF1]\x14a\x03\tW\x80c6V\x8A\xBE\x14a\x03\x1CW\x80c>\xBFy\x85\x14a\x03/W\x80cB\x16\xE7:\x14a\x03{W\x80cQ\xAD\n\x80\x14a\x03\xA2W\x80cZ\xF2\x7Fy\x14a\x03\xB5W\x80cpH\x02u\x14a\x03\xDCW\x80ct\xBC\x819\x14a\x03\xEFW\x80cu\xB28\xFC\x14a\x04\x02W[`\0\x80\xFD[a\x01\xD4a\x01\xCF6`\x04a\x0E\xB1V[a\x06fV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x02\x10\x7FX\xA0\x04N\x0E\xCD\x81\x02^9\x8B\xF1\x81Pu\xD1#L\xBA\xC3t\x96\x14\xB0\xB3:@L.\xE2\xBA\xBF\x81V[`@Q\x90\x81R` \x01a\x01\xE0V[a\x02\x10\x7F\xF1OC\x1D\xAD\xC8.}\xBC^7\x9Fq#NW5\xC9\x18~C'\xA7\xC6\xAC\x01MU\xD1\xB7rz\x81V[a\x02Xa\x02S6`\x04a\x0E\xF7V[a\x06\x9DV[\0[a\x02\x10\x7FO\xD3\xE0Hz\x03\x82\xFB\x02|w\xB1\xAELV6r\xC9\xFB0\xA7Hy\x85_\x0C\x86\xC3v\xCF\x96\xEA\x81V[a\x02\x10a\x02\x8F6`\x04a\x0F\x12V[a\x07NV[a\x02\x10\x7F\xB1\xF7\x98\x13\xBCv0\xA5*\xE9H\xBC\x99x\x13\x97\xE4\t\xD0\xDD5!\x95;\xF7\xD8\xD7\xA2\xDBaG\xF7\x81V[a\x02\x10\x7F\xB7\xB4\xFD\xE9\x94M<\x13\xE9\xA7\x885C\x1C3\xA5\x08M\x90\xA7\xF0\xC7=\xEFv\xD7\x88c\x15\xFE\x87\xB0\x81V[a\x02\x10\x7F\xB91\xB2q\x9A\xEB*e\xA5\x03_\xA0\xA1\x90\xBF\xDCL\x86\"\xCE\x8C\xBF\xF7\xA3\xD1\xABBS\x1F\xB1\xA9\x18\x81V[a\x02Xa\x03\x176`\x04a\x0F+V[a\x07cV[a\x02Xa\x03*6`\x04a\x0F+V[a\x07\x84V[a\x03ca\x03=6`\x04a\x0FfV[`\x02` \x90\x81R`\0\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 T`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xE0V[a\x02\x10\x7FLA\xAEEK\xEBk\xBB\xE9\xBEP\xAC\xCC\x95z;\x156\xE4\x8B\x83Z\x86\x91\x9A\xF9\x81\xB5$M\xB7U\x81V[a\x02Xa\x03\xB06`\x04a\x0F\x89V[a\x07\xFEV[a\x02\x10\x7F\xA2\xC772\xDEez\xD0\xF3n\r\xDB\xB2q\x0FK\x13\xE8\xDD\xE4d!8k\xB9-\x1E\x17\x9D\xAEMM\x81V[a\x02Xa\x03\xEA6`\x04a\x0E\xF7V[a\t\x82V[a\x02Xa\x03\xFD6`\x04a\x0F\xC5V[a\t\xB2V[a\x02\x10`\0\x80Q` a\x11\x9D\x839\x81Q\x91R\x81V[a\x02\x10\x7Ft\x84]\xE3|\xFA\xBD5v3!KG\xFA\x91\xCC\xD1\x9B\x05\xB7\xC5\xA0\x8A\xC2,\x18\x7F\x81\x1F\xB6+\xCA\x81V[a\x02\x10\x7F\x9F5\xEF>\x0C&R\xA8\xBB\x87G\xD9/@\x7F\xCD9\xA7v\x8D\xAC\xC7\xF1e\x81\xC7\xA7\x1F\x10>Ub\x81V[a\x02\x10\x7F\xC2o\xAE\xDA\xEE\xDA/\xB9Jf\xD7\x86\xAA\x89\xC4\xA1\x8B\xB7\x90\xFA\0\x9D\x9D\xA9JT\x1D\x92\x18\\\xA9\x16\x81V[a\x02\x10\x7F\xC6gO\x98\xBA5\xC0\x1C\x13\x0E\x08\x19]\xD2lpF`7G:\x06\x8CZ\xAAG\nx=\x99\xC1l\x81V[a\x02\x10\x7F\xAEy\xA95sp\x12\xD0f\xE7\x1802i.R\x1F\xFE\x1A\xDE+\xED\xA2g\xE2>\x02\xB1\xD6\xE9\x11\x87\x81V[a\x02\x10\x7F\xAA\x06\xD1\x08\xDB\xD7\xBF\x97k\x16\xB7\xBFZ\xDB)\xD2\xD0\xEF,8\\\xA8\xB9\xD83\xCC\x80/3\x94-r\x81V[a\x02Xa\x05\x0F6`\x04a\x0F\xC5V[a\nnV[a\x03ca\x05\"6`\x04a\x0FfV[a\x0B\x12V[a\x02\x10\x7FT\x95<#\x06\x8B\x8F\xC4\xC0sc\x01\xB5\x0F\x10\x02}kF\x93'\xDE\x1F\xD4(A\xA5\x07+\x1B\xCE\xBE\x81V[a\x01\xD4a\x05\\6`\x04a\x0F+V[a\x0BhV[a\x02\x10\x7F'\xD7d\xEA*J8eCK\xBFJ9\x11\x10\x14\x96D\xBE1D\x8F4y\xFD\x15\xB4C\x88uWe\x81V[a\x02\x10`\0\x81V[a\x02\x10\x7F:h\xDB\xFD\x8B\xBBd\x01\\B\xBC\x13\x1C8\x8D\xEAye\xE2\x8C\x10\x04\xD0\x9B9\xF5\x95\0\xC3\xA7c\xEC\x81V[a\x02\x10\x7F\x0F'\xB9\xE4k\x89\xC5\xC7B\xE2\x80\x94\xDC\xEF\xE5\xE9F\xC3\xB9\x8F\x0F\xBE\xD8}\x9F\xCF[\x10\xBA\x96\x84\xEC\x81V[a\x02Xa\x05\xEC6`\x04a\x0F+V[a\x0B\x91V[a\x02\x10\x7F\x08\t\t\xC1\x8C\x95\x8C\xE5\xA2\xD3d\x81ix$\xE4w1\x93#\xD01T\xCE\xBA;x\xF2\x8Aa\x88{\x81V[a\x02\x10\x7F\xB4\xBF\x99\x9Bh\xD8\x08]\xBB\xF7\xA0\xEC/Z-f\x08s\x93[\xDF\x1E\xD0\x8E\xB4!\xACm\xCB\xC0\x03b\x81V[a\x02\x10\x7F\xDD[\x9B\x8A^\x8E\x01\xF2\x96.\xD7\xE9\x83\xD5\x8F\xE3.\x1Ff\xAA\x88\xDDz\xB3\x07p\xFA\x9Bw\xDArC\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x06\x97WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x80Q` a\x11\x9D\x839\x81Q\x91Ra\x06\xB5\x81a\x0B\xADV[3`\x01`\x01`\xA0\x1B\x03\x83\x16\x03a\x072W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`7`$\x82\x01R\x7FCannot remove self as admin. Ha`D\x82\x01Rv;2\x90:42\x9072\xBB\x900\xB26\xB4\xB7\x1027\x904\xBA\x17`I\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x07J`\0\x80Q` a\x11\x9D\x839\x81Q\x91R\x83a\x0B\xBAV[PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x07l\x82a\x07NV[a\x07u\x81a\x0B\xADV[a\x07\x7F\x83\x83a\x0C\x1FV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x07\xF4W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x07)V[a\x07J\x82\x82a\x0B\xBAV[a\x08\x16`\0\x80Q` a\x11\x9D\x839\x81Q\x91R3a\x0BhV[a\x083W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x83`\x02\x81\x11\x15a\x08IWa\x08Ia\x0F\xE0V[`\x02\x81\x11\x15a\x08ZWa\x08Za\x0F\xE0V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\xFF\x16\x15\x15`\x01\x14a\x08\xD7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FThe provided Env is not valid fo`D\x82\x01Rn\x1C\x88\x1D\x1A\x1A\\\xC8\x18\xDB\xDB\x9D\x1C\x98X\xDD`\x8A\x1B`d\x82\x01R`\x84\x01a\x07)V[\x80`\x02`\0\x85\x81R` \x01\x90\x81R` \x01`\0 `\0\x84`\x02\x81\x11\x15a\x08\xFFWa\x08\xFFa\x0F\xE0V[`\x02\x81\x11\x15a\t\x10Wa\t\x10a\x0F\xE0V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\x01`\x01`\xA0\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`\xA0\x1B\x03\x16\x02\x17\x90UP\x7F3\xF0\x14\x89\x0F\x10\x92)\xBB\xCF\x8D\xD4r\x04\xC1S\xA2\xC0\xFF\x1CW*a\xDE\"\r\x103e0\xF5=\x83\x83\x83`@Qa\tu\x93\x92\x91\x90a\x10\x18V[`@Q\x80\x91\x03\x90\xA1PPPV[`\0\x80Q` a\x11\x9D\x839\x81Q\x91Ra\t\x9A\x81a\x0B\xADV[a\x07J`\0\x80Q` a\x11\x9D\x839\x81Q\x91R\x83a\x0C\x1FV[a\t\xCA`\0\x80Q` a\x11\x9D\x839\x81Q\x91R3a\x0BhV[a\t\xE7W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01\x80`\0\x83`\x02\x81\x11\x15a\t\xFEWa\t\xFEa\x0F\xE0V[`\x02\x81\x11\x15a\n\x0FWa\n\x0Fa\x0F\xE0V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\x83\x9A\xD2t=@b\xDFW\x9E\xDF8\x18\xF6B\xB7\x1E\xE0h\x8A5\xD6\xBCD8\xEFS\x14\xCE\xCE\x80\x15\x81`@Qa\nc\x91\x90a\x10EV[`@Q\x80\x91\x03\x90\xA1PV[a\n\x86`\0\x80Q` a\x11\x9D\x839\x81Q\x91R3a\x0BhV[a\n\xA3W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x82`\x02\x81\x11\x15a\n\xB9Wa\n\xB9a\x0F\xE0V[`\x02\x81\x11\x15a\n\xCAWa\n\xCAa\x0F\xE0V[\x81R` \x81\x01\x91\x90\x91R`@\x90\x81\x01`\0 \x80T`\xFF\x19\x16\x90UQ\x7F?\x17\x8F\x17\xDA\xE6\xCA\xF8\xCA\t\xC4\x85u\x02\xBA\xF7tN\x85\x97\xDEB\xD6Ydv\xFE\x9E\x06\xB8\xADG\x90a\nc\x90\x83\x90a\x10EV[`\0\x82\x81R`\x02` \x81\x90R`@\x82 \x90\x82\x90\x84\x90\x81\x11\x15a\x0B6Wa\x0B6a\x0F\xE0V[`\x02\x81\x11\x15a\x0BGWa\x0BGa\x0F\xE0V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\x01`\x01`\xA0\x1B\x03\x16\x93\x92PPPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a\x0B\x9A\x82a\x07NV[a\x0B\xA3\x81a\x0B\xADV[a\x07\x7F\x83\x83a\x0B\xBAV[a\x0B\xB7\x813a\x0C\xA3V[PV[a\x0B\xC4\x82\x82a\x0BhV[\x15a\x07JW`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[a\x0C)\x82\x82a\x0BhV[a\x07JW`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x0C_3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x0C\xAD\x82\x82a\x0BhV[a\x07JWa\x0C\xBA\x81a\x0C\xFCV[a\x0C\xC5\x83` a\r\x0EV[`@Q` \x01a\x0C\xD6\x92\x91\x90a\x10wV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x07)\x91`\x04\x01a\x10\xE6V[``a\x06\x97`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\r\x1D\x83`\x02a\x11/V[a\r(\x90`\x02a\x11FV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\r@Wa\r@a\x11YV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\rjW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\x85Wa\r\x85a\x11oV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r\xB4Wa\r\xB4a\x11oV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\r\xD8\x84`\x02a\x11/V[a\r\xE3\x90`\x01a\x11FV[\x90P[`\x01\x81\x11\x15a\x0E[Wo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x0E\x17Wa\x0E\x17a\x11oV[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\x0E-Wa\x0E-a\x11oV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\x0ET\x81a\x11\x85V[\x90Pa\r\xE6V[P\x83\x15a\x0E\xAAW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x07)V[\x93\x92PPPV[`\0` \x82\x84\x03\x12\x15a\x0E\xC3W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x0E\xAAW`\0\x80\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0E\xF2W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x0F\tW`\0\x80\xFD[a\x0E\xAA\x82a\x0E\xDBV[`\0` \x82\x84\x03\x12\x15a\x0F$W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x0F>W`\0\x80\xFD[\x825\x91Pa\x0FN` \x84\x01a\x0E\xDBV[\x90P\x92P\x92\x90PV[\x805`\x03\x81\x10a\x0E\xF2W`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x0FyW`\0\x80\xFD[\x825\x91Pa\x0FN` \x84\x01a\x0FWV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x0F\x9EW`\0\x80\xFD[\x835\x92Pa\x0F\xAE` \x85\x01a\x0FWV[\x91Pa\x0F\xBC`@\x85\x01a\x0E\xDBV[\x90P\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15a\x0F\xD7W`\0\x80\xFD[a\x0E\xAA\x82a\x0FWV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x03\x81\x10a\x10\x14WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[\x83\x81R``\x81\x01a\x10,` \x83\x01\x85a\x0F\xF6V[`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16`@\x91\x90\x91\x01R\x92\x91PPV[` \x81\x01a\x06\x97\x82\x84a\x0F\xF6V[`\0[\x83\x81\x10\x15a\x10nW\x81\x81\x01Q\x83\x82\x01R` \x01a\x10VV[PP`\0\x91\x01RV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x10\xA9\x81`\x17\x85\x01` \x88\x01a\x10SV[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x10\xDA\x81`(\x84\x01` \x88\x01a\x10SV[\x01`(\x01\x94\x93PPPPV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x11\x05\x81`@\x85\x01` \x87\x01a\x10SV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x06\x97Wa\x06\x97a\x11\x19V[\x80\x82\x01\x80\x82\x11\x15a\x06\x97Wa\x06\x97a\x11\x19V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81a\x11\x94Wa\x11\x94a\x11\x19V[P`\0\x19\x01\x90V\xFE\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\xA2dipfsX\"\x12 \xBC\xFBZ\xA3%\x1D\xDF3\xA8sl\x96\x89\xBD\x99\xCE\xA1\xDF[\xAA\x0F\xAC8|Ui\x13rX%\xC9rdsolcC\0\x08\x1C\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x01\xC7W`\x005`\xE0\x1C\x80c|\xAD\xF6\x9F\x11a\x01\0W\x80c|\xAD\xF6\x9F\x14a\x04\"W\x80c}J\x03\xBD\x14a\x04IW\x80c}\x9D(\x80\x14a\x04pW\x80c\x7F\x90 \x9F\x14a\x04\x97W\x80c\x81\xD4\x95x\x14a\x04\xBEW\x80c\x85\xCB\x11\x91\x14a\x04\xE5W\x80c\x8C\x156\xDF\x14a\x05\x0CW\x80c\x8D\xEB8\x93\x14a\x053W\x80c\x8E\x8D\xFD\x16\x14a\x05FW\x80c\x90r\xF88\x14a\x05YW\x80c\x91\xD1HT\x14a\x05\x80W\x80c\x97z\x80p\x14a\x05\x93W\x80c\xA2\x17\xFD\xDF\x14a\x05\xBAW\x80c\xAD\x1C\x8A\x86\x14a\x05\xC2W\x80c\xCD\xDC\xAC\xE5\x14a\x05\xE9W\x80c\xD5Gt\x1F\x14a\x06\x10W\x80c\xDA\x19\xDD\xFB\x14a\x06#W\x80c\xDF8\x06\x93\x14a\x06JW\x80c\xF8\xAE\x93\xB4\x14a\x06qW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01\xCCW\x80c\x11\xEE\x8F\xF7\x14a\x01\xF4W\x80c\x16\xF7k\xBF\x14a\x02)W\x80c\x17\x85\xF5<\x14a\x02PW\x80c!\x9C&j\x14a\x02eW\x80c$\x8A\x9C\xA3\x14a\x02\x8CW\x80c&h\xF3\x05\x14a\x02\x9FW\x80c,\x0B\x8B\xF7\x14a\x02\xC6W\x80c.H\x85\xE8\x14a\x02\xEDW\x80c//\xF1]\x14a\x03\x14W\x80c6V\x8A\xBE\x14a\x03'W\x80c>\xBFy\x85\x14a\x03:W\x80cB\x16\xE7:\x14a\x03\x86W\x80cQ\xAD\n\x80\x14a\x03\xADW\x80cZ\xF2\x7Fy\x14a\x03\xC0W\x80cpH\x02u\x14a\x03\xE7W\x80ct\xBC\x819\x14a\x03\xFAW\x80cu\xB28\xFC\x14a\x04\rW[`\0\x80\xFD[a\x01\xDFa\x01\xDA6`\x04a\x0E\xE3V[a\x06\x98V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x02\x1B\x7FX\xA0\x04N\x0E\xCD\x81\x02^9\x8B\xF1\x81Pu\xD1#L\xBA\xC3t\x96\x14\xB0\xB3:@L.\xE2\xBA\xBF\x81V[`@Q\x90\x81R` \x01a\x01\xEBV[a\x02\x1B\x7F\xF1OC\x1D\xAD\xC8.}\xBC^7\x9Fq#NW5\xC9\x18~C'\xA7\xC6\xAC\x01MU\xD1\xB7rz\x81V[a\x02ca\x02^6`\x04a\x0F)V[a\x06\xCFV[\0[a\x02\x1B\x7FO\xD3\xE0Hz\x03\x82\xFB\x02|w\xB1\xAELV6r\xC9\xFB0\xA7Hy\x85_\x0C\x86\xC3v\xCF\x96\xEA\x81V[a\x02\x1Ba\x02\x9A6`\x04a\x0FDV[a\x07\x80V[a\x02\x1B\x7F\xB1\xF7\x98\x13\xBCv0\xA5*\xE9H\xBC\x99x\x13\x97\xE4\t\xD0\xDD5!\x95;\xF7\xD8\xD7\xA2\xDBaG\xF7\x81V[a\x02\x1B\x7F\xB7\xB4\xFD\xE9\x94M<\x13\xE9\xA7\x885C\x1C3\xA5\x08M\x90\xA7\xF0\xC7=\xEFv\xD7\x88c\x15\xFE\x87\xB0\x81V[a\x02\x1B\x7F\xB91\xB2q\x9A\xEB*e\xA5\x03_\xA0\xA1\x90\xBF\xDCL\x86\"\xCE\x8C\xBF\xF7\xA3\xD1\xABBS\x1F\xB1\xA9\x18\x81V[a\x02ca\x03\"6`\x04a\x0F]V[a\x07\x95V[a\x02ca\x0356`\x04a\x0F]V[a\x07\xB6V[a\x03na\x03H6`\x04a\x0F\x98V[`\x02` \x90\x81R`\0\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 T`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xEBV[a\x02\x1B\x7FLA\xAEEK\xEBk\xBB\xE9\xBEP\xAC\xCC\x95z;\x156\xE4\x8B\x83Z\x86\x91\x9A\xF9\x81\xB5$M\xB7U\x81V[a\x02ca\x03\xBB6`\x04a\x0F\xBBV[a\x080V[a\x02\x1B\x7F\xA2\xC772\xDEez\xD0\xF3n\r\xDB\xB2q\x0FK\x13\xE8\xDD\xE4d!8k\xB9-\x1E\x17\x9D\xAEMM\x81V[a\x02ca\x03\xF56`\x04a\x0F)V[a\t\xB4V[a\x02ca\x04\x086`\x04a\x0F\xF7V[a\t\xE4V[a\x02\x1B`\0\x80Q` a\x11\xCF\x839\x81Q\x91R\x81V[a\x02\x1B\x7Ft\x84]\xE3|\xFA\xBD5v3!KG\xFA\x91\xCC\xD1\x9B\x05\xB7\xC5\xA0\x8A\xC2,\x18\x7F\x81\x1F\xB6+\xCA\x81V[a\x02\x1B\x7F\x9F5\xEF>\x0C&R\xA8\xBB\x87G\xD9/@\x7F\xCD9\xA7v\x8D\xAC\xC7\xF1e\x81\xC7\xA7\x1F\x10>Ub\x81V[a\x02\x1B\x7F\xC2o\xAE\xDA\xEE\xDA/\xB9Jf\xD7\x86\xAA\x89\xC4\xA1\x8B\xB7\x90\xFA\0\x9D\x9D\xA9JT\x1D\x92\x18\\\xA9\x16\x81V[a\x02\x1B\x7F\xC6gO\x98\xBA5\xC0\x1C\x13\x0E\x08\x19]\xD2lpF`7G:\x06\x8CZ\xAAG\nx=\x99\xC1l\x81V[a\x02\x1B\x7FWIm\xE40\x02\x8F2,Y+\x0FsQ\x10\xEB4\xF1\xAE\x81\x84\xA9K\xC5\x1D@\xB0\x84{TF\x9B\x81V[a\x02\x1B\x7F\xAEy\xA95sp\x12\xD0f\xE7\x1802i.R\x1F\xFE\x1A\xDE+\xED\xA2g\xE2>\x02\xB1\xD6\xE9\x11\x87\x81V[a\x02\x1B\x7F\xAA\x06\xD1\x08\xDB\xD7\xBF\x97k\x16\xB7\xBFZ\xDB)\xD2\xD0\xEF,8\\\xA8\xB9\xD83\xCC\x80/3\x94-r\x81V[a\x02ca\x05A6`\x04a\x0F\xF7V[a\n\xA0V[a\x03na\x05T6`\x04a\x0F\x98V[a\x0BDV[a\x02\x1B\x7FT\x95<#\x06\x8B\x8F\xC4\xC0sc\x01\xB5\x0F\x10\x02}kF\x93'\xDE\x1F\xD4(A\xA5\x07+\x1B\xCE\xBE\x81V[a\x01\xDFa\x05\x8E6`\x04a\x0F]V[a\x0B\x9AV[a\x02\x1B\x7F'\xD7d\xEA*J8eCK\xBFJ9\x11\x10\x14\x96D\xBE1D\x8F4y\xFD\x15\xB4C\x88uWe\x81V[a\x02\x1B`\0\x81V[a\x02\x1B\x7F:h\xDB\xFD\x8B\xBBd\x01\\B\xBC\x13\x1C8\x8D\xEAye\xE2\x8C\x10\x04\xD0\x9B9\xF5\x95\0\xC3\xA7c\xEC\x81V[a\x02\x1B\x7F\x0F'\xB9\xE4k\x89\xC5\xC7B\xE2\x80\x94\xDC\xEF\xE5\xE9F\xC3\xB9\x8F\x0F\xBE\xD8}\x9F\xCF[\x10\xBA\x96\x84\xEC\x81V[a\x02ca\x06\x1E6`\x04a\x0F]V[a\x0B\xC3V[a\x02\x1B\x7F\x08\t\t\xC1\x8C\x95\x8C\xE5\xA2\xD3d\x81ix$\xE4w1\x93#\xD01T\xCE\xBA;x\xF2\x8Aa\x88{\x81V[a\x02\x1B\x7F\xB4\xBF\x99\x9Bh\xD8\x08]\xBB\xF7\xA0\xEC/Z-f\x08s\x93[\xDF\x1E\xD0\x8E\xB4!\xACm\xCB\xC0\x03b\x81V[a\x02\x1B\x7F\xDD[\x9B\x8A^\x8E\x01\xF2\x96.\xD7\xE9\x83\xD5\x8F\xE3.\x1Ff\xAA\x88\xDDz\xB3\x07p\xFA\x9Bw\xDArC\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x06\xC9WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x80Q` a\x11\xCF\x839\x81Q\x91Ra\x06\xE7\x81a\x0B\xDFV[3`\x01`\x01`\xA0\x1B\x03\x83\x16\x03a\x07dW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`7`$\x82\x01R\x7FCannot remove self as admin. Ha`D\x82\x01Rv;2\x90:42\x9072\xBB\x900\xB26\xB4\xB7\x1027\x904\xBA\x17`I\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x07|`\0\x80Q` a\x11\xCF\x839\x81Q\x91R\x83a\x0B\xECV[PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x07\x9E\x82a\x07\x80V[a\x07\xA7\x81a\x0B\xDFV[a\x07\xB1\x83\x83a\x0CQV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x08&W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x07[V[a\x07|\x82\x82a\x0B\xECV[a\x08H`\0\x80Q` a\x11\xCF\x839\x81Q\x91R3a\x0B\x9AV[a\x08eW`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x83`\x02\x81\x11\x15a\x08{Wa\x08{a\x10\x12V[`\x02\x81\x11\x15a\x08\x8CWa\x08\x8Ca\x10\x12V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\xFF\x16\x15\x15`\x01\x14a\t\tW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FThe provided Env is not valid fo`D\x82\x01Rn\x1C\x88\x1D\x1A\x1A\\\xC8\x18\xDB\xDB\x9D\x1C\x98X\xDD`\x8A\x1B`d\x82\x01R`\x84\x01a\x07[V[\x80`\x02`\0\x85\x81R` \x01\x90\x81R` \x01`\0 `\0\x84`\x02\x81\x11\x15a\t1Wa\t1a\x10\x12V[`\x02\x81\x11\x15a\tBWa\tBa\x10\x12V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\x01`\x01`\xA0\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`\xA0\x1B\x03\x16\x02\x17\x90UP\x7F3\xF0\x14\x89\x0F\x10\x92)\xBB\xCF\x8D\xD4r\x04\xC1S\xA2\xC0\xFF\x1CW*a\xDE\"\r\x103e0\xF5=\x83\x83\x83`@Qa\t\xA7\x93\x92\x91\x90a\x10JV[`@Q\x80\x91\x03\x90\xA1PPPV[`\0\x80Q` a\x11\xCF\x839\x81Q\x91Ra\t\xCC\x81a\x0B\xDFV[a\x07|`\0\x80Q` a\x11\xCF\x839\x81Q\x91R\x83a\x0CQV[a\t\xFC`\0\x80Q` a\x11\xCF\x839\x81Q\x91R3a\x0B\x9AV[a\n\x19W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01\x80`\0\x83`\x02\x81\x11\x15a\n0Wa\n0a\x10\x12V[`\x02\x81\x11\x15a\nAWa\nAa\x10\x12V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\x83\x9A\xD2t=@b\xDFW\x9E\xDF8\x18\xF6B\xB7\x1E\xE0h\x8A5\xD6\xBCD8\xEFS\x14\xCE\xCE\x80\x15\x81`@Qa\n\x95\x91\x90a\x10wV[`@Q\x80\x91\x03\x90\xA1PV[a\n\xB8`\0\x80Q` a\x11\xCF\x839\x81Q\x91R3a\x0B\x9AV[a\n\xD5W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x82`\x02\x81\x11\x15a\n\xEBWa\n\xEBa\x10\x12V[`\x02\x81\x11\x15a\n\xFCWa\n\xFCa\x10\x12V[\x81R` \x81\x01\x91\x90\x91R`@\x90\x81\x01`\0 \x80T`\xFF\x19\x16\x90UQ\x7F?\x17\x8F\x17\xDA\xE6\xCA\xF8\xCA\t\xC4\x85u\x02\xBA\xF7tN\x85\x97\xDEB\xD6Ydv\xFE\x9E\x06\xB8\xADG\x90a\n\x95\x90\x83\x90a\x10wV[`\0\x82\x81R`\x02` \x81\x90R`@\x82 \x90\x82\x90\x84\x90\x81\x11\x15a\x0BhWa\x0Bha\x10\x12V[`\x02\x81\x11\x15a\x0ByWa\x0Bya\x10\x12V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\x01`\x01`\xA0\x1B\x03\x16\x93\x92PPPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a\x0B\xCC\x82a\x07\x80V[a\x0B\xD5\x81a\x0B\xDFV[a\x07\xB1\x83\x83a\x0B\xECV[a\x0B\xE9\x813a\x0C\xD5V[PV[a\x0B\xF6\x82\x82a\x0B\x9AV[\x15a\x07|W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[a\x0C[\x82\x82a\x0B\x9AV[a\x07|W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x0C\x913\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x0C\xDF\x82\x82a\x0B\x9AV[a\x07|Wa\x0C\xEC\x81a\r.V[a\x0C\xF7\x83` a\r@V[`@Q` \x01a\r\x08\x92\x91\x90a\x10\xA9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x07[\x91`\x04\x01a\x11\x18V[``a\x06\xC9`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\rO\x83`\x02a\x11aV[a\rZ\x90`\x02a\x11xV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\rrWa\rra\x11\x8BV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\r\x9CW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\xB7Wa\r\xB7a\x11\xA1V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r\xE6Wa\r\xE6a\x11\xA1V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x0E\n\x84`\x02a\x11aV[a\x0E\x15\x90`\x01a\x11xV[\x90P[`\x01\x81\x11\x15a\x0E\x8DWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x0EIWa\x0EIa\x11\xA1V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\x0E_Wa\x0E_a\x11\xA1V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\x0E\x86\x81a\x11\xB7V[\x90Pa\x0E\x18V[P\x83\x15a\x0E\xDCW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x07[V[\x93\x92PPPV[`\0` \x82\x84\x03\x12\x15a\x0E\xF5W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x0E\xDCW`\0\x80\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0F$W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x0F;W`\0\x80\xFD[a\x0E\xDC\x82a\x0F\rV[`\0` \x82\x84\x03\x12\x15a\x0FVW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x0FpW`\0\x80\xFD[\x825\x91Pa\x0F\x80` \x84\x01a\x0F\rV[\x90P\x92P\x92\x90PV[\x805`\x03\x81\x10a\x0F$W`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x0F\xABW`\0\x80\xFD[\x825\x91Pa\x0F\x80` \x84\x01a\x0F\x89V[`\0\x80`\0``\x84\x86\x03\x12\x15a\x0F\xD0W`\0\x80\xFD[\x835\x92Pa\x0F\xE0` \x85\x01a\x0F\x89V[\x91Pa\x0F\xEE`@\x85\x01a\x0F\rV[\x90P\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15a\x10\tW`\0\x80\xFD[a\x0E\xDC\x82a\x0F\x89V[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x03\x81\x10a\x10FWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[\x83\x81R``\x81\x01a\x10^` \x83\x01\x85a\x10(V[`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16`@\x91\x90\x91\x01R\x92\x91PPV[` \x81\x01a\x06\xC9\x82\x84a\x10(V[`\0[\x83\x81\x10\x15a\x10\xA0W\x81\x81\x01Q\x83\x82\x01R` \x01a\x10\x88V[PP`\0\x91\x01RV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x10\xDB\x81`\x17\x85\x01` \x88\x01a\x10\x85V[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x11\x0C\x81`(\x84\x01` \x88\x01a\x10\x85V[\x01`(\x01\x94\x93PPPPV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x117\x81`@\x85\x01` \x87\x01a\x10\x85V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x06\xC9Wa\x06\xC9a\x11KV[\x80\x82\x01\x80\x82\x11\x15a\x06\xC9Wa\x06\xC9a\x11KV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81a\x11\xC6Wa\x11\xC6a\x11KV[P`\0\x19\x01\x90V\xFE\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\xA2dipfsX\"\x12 e'hp\xAE\xCC\x95\xD0\x02j9\xA8\xA0\x8D\xC1\xB9\xA7&IlM\x88\xB6Eo*\xC6@T ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([129, 212, 149, 120], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `RATE_LIMIT_NFT_CONTRACT` (0x2e4885e8) function pub fn rate_limit_nft_contract( &self, @@ -2142,6 +2174,24 @@ pub mod contract_resolver { )] #[ethcall(name = "PUB_KEY_ROUTER_CONTRACT", abi = "PUB_KEY_ROUTER_CONTRACT()")] pub struct PubKeyRouterContractCall; + ///Container type for all input parameters for the `PUB_KEY_ROUTER_VIEWS_CONTRACT` function with signature `PUB_KEY_ROUTER_VIEWS_CONTRACT()` and selector `0x81d49578` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash + )] + #[ethcall( + name = "PUB_KEY_ROUTER_VIEWS_CONTRACT", + abi = "PUB_KEY_ROUTER_VIEWS_CONTRACT()" + )] + pub struct PubKeyRouterViewsContractCall; ///Container type for all input parameters for the `RATE_LIMIT_NFT_CONTRACT` function with signature `RATE_LIMIT_NFT_CONTRACT()` and selector `0x2e4885e8` #[derive( Clone, @@ -2459,6 +2509,7 @@ pub mod contract_resolver { PkpPermissionsContract(PkpPermissionsContractCall), PriceFeedContract(PriceFeedContractCall), PubKeyRouterContract(PubKeyRouterContractCall), + PubKeyRouterViewsContract(PubKeyRouterViewsContractCall), RateLimitNftContract(RateLimitNftContractCall), ReleaseRegisterContract(ReleaseRegisterContractCall), StakingBalancesContract(StakingBalancesContractCall), @@ -2577,6 +2628,11 @@ pub mod contract_resolver { ) { return Ok(Self::PubKeyRouterContract(decoded)); } + if let Ok(decoded) = ::decode( + data, + ) { + return Ok(Self::PubKeyRouterViewsContract(decoded)); + } if let Ok(decoded) = ::decode( data, ) { @@ -2725,6 +2781,9 @@ pub mod contract_resolver { Self::PubKeyRouterContract(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::PubKeyRouterViewsContract(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::RateLimitNftContract(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -2819,6 +2878,9 @@ pub mod contract_resolver { Self::PubKeyRouterContract(element) => { ::core::fmt::Display::fmt(element, f) } + Self::PubKeyRouterViewsContract(element) => { + ::core::fmt::Display::fmt(element, f) + } Self::RateLimitNftContract(element) => { ::core::fmt::Display::fmt(element, f) } @@ -2940,6 +3002,11 @@ pub mod contract_resolver { Self::PubKeyRouterContract(value) } } + impl ::core::convert::From for ContractResolverCalls { + fn from(value: PubKeyRouterViewsContractCall) -> Self { + Self::PubKeyRouterViewsContract(value) + } + } impl ::core::convert::From for ContractResolverCalls { fn from(value: RateLimitNftContractCall) -> Self { Self::RateLimitNftContract(value) @@ -3291,6 +3358,20 @@ pub mod contract_resolver { Hash )] pub struct PubKeyRouterContractReturn(pub [u8; 32]); + ///Container type for all return fields from the `PUB_KEY_ROUTER_VIEWS_CONTRACT` function with signature `PUB_KEY_ROUTER_VIEWS_CONTRACT()` and selector `0x81d49578` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash + )] + pub struct PubKeyRouterViewsContractReturn(pub [u8; 32]); ///Container type for all return fields from the `RATE_LIMIT_NFT_CONTRACT` function with signature `RATE_LIMIT_NFT_CONTRACT()` and selector `0x2e4885e8` #[derive( Clone, diff --git a/rust/lit-core/lit-blockchain-lite/src/contracts/key_deriver.rs b/rust/lit-core/lit-blockchain-lite/src/contracts/key_deriver.rs index 46874e30..01aa58f5 100644 --- a/rust/lit-core/lit-blockchain-lite/src/contracts/key_deriver.rs +++ b/rust/lit-core/lit-blockchain-lite/src/contracts/key_deriver.rs @@ -127,13 +127,13 @@ pub mod key_deriver { __abi, ); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15`\x0FW`\0\x80\xFD[Pa\x05\xEE\x80a\0\x1F`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80cb\xE4\xC4d\x14a\0;W\x80c\xA3,+\x99\x14a\0`W[`\0\x80\xFD[a\0C`\xF5\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0sa\0n6`\x04a\x02\x9EV[a\0\x81V[`@Qa\0W\x92\x91\x90a\x04CV[`\0```\0a\0\x92\x86\x86\x86a\x01\0V[\x90P`\0\x80`\xF5`\x01`\x01`\xA0\x1B\x03\x16\x83`@Qa\0\xB0\x91\x90a\x04\x7FV[`\0`@Q\x80\x83\x03\x81\x85Z\xFA\x91PP=\x80`\0\x81\x14a\0\xEBW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\0\xF0V[``\x91P[P\x90\x99\x90\x98P\x96PPPPPPPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x01\x9AW\x84\x86\x82\x81Q\x81\x10a\x011Wa\x011a\x04\x9BV[` \x02` \x01\x01Q` \x01Q\x03a\x01\x92W\x82\x86\x82\x81Q\x81\x10a\x01UWa\x01Ua\x04\x9BV[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x01r\x92\x91\x90a\x04\xB1V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x01\x8E\x90a\x04\xE0V[\x92PP[`\x01\x01a\x01\x15V[P\x83`\x02\x03a\x01\xACW`\x01\x93Pa\x01\xB9V[\x83`\x03\x03a\x01\xB9W`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x05\x8E`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x02\x10\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x05\x13V[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x9C\x9BPPPPPPPPPPPPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02hWa\x02ha\x020V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02\x96Wa\x02\x96a\x020V[`@R\x91\x90PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x02\xB3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xD0W`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x02\xE1W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xFAWa\x02\xFAa\x020V[\x80`\x05\x1Ba\x03\n` \x82\x01a\x02nV[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x03&W`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x04\nW\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03KW`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x03aW`\0\x80\xFD[a\x03ia\x02FV[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\x82W`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x03\x97W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\xB0Wa\x03\xB0a\x020V[a\x03\xC3`\x1F\x82\x01`\x1F\x19\x16` \x01a\x02nV[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x03\xD8W`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x03-V[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x04:W\x81\x81\x01Q\x83\x82\x01R` \x01a\x04\"V[PP`\0\x91\x01RV[\x82\x15\x15\x81R`@` \x82\x01R`\0\x82Q\x80`@\x84\x01Ra\x04j\x81``\x85\x01` \x87\x01a\x04\x1FV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01``\x01\x93\x92PPPV[`\0\x82Qa\x04\x91\x81\x84` \x87\x01a\x04\x1FV[\x91\x90\x91\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x83Qa\x04\xC3\x81\x84` \x88\x01a\x04\x1FV[\x83Q\x90\x83\x01\x90a\x04\xD7\x81\x83` \x88\x01a\x04\x1FV[\x01\x94\x93PPPPV[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x05\nWcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x05U\x81`)\x85\x01` \x89\x01a\x04\x1FV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x05|\x81`-\x84\x01` \x88\x01a\x04\x1FV[\x01`-\x01\x99\x98PPPPPPPPPV\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 \xB3\xF5\xD6\xAC\xD5\xA77\x13D\xCA\xCA\xB0^`py\xEB\xF4v\xB4m\x8B\x17\x04\x19a/\x80\xE7\xA8\xAC\x95dsolcC\0\x08\x1C\x003"; + const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15`\x0FW`\0\x80\xFD[Pa\x05\xEE\x80a\0\x1F`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80cb\xE4\xC4d\x14a\0;W\x80c\xA3,+\x99\x14a\0`W[`\0\x80\xFD[a\0C`\xF5\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0sa\0n6`\x04a\x02\x9EV[a\0\x81V[`@Qa\0W\x92\x91\x90a\x04CV[`\0```\0a\0\x92\x86\x86\x86a\x01\0V[\x90P`\0\x80`\xF5`\x01`\x01`\xA0\x1B\x03\x16\x83`@Qa\0\xB0\x91\x90a\x04\x7FV[`\0`@Q\x80\x83\x03\x81\x85Z\xFA\x91PP=\x80`\0\x81\x14a\0\xEBW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\0\xF0V[``\x91P[P\x90\x99\x90\x98P\x96PPPPPPPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x01\x9AW\x84\x86\x82\x81Q\x81\x10a\x011Wa\x011a\x04\x9BV[` \x02` \x01\x01Q` \x01Q\x03a\x01\x92W\x82\x86\x82\x81Q\x81\x10a\x01UWa\x01Ua\x04\x9BV[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x01r\x92\x91\x90a\x04\xB1V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x01\x8E\x90a\x04\xE0V[\x92PP[`\x01\x01a\x01\x15V[P\x83`\x02\x03a\x01\xACW`\x01\x93Pa\x01\xB9V[\x83`\x03\x03a\x01\xB9W`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x05\x8E`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x02\x10\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x05\x13V[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x9C\x9BPPPPPPPPPPPPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02hWa\x02ha\x020V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02\x96Wa\x02\x96a\x020V[`@R\x91\x90PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x02\xB3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xD0W`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x02\xE1W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xFAWa\x02\xFAa\x020V[\x80`\x05\x1Ba\x03\n` \x82\x01a\x02nV[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x03&W`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x04\nW\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03KW`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x03aW`\0\x80\xFD[a\x03ia\x02FV[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\x82W`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x03\x97W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\xB0Wa\x03\xB0a\x020V[a\x03\xC3`\x1F\x82\x01`\x1F\x19\x16` \x01a\x02nV[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x03\xD8W`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x03-V[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x04:W\x81\x81\x01Q\x83\x82\x01R` \x01a\x04\"V[PP`\0\x91\x01RV[\x82\x15\x15\x81R`@` \x82\x01R`\0\x82Q\x80`@\x84\x01Ra\x04j\x81``\x85\x01` \x87\x01a\x04\x1FV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01``\x01\x93\x92PPPV[`\0\x82Qa\x04\x91\x81\x84` \x87\x01a\x04\x1FV[\x91\x90\x91\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x83Qa\x04\xC3\x81\x84` \x88\x01a\x04\x1FV[\x83Q\x90\x83\x01\x90a\x04\xD7\x81\x83` \x88\x01a\x04\x1FV[\x01\x94\x93PPPPV[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x05\nWcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x05U\x81`)\x85\x01` \x89\x01a\x04\x1FV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x05|\x81`-\x84\x01` \x88\x01a\x04\x1FV[\x01`-\x01\x99\x98PPPPPPPPPV\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 ].\x87\x92D\x05\xC7Z7\xCB1\x99\x10\x9D\xC5\x84wu\xCE(\x13|^\x1C\xA4\x05r\x0C\xFA;\xEA=dsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static KEYDERIVER_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __BYTECODE, ); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80cb\xE4\xC4d\x14a\0;W\x80c\xA3,+\x99\x14a\0`W[`\0\x80\xFD[a\0C`\xF5\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0sa\0n6`\x04a\x02\x9EV[a\0\x81V[`@Qa\0W\x92\x91\x90a\x04CV[`\0```\0a\0\x92\x86\x86\x86a\x01\0V[\x90P`\0\x80`\xF5`\x01`\x01`\xA0\x1B\x03\x16\x83`@Qa\0\xB0\x91\x90a\x04\x7FV[`\0`@Q\x80\x83\x03\x81\x85Z\xFA\x91PP=\x80`\0\x81\x14a\0\xEBW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\0\xF0V[``\x91P[P\x90\x99\x90\x98P\x96PPPPPPPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x01\x9AW\x84\x86\x82\x81Q\x81\x10a\x011Wa\x011a\x04\x9BV[` \x02` \x01\x01Q` \x01Q\x03a\x01\x92W\x82\x86\x82\x81Q\x81\x10a\x01UWa\x01Ua\x04\x9BV[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x01r\x92\x91\x90a\x04\xB1V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x01\x8E\x90a\x04\xE0V[\x92PP[`\x01\x01a\x01\x15V[P\x83`\x02\x03a\x01\xACW`\x01\x93Pa\x01\xB9V[\x83`\x03\x03a\x01\xB9W`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x05\x8E`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x02\x10\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x05\x13V[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x9C\x9BPPPPPPPPPPPPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02hWa\x02ha\x020V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02\x96Wa\x02\x96a\x020V[`@R\x91\x90PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x02\xB3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xD0W`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x02\xE1W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xFAWa\x02\xFAa\x020V[\x80`\x05\x1Ba\x03\n` \x82\x01a\x02nV[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x03&W`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x04\nW\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03KW`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x03aW`\0\x80\xFD[a\x03ia\x02FV[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\x82W`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x03\x97W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\xB0Wa\x03\xB0a\x020V[a\x03\xC3`\x1F\x82\x01`\x1F\x19\x16` \x01a\x02nV[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x03\xD8W`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x03-V[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x04:W\x81\x81\x01Q\x83\x82\x01R` \x01a\x04\"V[PP`\0\x91\x01RV[\x82\x15\x15\x81R`@` \x82\x01R`\0\x82Q\x80`@\x84\x01Ra\x04j\x81``\x85\x01` \x87\x01a\x04\x1FV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01``\x01\x93\x92PPPV[`\0\x82Qa\x04\x91\x81\x84` \x87\x01a\x04\x1FV[\x91\x90\x91\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x83Qa\x04\xC3\x81\x84` \x88\x01a\x04\x1FV[\x83Q\x90\x83\x01\x90a\x04\xD7\x81\x83` \x88\x01a\x04\x1FV[\x01\x94\x93PPPPV[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x05\nWcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x05U\x81`)\x85\x01` \x89\x01a\x04\x1FV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x05|\x81`-\x84\x01` \x88\x01a\x04\x1FV[\x01`-\x01\x99\x98PPPPPPPPPV\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 \xB3\xF5\xD6\xAC\xD5\xA77\x13D\xCA\xCA\xB0^`py\xEB\xF4v\xB4m\x8B\x17\x04\x19a/\x80\xE7\xA8\xAC\x95dsolcC\0\x08\x1C\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80cb\xE4\xC4d\x14a\0;W\x80c\xA3,+\x99\x14a\0`W[`\0\x80\xFD[a\0C`\xF5\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0sa\0n6`\x04a\x02\x9EV[a\0\x81V[`@Qa\0W\x92\x91\x90a\x04CV[`\0```\0a\0\x92\x86\x86\x86a\x01\0V[\x90P`\0\x80`\xF5`\x01`\x01`\xA0\x1B\x03\x16\x83`@Qa\0\xB0\x91\x90a\x04\x7FV[`\0`@Q\x80\x83\x03\x81\x85Z\xFA\x91PP=\x80`\0\x81\x14a\0\xEBW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\0\xF0V[``\x91P[P\x90\x99\x90\x98P\x96PPPPPPPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x01\x9AW\x84\x86\x82\x81Q\x81\x10a\x011Wa\x011a\x04\x9BV[` \x02` \x01\x01Q` \x01Q\x03a\x01\x92W\x82\x86\x82\x81Q\x81\x10a\x01UWa\x01Ua\x04\x9BV[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x01r\x92\x91\x90a\x04\xB1V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x01\x8E\x90a\x04\xE0V[\x92PP[`\x01\x01a\x01\x15V[P\x83`\x02\x03a\x01\xACW`\x01\x93Pa\x01\xB9V[\x83`\x03\x03a\x01\xB9W`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x05\x8E`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x02\x10\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x05\x13V[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x9C\x9BPPPPPPPPPPPPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02hWa\x02ha\x020V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02\x96Wa\x02\x96a\x020V[`@R\x91\x90PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x02\xB3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xD0W`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x02\xE1W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xFAWa\x02\xFAa\x020V[\x80`\x05\x1Ba\x03\n` \x82\x01a\x02nV[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x03&W`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x04\nW\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03KW`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x03aW`\0\x80\xFD[a\x03ia\x02FV[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\x82W`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x03\x97W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\xB0Wa\x03\xB0a\x020V[a\x03\xC3`\x1F\x82\x01`\x1F\x19\x16` \x01a\x02nV[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x03\xD8W`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x03-V[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x04:W\x81\x81\x01Q\x83\x82\x01R` \x01a\x04\"V[PP`\0\x91\x01RV[\x82\x15\x15\x81R`@` \x82\x01R`\0\x82Q\x80`@\x84\x01Ra\x04j\x81``\x85\x01` \x87\x01a\x04\x1FV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01``\x01\x93\x92PPPV[`\0\x82Qa\x04\x91\x81\x84` \x87\x01a\x04\x1FV[\x91\x90\x91\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x83Qa\x04\xC3\x81\x84` \x88\x01a\x04\x1FV[\x83Q\x90\x83\x01\x90a\x04\xD7\x81\x83` \x88\x01a\x04\x1FV[\x01\x94\x93PPPPV[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x05\nWcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x05U\x81`)\x85\x01` \x89\x01a\x04\x1FV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x05|\x81`-\x84\x01` \x88\x01a\x04\x1FV[\x01`-\x01\x99\x98PPPPPPPPPV\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 ].\x87\x92D\x05\xC7Z7\xCB1\x99\x10\x9D\xC5\x84wu\xCE(\x13|^\x1C\xA4\x05r\x0C\xFA;\xEA=dsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static KEYDERIVER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __DEPLOYED_BYTECODE, diff --git a/rust/lit-core/lit-blockchain-lite/src/contracts/pkp_helper.rs b/rust/lit-core/lit-blockchain-lite/src/contracts/pkp_helper.rs index 940d4673..06241840 100644 --- a/rust/lit-core/lit-blockchain-lite/src/contracts/pkp_helper.rs +++ b/rust/lit-core/lit-blockchain-lite/src/contracts/pkp_helper.rs @@ -1434,13 +1434,13 @@ pub mod pkp_helper { __abi, ); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa:v8\x03\x80a:v\x839\x81\x01`@\x81\x90Ra\0/\x91a\0\xD5V[a\083a\0\x85V[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x84\x16`\x01`\x01`\xA0\x1B\x03\x19\x82\x16\x81\x17\x83U\x83\x92\x91`\x01`\x01`\xA8\x1B\x03\x19\x16\x17`\x01`\xA0\x1B\x83\x83\x81\x11\x15a\0yWa\0ya\x01\x1FV[\x02\x17\x90UPPPa\x015V[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[`\0\x80`@\x83\x85\x03\x12\x15a\0\xE8W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\0\xFFW`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x03\x81\x10a\x01\x14W`\0\x80\xFD[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[a92\x80a\x01D`\09`\0\xF3\xFE`\x80`@R`\x046\x10a\x01LW`\x005`\xE0\x1C\x80cs\xCCA\x11\x11a\0\xBCW\x80cs\xCCA\x11\x14a\x02\xF6W\x80cw\x8F\xE5r\x14a\x03\x0BW\x80cx..\xA5\x14a\x03\x1EW\x80c\x8D\xA5\xCB[\x14a\x03>W\x80c\x91\xD1HT\x14a\x03SW\x80c\x91\xEEO\xD5\x14a\x03sW\x80c\x9D\xCA\x002\x14a\x03\x86W\x80c\xA2\x17\xFD\xDF\x14a\x03\xB4W\x80c\xCA\xEA\xD0\xC7\x14a\x03\xC9W\x80c\xD5Gt\x1F\x14a\x03\xDEW\x80c\xDB\x0B\xF93\x14a\x03\xFEW\x80c\xE4\xF1\x1D\xF6\x14a\x04\x11W\x80c\xF2\xFD\xE3\x8B\x14a\x04$W\x80c\xF9]q\xB1\x14a\x04DW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01QW\x80c\x0E\x9E\xD6\x8B\x14a\x01\x86W\x80c\x13\xAFA\x1B\x14a\x01\xA8W\x80c\x15\x0Bz\x02\x14a\x01\xC9W\x80c /rO\x14a\x02\x02W\x80c$\x8A\x9C\xA3\x14a\x02\x15W\x80c+U5Q\x14a\x025W\x80c//\xF1]\x14a\x02WW\x80c2vU\x8C\x14a\x02wW\x80c6V\x8A\xBE\x14a\x02\x8CW\x80cPC\x02l\x14a\x02\xACW\x80cP\xD1{^\x14a\x02\xC1W\x80cqP\x18\xA6\x14a\x02\xE1W[`\0\x80\xFD[4\x80\x15a\x01]W`\0\x80\xFD[Pa\x01qa\x01l6`\x04a%\x98V[a\x04dV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x92W`\0\x80\xFD[Pa\x01\x9Ba\x04\x9BV[`@Qa\x01}\x91\x90a%\xC2V[a\x01\xBBa\x01\xB66`\x04a+\x84V[a\x05\x86V[`@Q\x90\x81R` \x01a\x01}V[4\x80\x15a\x01\xD5W`\0\x80\xFD[Pa\x01\xE9a\x01\xE46`\x04a,2V[a\x06\x03V[`@Q`\x01`\x01`\xE0\x1B\x03\x19\x90\x91\x16\x81R` \x01a\x01}V[a\x01\xBBa\x02\x106`\x04a+\x84V[a\x06\xA7V[4\x80\x15a\x02!W`\0\x80\xFD[Pa\x01\xBBa\x0206`\x04a,\xD1V[a\x06\xBAV[4\x80\x15a\x02AW`\0\x80\xFD[Pa\x02Ua\x02P6`\x04a,\xD1V[a\x06\xD0V[\0[4\x80\x15a\x02cW`\0\x80\xFD[Pa\x02Ua\x02r6`\x04a,\xEAV[a\x08\xABV[4\x80\x15a\x02\x83W`\0\x80\xFD[Pa\x01\x9Ba\x08\xCCV[4\x80\x15a\x02\x98W`\0\x80\xFD[Pa\x02Ua\x02\xA76`\x04a,\xEAV[a\t\x1EV[4\x80\x15a\x02\xB8W`\0\x80\xFD[Pa\x01\x9Ba\t\x9CV[4\x80\x15a\x02\xCDW`\0\x80\xFD[P`\x02Ta\x01\x9B\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x02\xEDW`\0\x80\xFD[Pa\x02Ua\t\xEEV[4\x80\x15a\x03\x02W`\0\x80\xFD[Pa\x01\x9Ba\n\x02V[a\x01\xBBa\x03\x196`\x04a-:V[a\nTV[4\x80\x15a\x03*W`\0\x80\xFD[Pa\x02Ua\x0396`\x04a/\xB8V[a\x10fV[4\x80\x15a\x03JW`\0\x80\xFD[Pa\x01\x9Ba\x12\x89V[4\x80\x15a\x03_W`\0\x80\xFD[Pa\x01qa\x03n6`\x04a,\xEAV[a\x12\x98V[a\x01\xBBa\x03\x816`\x04a/\xF4V[a\x12\xC3V[4\x80\x15a\x03\x92W`\0\x80\xFD[P`\x02Ta\x03\xA7\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\x01}\x91\x90a0\xF0V[4\x80\x15a\x03\xC0W`\0\x80\xFD[Pa\x01\xBB`\0\x81V[4\x80\x15a\x03\xD5W`\0\x80\xFD[Pa\x01\x9Ba\x19eV[4\x80\x15a\x03\xEAW`\0\x80\xFD[Pa\x02Ua\x03\xF96`\x04a,\xEAV[a\x19\xB7V[a\x01\xBBa\x04\x0C6`\x04a0\xFEV[a\x19\xD3V[a\x01\xBBa\x04\x1F6`\x04a2;V[a\x1F\xDDV[4\x80\x15a\x040W`\0\x80\xFD[Pa\x02Ua\x04?6`\x04a3MV[a!0V[4\x80\x15a\x04PW`\0\x80\xFD[Pa\x02Ua\x04_6`\x04a3MV[a!\xA9V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x04\x95WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\x02T`@\x80Qc\xDA\x19\xDD\xFB`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\xDA\x19\xDD\xFB\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x11\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x05@\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05]W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x81\x91\x90a3\x97V[\x90P\x90V[`\0\x80`@Q\x80`\xA0\x01`@R\x80\x85`\0\x01Q\x81R` \x01`@Q\x80`@\x01`@R\x80`\x0C\x81R` \x01knaga-keyset1`\xA0\x1B\x81RP\x81R` \x01\x85` \x01Q\x81R` \x01\x85`@\x01Q\x81R` \x01a\x05\xE4a\x04\x9BV[`\x01`\x01`\xA0\x1B\x03\x16\x90R\x90Pa\x05\xFB\x81\x84a\x12\xC3V[\x94\x93PPPPV[`\0a\x06\ra\x19eV[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x95W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`:`$\x82\x01R\x7FPKPHelper: only accepts transfer`D\x82\x01Ry\x1C\xC8\x19\x9C\x9B\xDBH\x1D\x1A\x19H\x14\x12\xD4\x13\x91\x95\x08\x18\xDB\xDB\x9D\x1C\x98X\xDD`2\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[Pc\n\x85\xBD\x01`\xE1\x1B\x95\x94PPPPPV[`\0a\x06\xB3\x83\x83a\x05\x86V[\x93\x92PPPV[`\0\x90\x81R`\x01` \x81\x90R`@\x90\x91 \x01T\x90V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07\"W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07F\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07u\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\x92W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xB6\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x07\xE6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x07\xF0a\t\x9CV[`@Qc\xB6:vw`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R\x90\x91P`\x01`\x01`\xA0\x1B\x03\x82\x16\x90c\xB6:vw\x90`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x085W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08IW=`\0\x80>=`\0\xFD[PP`@Qc(\xCD\x10\xC7`\xE1\x1B\x81R`\x04\x81\x01\x85\x90R`\x01`\x01`\xA0\x1B\x03\x84\x16\x92PcQ\x9A!\x8E\x91P`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x08\x8FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08\xA3W=`\0\x80>=`\0\xFD[PPPPPPV[a\x08\xB4\x82a\x06\xBAV[a\x08\xBD\x81a\"\x07V[a\x08\xC7\x83\x83a\"\x11V[PPPV[`\x02T`@\x80Qc\x12\x0E_\x07`\xE3\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x90r\xF88\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\t\x8EW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a\t\x98\x82\x82a\"|V[PPV[`\x02T`@\x80Qc\x16\xF7k\xBF`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x16\xF7k\xBF\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\t\xF6a\"\xE3V[a\n\0`\0a#BV[V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\0\x80a\n_a\x19eV[\x83Q` \x85\x01Q`@Qc?\xF8\x06\x97`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x92c\x7F\xF0\r.\x924\x92a\n\x94\x92`\x04\x01a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\n\xB2W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n\xD7\x91\x90a3jV[\x90P\x82``\x01QQ\x83`@\x01QQ\x14a\x0B\x02W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x82`\xA0\x01QQ\x83`\x80\x01QQ\x14a\x0B+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x82`\xE0\x01QQ\x83`\xC0\x01QQ\x14a\x0BTW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x82a\x01\0\x01QQ\x83`\xC0\x01QQ\x14a\x0B~W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x82a\x01 \x01QQ\x83`\xC0\x01QQ\x14a\x0B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[`@\x83\x01QQ\x15a\x0CtW`\0[\x83`@\x01QQ\x81\x10\x15a\x0CrWa\x0B\xCBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x86`@\x01Q\x84\x81Q\x81\x10a\x0B\xF0Wa\x0B\xF0a6'V[` \x02` \x01\x01Q\x87``\x01Q\x85\x81Q\x81\x10a\x0C\x0EWa\x0C\x0Ea6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0C4\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0CNW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0CbW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0B\xB6\x90PV[P[`\x80\x83\x01QQ\x15a\r@W`\0[\x83`\x80\x01QQ\x81\x10\x15a\r>Wa\x0C\x97a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x86`\x80\x01Q\x84\x81Q\x81\x10a\x0C\xBCWa\x0C\xBCa6'V[` \x02` \x01\x01Q\x87`\xA0\x01Q\x85\x81Q\x81\x10a\x0C\xDAWa\x0C\xDAa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\0\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\x1AW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r.W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0C\x82\x90PV[P[`\xC0\x83\x01QQ\x15a\x0EbW`\0[\x83`\xC0\x01QQ\x81\x10\x15a\x0E`Wa\rca\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x88`\xC0\x01Q\x86\x81Q\x81\x10a\r\x93Wa\r\x93a6'V[` \x02` \x01\x01Q\x81R` \x01\x88`\xE0\x01Q\x86\x81Q\x81\x10a\r\xB6Wa\r\xB6a6'V[` \x02` \x01\x01Q\x81R` \x01\x88a\x01\0\x01Q\x86\x81Q\x81\x10a\r\xDAWa\r\xDAa6'V[` \x02` \x01\x01Q\x81RP\x87a\x01 \x01Q\x85\x81Q\x81\x10a\r\xFCWa\r\xFCa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\"\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0E=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\rN\x90PV[P[`\0a\x0Ela\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\x99\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E\xB6W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xDA\x91\x90a3\x97V[\x90P\x83a\x01@\x01Q\x15a\x0F|Wa\x0E\xEFa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0F*W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0FI\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0FcW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0FwW=`\0\x80>=`\0\xFD[PPPP[\x83a\x01`\x01Q\x15a\x0F\xF5Wa\x0F\x8Fa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\xBE\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0F\xD8W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F\xECW=`\0\x80>=`\0\xFD[PPPPa\x10_V[a\x0F\xFDa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x10,\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x10FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x10ZW=`\0\x80>=`\0\xFD[PPPP[P\x92\x91PPV[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x10\xB8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10\xDC\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x11\x0B\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11(W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11L\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x11|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x11\x86a\t\x9CV[\x82Q\x90\x91P\x15a\x08\xC7W\x80`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x84\x84`\0\x81Q\x81\x10a\x11\xB3Wa\x11\xB3a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x11\xD8\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x11\xF2W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x06W=`\0\x80>=`\0\xFD[PPPP\x80`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x84\x84`\x01\x81Q\x81\x10a\x12-Wa\x12-a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x12R\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x12lW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x80W=`\0\x80>=`\0\xFD[PPPPPPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\0\x91\x82R`\x01` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[\x80Q\x82Q`\0\x91\x14a\x13=W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`>`$\x82\x01R\x7FPKPHelper: Claim key type must m`D\x82\x01R\x7Fatch Auth Method data key type\0\0`d\x82\x01R`\x84\x01a\x06\x8CV[`\x01`\0a\x13Ia\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cq\xAA\x9A\xCF4\x84\x88`\0\x01Q\x89` \x01Q\x8A`@\x01Q\x8B``\x01Q\x8C`\x80\x01Q`@Q\x88c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\x93\x96\x95\x94\x93\x92\x91\x90a7cV[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x13\xB1W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xD6\x91\x90a3jV[\x90P\x83`@\x01QQ\x84` \x01QQ\x14a\x14\x01W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x83`\x80\x01QQ\x84``\x01QQ\x14a\x14*W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x83`\xC0\x01QQ\x84`\xA0\x01QQ\x14a\x14SW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x83`\xE0\x01QQ\x84`\xA0\x01QQ\x14a\x14|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x83a\x01\0\x01QQ\x84`\xA0\x01QQ\x14a\x14\xA6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[` \x84\x01QQ\x15a\x15rW`\0[\x84` \x01QQ\x81\x10\x15a\x15pWa\x14\xC9a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x87` \x01Q\x84\x81Q\x81\x10a\x14\xEEWa\x14\xEEa6'V[` \x02` \x01\x01Q\x88`@\x01Q\x85\x81Q\x81\x10a\x15\x0CWa\x15\x0Ca6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x152\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x15LW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x15`W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x14\xB4\x90PV[P[``\x84\x01QQ\x15a\x16>W`\0[\x84``\x01QQ\x81\x10\x15a\x16=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x15\x80\x90PV[P[`\xA0\x84\x01QQ\x15a\x17_W`\0[\x84`\xA0\x01QQ\x81\x10\x15a\x17]Wa\x16aa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x89`\xA0\x01Q\x86\x81Q\x81\x10a\x16\x91Wa\x16\x91a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xC0\x01Q\x86\x81Q\x81\x10a\x16\xB4Wa\x16\xB4a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xE0\x01Q\x86\x81Q\x81\x10a\x16\xD7Wa\x16\xD7a6'V[` \x02` \x01\x01Q\x81RP\x88a\x01\0\x01Q\x85\x81Q\x81\x10a\x16\xF9Wa\x16\xF9a6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x1F\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x179W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x17MW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x16L\x90PV[P[`\0a\x17ia\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x96\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\xB3W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17\xD7\x91\x90a3\x97V[\x90P\x84a\x01 \x01Q\x15a\x18yWa\x17\xECa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x18'W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18F\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18`W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18tW=`\0\x80>=`\0\xFD[PPPP[\x84a\x01@\x01Q\x15a\x18\xF2Wa\x18\x8Ca\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18\xBB\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18\xD5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18\xE9W=`\0\x80>=`\0\xFD[PPPPa\x19\\V[a\x18\xFAa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x19)\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x19CW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x19WW=`\0\x80>=`\0\xFD[PPPP[P\x94\x93PPPPV[`\x02T`@\x80Qc,\x0B\x8B\xF7`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c,\x0B\x8B\xF7\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\x19\xC0\x82a\x06\xBAV[a\x19\xC9\x81a\"\x07V[a\x08\xC7\x83\x83a\"|V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x1A%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1AI\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x1Ax\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1A\x95W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1A\xB9\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x1A\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x1A\xF3a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16c\x7F\xF0\r.4\x8D\x8D`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1B!\x92\x91\x90a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x1B?W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1Bd\x91\x90a3jV[\x90P\x87Q\x89Q\x14a\x1B\x87W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x86Q\x89Q\x14a\x1B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x85Q\x89Q\x14a\x1B\xC9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[\x88Q\x15a\x1C\xD1W`\0[\x89Q\x81\x10\x15a\x1C\xCFWa\x1B\xE4a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x8E\x86\x81Q\x81\x10a\x1C\x10Wa\x1C\x10a6'V[` \x02` \x01\x01Q\x81R` \x01\x8D\x86\x81Q\x81\x10a\x1C/Wa\x1C/a6'V[` \x02` \x01\x01Q\x81R` \x01\x8C\x86\x81Q\x81\x10a\x1CNWa\x1CNa6'V[` \x02` \x01\x01Q\x81RP\x8A\x85\x81Q\x81\x10a\x1CkWa\x1Cka6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\x91\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1C\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1C\xBFW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x1B\xD3\x90PV[P[`\0a\x1C\xDBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\x08\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1D%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1DI\x91\x90a3\x97V[\x90P\x84\x15a\x1D\xE6Wa\x1DYa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x1D\x94W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\xB3\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1D\xCDW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1D\xE1W=`\0\x80>=`\0\xFD[PPPP[\x83\x15a\x1EZWa\x1D\xF4a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E#\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E=W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1EQW=`\0\x80>=`\0\xFD[PPPPa\x1E\xC4V[a\x1Eba\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E\x91\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1E\xBFW=`\0\x80>=`\0\xFD[PPPP[\x85Q\x15a\x1F\xCEWa\x1E\xD3a\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x83\x88`\0\x81Q\x81\x10a\x1E\xF5Wa\x1E\xF5a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x1A\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F4W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1FHW=`\0\x80>=`\0\xFD[PPPPa\x1FTa\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x83\x88`\x01\x81Q\x81\x10a\x1FvWa\x1Fva6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x9B\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F\xB5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1F\xC9W=`\0\x80>=`\0\xFD[PPPP[P\x9A\x99PPPPPPPPPPV[`\0\x80`@Q\x80a\x01\x80\x01`@R\x80\x8B\x81R` \x01\x8A\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x81\x11\x15a \x11Wa \x11a%\xD6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a DW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a /W\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \x7FW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a jW\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xB0W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xEBW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a \xD6W\x90P[P\x81R` \x01\x89\x81R` \x01\x88\x81R` \x01\x87\x81R` \x01\x86\x81R` \x01\x85\x15\x15\x81R` \x01\x84\x15\x15\x81RP\x90Pa!\"\x81a\nTV[\x9A\x99PPPPPPPPPPV[a!8a\"\xE3V[`\x01`\x01`\xA0\x1B\x03\x81\x16a!\x9DW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`&`$\x82\x01R\x7FOwnable: new owner is the zero a`D\x82\x01Reddress`\xD0\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a!\xA6\x81a#BV[PV[a!\xB1a\"\xE3V[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x17\x90U`@Q\x7F'`\x07<|\xD8\xCA\xC51\xD7\xF6C\xBE\xCB\xFB\xB7M\x8B\x81VD>\xAC\xF8yb%2\xDB\xBB<\xD5\x90a!\xFC\x90\x83\x90a%\xC2V[`@Q\x80\x91\x03\x90\xA1PV[a!\xA6\x813a#\x92V[a\"\x1B\x82\x82a\x12\x98V[a\t\x98W`\0\x82\x81R`\x01` \x81\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x86\x16\x80\x86R\x92R\x80\x84 \x80T`\xFF\x19\x16\x90\x93\x17\x90\x92U\x90Q3\x92\x85\x91\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r\x91\x90\xA4PPV[a\"\x86\x82\x82a\x12\x98V[\x15a\t\x98W`\0\x82\x81R`\x01` \x90\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[3a\"\xECa\x12\x89V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\n\0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FOwnable: caller is not the owner`D\x82\x01R`d\x01a\x06\x8CV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[a#\x9C\x82\x82a\x12\x98V[a\t\x98Wa#\xA9\x81a#\xEBV[a#\xB4\x83` a#\xFDV[`@Q` \x01a#\xC5\x92\x91\x90a8\x03V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x06\x8C\x91`\x04\x01a8rV[``a\x04\x95`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a$\x0C\x83`\x02a8\x9BV[a$\x17\x90`\x02a8\xB2V[`\x01`\x01`@\x1B\x03\x81\x11\x15a$.Wa$.a%\xD6V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a$XW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a$sWa$sa6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a$\xA2Wa$\xA2a6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a$\xC6\x84`\x02a8\x9BV[a$\xD1\x90`\x01a8\xB2V[\x90P[`\x01\x81\x11\x15a%IWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a%\x05Wa%\x05a6'V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a%\x1BWa%\x1Ba6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a%B\x81a8\xC5V[\x90Pa$\xD4V[P\x83\x15a\x06\xB3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x06\x8CV[`\0` \x82\x84\x03\x12\x15a%\xAAW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x06\xB3W`\0\x80\xFD[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@R\x90V[`@Qa\x01`\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Qa\x01\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\xA4Wa&\xA4a%\xD6V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a&\xC5Wa&\xC5a%\xD6V[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a&\xE0W`\0\x80\xFD[\x815a&\xF3a&\xEE\x82a&\xACV[a&|V[\x80\x82\x82R` \x82\x01\x91P` ``\x84\x02\x86\x01\x01\x92P\x85\x83\x11\x15a'\x15W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW``\x81\x88\x03\x12\x15a'2W`\0\x80\xFD[a':a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\xFF\x81\x16\x81\x14a'\\W`\0\x80\xFD[`@\x82\x01R\x83R` \x90\x92\x01\x91``\x01a'\x1AV[P\x95\x94PPPPPV[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a'\x95Wa'\x95a%\xD6V[P`\x1F\x83\x01`\x1F\x19\x16` \x01a'\xAA\x81a&|V[\x91PP\x82\x81R\x83\x83\x83\x01\x11\x15a'\xBFW`\0\x80\xFD[\x82\x82` \x83\x017`\0` \x84\x83\x01\x01R\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a'\xE7W`\0\x80\xFD[\x815a'\xF5a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\x17W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a(:W`\0\x80\xFD[\x86\x01`?\x81\x01\x88\x13a(KW`\0\x80\xFD[a(]\x88` \x83\x015`@\x84\x01a'{V[\x84RP` \x92\x83\x01\x92\x01a(\x1CV[`\0\x82`\x1F\x83\x01\x12a(}W`\0\x80\xFD[\x815a(\x8Ba&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\xADW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805\x83R` \x92\x83\x01\x92\x01a(\xB2V[`\0\x82`\x1F\x83\x01\x12a(\xDBW`\0\x80\xFD[\x815a(\xE9a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\x0BW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a).W`\0\x80\xFD[a)=\x88` \x83\x8A\x01\x01a(lV[\x84RP` \x92\x83\x01\x92\x01a)\x10V[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a!\xA6W`\0\x80\xFD[`\0\x82`\x1F\x83\x01\x12a)rW`\0\x80\xFD[\x815a)\x80a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\xA2W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805a)\xBA\x81a)LV[\x83R` \x92\x83\x01\x92\x01a)\xA7V[\x805\x80\x15\x15\x81\x14a)\xD8W`\0\x80\xFD[\x91\x90PV[`\0a\x01`\x82\x84\x03\x12\x15a)\xF0W`\0\x80\xFD[a)\xF8a&\x14V[\x825\x81R\x90P` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x17W`\0\x80\xFD[a*#\x84\x82\x85\x01a'\xD6V[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*BW`\0\x80\xFD[a*N\x84\x82\x85\x01a(\xCAV[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*mW`\0\x80\xFD[a*y\x84\x82\x85\x01a)aV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x98W`\0\x80\xFD[a*\xA4\x84\x82\x85\x01a(\xCAV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xC3W`\0\x80\xFD[a*\xCF\x84\x82\x85\x01a(lV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xEEW`\0\x80\xFD[a*\xFA\x84\x82\x85\x01a'\xD6V[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\x19W`\0\x80\xFD[a+%\x84\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+EW`\0\x80\xFD[a+Q\x84\x82\x85\x01a(\xCAV[a\x01\0\x83\x01RPa+ea\x01 \x83\x01a)\xC8V[a\x01 \x82\x01Ra+xa\x01@\x83\x01a)\xC8V[a\x01@\x82\x01R\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15a+\x97W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xADW`\0\x80\xFD[\x83\x01``\x81\x86\x03\x12\x15a+\xBFW`\0\x80\xFD[a+\xC7a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xEEW`\0\x80\xFD[a+\xFA\x87\x82\x85\x01a&\xCFV[`@\x83\x01RP\x92PP` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[a,(\x85\x82\x86\x01a)\xDDV[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80`\0`\x80\x86\x88\x03\x12\x15a,JW`\0\x80\xFD[\x855a,U\x81a)LV[\x94P` \x86\x015a,e\x81a)LV[\x93P`@\x86\x015\x92P``\x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x87W`\0\x80\xFD[\x86\x01`\x1F\x81\x01\x88\x13a,\x98W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a,\xAEW`\0\x80\xFD[\x88` \x82\x84\x01\x01\x11\x15a,\xC0W`\0\x80\xFD[\x95\x98\x94\x97P\x92\x95PPP` \x01\x91\x90V[`\0` \x82\x84\x03\x12\x15a,\xE3W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a,\xFDW`\0\x80\xFD[\x825\x91P` \x83\x015a-\x0F\x81a)LV[\x80\x91PP\x92P\x92\x90PV[`\0\x82`\x1F\x83\x01\x12a-+W`\0\x80\xFD[a\x06\xB3\x83\x835` \x85\x01a'{V[`\0` \x82\x84\x03\x12\x15a-LW`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a-bW`\0\x80\xFD[\x82\x01a\x01\x80\x81\x85\x03\x12\x15a-uW`\0\x80\xFD[a-}a&7V[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\x9AW`\0\x80\xFD[a-\xA6\x86\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xC5W`\0\x80\xFD[a-\xD1\x86\x82\x85\x01a'\xD6V[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xF0W`\0\x80\xFD[a-\xFC\x86\x82\x85\x01a(\xCAV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x1BW`\0\x80\xFD[a.'\x86\x82\x85\x01a)aV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.FW`\0\x80\xFD[a.R\x86\x82\x85\x01a(\xCAV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.qW`\0\x80\xFD[a.}\x86\x82\x85\x01a(lV[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x9CW`\0\x80\xFD[a.\xA8\x86\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xC8W`\0\x80\xFD[a.\xD4\x86\x82\x85\x01a'\xD6V[a\x01\0\x83\x01RPa\x01 \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xF5W`\0\x80\xFD[a/\x01\x86\x82\x85\x01a(\xCAV[a\x01 \x83\x01RPa/\x15a\x01@\x83\x01a)\xC8V[a\x01@\x82\x01Ra/(a\x01`\x83\x01a)\xC8V[a\x01`\x82\x01R\x94\x93PPPPV[`\0\x82`\x1F\x83\x01\x12a/GW`\0\x80\xFD[\x815a/Ua&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a/wW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a/\x9AW`\0\x80\xFD[a/\xA9\x88` \x83\x8A\x01\x01a-\x1AV[\x84RP` \x92\x83\x01\x92\x01a/|V[`\0\x80`@\x83\x85\x03\x12\x15a/\xCBW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a/\xE8W`\0\x80\xFD[a,(\x85\x82\x86\x01a/6V[`\0\x80`@\x83\x85\x03\x12\x15a0\x07W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x1DW`\0\x80\xFD[\x83\x01`\xA0\x81\x86\x03\x12\x15a0/W`\0\x80\xFD[a07a&ZV[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0TW`\0\x80\xFD[a0`\x87\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x81\x015\x90\x82\x01R``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x89W`\0\x80\xFD[a0\x95\x87\x82\x85\x01a&\xCFV[``\x83\x01RP`\x80\x82\x015\x91Pa0\xAB\x82a)LV[`\x80\x81\x01\x91\x90\x91R\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[`\x03\x81\x10a0\xECWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x04\x95\x82\x84a0\xCEV[`\0\x80`\0\x80`\0\x80`\0\x80`\0a\x01 \x8A\x8C\x03\x12\x15a1\x1DW`\0\x80\xFD[\x895\x98P` \x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1:W`\0\x80\xFD[a1F\x8C\x82\x8D\x01a-\x1AV[\x98PP`@\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1bW`\0\x80\xFD[a1n\x8C\x82\x8D\x01a(lV[\x97PP``\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\x8AW`\0\x80\xFD[a1\x96\x8C\x82\x8D\x01a'\xD6V[\x96PP`\x80\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xB2W`\0\x80\xFD[a1\xBE\x8C\x82\x8D\x01a'\xD6V[\x95PP`\xA0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xDAW`\0\x80\xFD[a1\xE6\x8C\x82\x8D\x01a(\xCAV[\x94PP`\xC0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x02W`\0\x80\xFD[a2\x0E\x8C\x82\x8D\x01a/6V[\x93PPa2\x1D`\xE0\x8B\x01a)\xC8V[\x91Pa2,a\x01\0\x8B\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98P\x92\x95\x98V[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15a2XW`\0\x80\xFD[\x885\x97P` \x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2uW`\0\x80\xFD[a2\x81\x8B\x82\x8C\x01a-\x1AV[\x97PP`@\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x9DW`\0\x80\xFD[a2\xA9\x8B\x82\x8C\x01a(lV[\x96PP``\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xC5W`\0\x80\xFD[a2\xD1\x8B\x82\x8C\x01a'\xD6V[\x95PP`\x80\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xEDW`\0\x80\xFD[a2\xF9\x8B\x82\x8C\x01a'\xD6V[\x94PP`\xA0\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a3\x15W`\0\x80\xFD[a3!\x8B\x82\x8C\x01a(\xCAV[\x93PPa30`\xC0\x8A\x01a)\xC8V[\x91Pa3>`\xE0\x8A\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[`\0` \x82\x84\x03\x12\x15a3_W`\0\x80\xFD[\x815a\x06\xB3\x81a)LV[`\0` \x82\x84\x03\x12\x15a3|W`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xB3` \x83\x01\x84a0\xCEV[`\0` \x82\x84\x03\x12\x15a3\xA9W`\0\x80\xFD[\x81Qa\x06\xB3\x81a)LV[` \x80\x82R`Z\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rymain wallets, who are you?`0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\0[\x83\x81\x10\x15a4OW\x81\x81\x01Q\x83\x82\x01R` \x01a47V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra4p\x81` \x86\x01` \x86\x01a44V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x81R`@` \x82\x01R`\0a\x05\xFB`@\x83\x01\x84a4XV[` \x80\x82R`6\x90\x82\x01R\x7FPKPHelper: ipfs cid and scope ar`@\x82\x01Ru\x0EL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`S\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`5\x90\x82\x01R\x7FPKPHelper: address and scope arr`@\x82\x01Rt\x0C/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`[\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`;\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01Rz\r,\x84\x0C.NL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`+\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fpubkey array lengths must match\0``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fscopes array lengths must match\0``\x82\x01R`\x80\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81Q\x80\x84R` \x84\x01\x93P` \x83\x01`\0[\x82\x81\x10\x15a6oW\x81Q\x86R` \x95\x86\x01\x95\x90\x91\x01\x90`\x01\x01a6QV[P\x93\x94\x93PPPPV[\x83\x81R``` \x82\x01R`\0a6\x92``\x83\x01\x85a4XV[\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[\x96\x95PPPPPPV[\x83\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R```@\x82\x01\x81\x90R`\0\x90a6\xD8\x90\x83\x01\x84a6=V[\x95\x94PPPPPV[\x83\x81R``` \x82\x01R\x82Q``\x82\x01R`\0` \x84\x01Q```\x80\x84\x01Ra7\r`\xC0\x84\x01\x82a4XV[\x90P`@\x85\x01Q`_\x19\x84\x83\x03\x01`\xA0\x85\x01Ra7*\x82\x82a4XV[\x91PP\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x81R\x91\x90\x92\x16` \x82\x01R`@\x81\x01\x91\x90\x91R``\x01\x90V[\x86\x81R\x85` \x82\x01R`\xC0`@\x82\x01R`\0a7\x82`\xC0\x83\x01\x87a4XV[``\x83\x01\x86\x90R\x82\x81\x03`\x80\x84\x01R\x84Q\x80\x82R` \x80\x87\x01\x92\x01\x90`\0[\x81\x81\x10\x15a7\xDEW\x83Q\x80Q\x84R` \x81\x01Q` \x85\x01R`\xFF`@\x82\x01Q\x16`@\x85\x01RP``\x83\x01\x92P` \x84\x01\x93P`\x01\x81\x01\x90Pa7\xA1V[PP`\x01`\x01`\xA0\x1B\x03\x85\x16`\xA0\x85\x01R\x91Pa7\xF8\x90PV[\x97\x96PPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa85\x81`\x17\x85\x01` \x88\x01a44V[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa8f\x81`(\x84\x01` \x88\x01a44V[\x01`(\x01\x94\x93PPPPV[` \x81R`\0a\x06\xB3` \x83\x01\x84a4XV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x04\x95Wa\x04\x95a8\x85V[\x80\x82\x01\x80\x82\x11\x15a\x04\x95Wa\x04\x95a8\x85V[`\0\x81a8\xD4Wa8\xD4a8\x85V[P`\0\x19\x01\x90V\xFEPKPHelper: auth method type and \xA2dipfsX\"\x12 8)W\x80\xA3\x13\xE8\x95\xB6\xDC\xEAh\xE9\0\xA6o\x08;\xF3mzE$\xB6<\xF8\xBF#\xE4\x9Dc\rdsolcC\0\x08\x1C\x003"; + const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa:v8\x03\x80a:v\x839\x81\x01`@\x81\x90Ra\0/\x91a\0\xD5V[a\083a\0\x85V[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x84\x16`\x01`\x01`\xA0\x1B\x03\x19\x82\x16\x81\x17\x83U\x83\x92\x91`\x01`\x01`\xA8\x1B\x03\x19\x16\x17`\x01`\xA0\x1B\x83\x83\x81\x11\x15a\0yWa\0ya\x01\x1FV[\x02\x17\x90UPPPa\x015V[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[`\0\x80`@\x83\x85\x03\x12\x15a\0\xE8W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\0\xFFW`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x03\x81\x10a\x01\x14W`\0\x80\xFD[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[a92\x80a\x01D`\09`\0\xF3\xFE`\x80`@R`\x046\x10a\x01LW`\x005`\xE0\x1C\x80cs\xCCA\x11\x11a\0\xBCW\x80cs\xCCA\x11\x14a\x02\xF6W\x80cw\x8F\xE5r\x14a\x03\x0BW\x80cx..\xA5\x14a\x03\x1EW\x80c\x8D\xA5\xCB[\x14a\x03>W\x80c\x91\xD1HT\x14a\x03SW\x80c\x91\xEEO\xD5\x14a\x03sW\x80c\x9D\xCA\x002\x14a\x03\x86W\x80c\xA2\x17\xFD\xDF\x14a\x03\xB4W\x80c\xCA\xEA\xD0\xC7\x14a\x03\xC9W\x80c\xD5Gt\x1F\x14a\x03\xDEW\x80c\xDB\x0B\xF93\x14a\x03\xFEW\x80c\xE4\xF1\x1D\xF6\x14a\x04\x11W\x80c\xF2\xFD\xE3\x8B\x14a\x04$W\x80c\xF9]q\xB1\x14a\x04DW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01QW\x80c\x0E\x9E\xD6\x8B\x14a\x01\x86W\x80c\x13\xAFA\x1B\x14a\x01\xA8W\x80c\x15\x0Bz\x02\x14a\x01\xC9W\x80c /rO\x14a\x02\x02W\x80c$\x8A\x9C\xA3\x14a\x02\x15W\x80c+U5Q\x14a\x025W\x80c//\xF1]\x14a\x02WW\x80c2vU\x8C\x14a\x02wW\x80c6V\x8A\xBE\x14a\x02\x8CW\x80cPC\x02l\x14a\x02\xACW\x80cP\xD1{^\x14a\x02\xC1W\x80cqP\x18\xA6\x14a\x02\xE1W[`\0\x80\xFD[4\x80\x15a\x01]W`\0\x80\xFD[Pa\x01qa\x01l6`\x04a%\x98V[a\x04dV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x92W`\0\x80\xFD[Pa\x01\x9Ba\x04\x9BV[`@Qa\x01}\x91\x90a%\xC2V[a\x01\xBBa\x01\xB66`\x04a+\x84V[a\x05\x86V[`@Q\x90\x81R` \x01a\x01}V[4\x80\x15a\x01\xD5W`\0\x80\xFD[Pa\x01\xE9a\x01\xE46`\x04a,2V[a\x06\x03V[`@Q`\x01`\x01`\xE0\x1B\x03\x19\x90\x91\x16\x81R` \x01a\x01}V[a\x01\xBBa\x02\x106`\x04a+\x84V[a\x06\xA7V[4\x80\x15a\x02!W`\0\x80\xFD[Pa\x01\xBBa\x0206`\x04a,\xD1V[a\x06\xBAV[4\x80\x15a\x02AW`\0\x80\xFD[Pa\x02Ua\x02P6`\x04a,\xD1V[a\x06\xD0V[\0[4\x80\x15a\x02cW`\0\x80\xFD[Pa\x02Ua\x02r6`\x04a,\xEAV[a\x08\xABV[4\x80\x15a\x02\x83W`\0\x80\xFD[Pa\x01\x9Ba\x08\xCCV[4\x80\x15a\x02\x98W`\0\x80\xFD[Pa\x02Ua\x02\xA76`\x04a,\xEAV[a\t\x1EV[4\x80\x15a\x02\xB8W`\0\x80\xFD[Pa\x01\x9Ba\t\x9CV[4\x80\x15a\x02\xCDW`\0\x80\xFD[P`\x02Ta\x01\x9B\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x02\xEDW`\0\x80\xFD[Pa\x02Ua\t\xEEV[4\x80\x15a\x03\x02W`\0\x80\xFD[Pa\x01\x9Ba\n\x02V[a\x01\xBBa\x03\x196`\x04a-:V[a\nTV[4\x80\x15a\x03*W`\0\x80\xFD[Pa\x02Ua\x0396`\x04a/\xB8V[a\x10fV[4\x80\x15a\x03JW`\0\x80\xFD[Pa\x01\x9Ba\x12\x89V[4\x80\x15a\x03_W`\0\x80\xFD[Pa\x01qa\x03n6`\x04a,\xEAV[a\x12\x98V[a\x01\xBBa\x03\x816`\x04a/\xF4V[a\x12\xC3V[4\x80\x15a\x03\x92W`\0\x80\xFD[P`\x02Ta\x03\xA7\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\x01}\x91\x90a0\xF0V[4\x80\x15a\x03\xC0W`\0\x80\xFD[Pa\x01\xBB`\0\x81V[4\x80\x15a\x03\xD5W`\0\x80\xFD[Pa\x01\x9Ba\x19eV[4\x80\x15a\x03\xEAW`\0\x80\xFD[Pa\x02Ua\x03\xF96`\x04a,\xEAV[a\x19\xB7V[a\x01\xBBa\x04\x0C6`\x04a0\xFEV[a\x19\xD3V[a\x01\xBBa\x04\x1F6`\x04a2;V[a\x1F\xDDV[4\x80\x15a\x040W`\0\x80\xFD[Pa\x02Ua\x04?6`\x04a3MV[a!0V[4\x80\x15a\x04PW`\0\x80\xFD[Pa\x02Ua\x04_6`\x04a3MV[a!\xA9V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x04\x95WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\x02T`@\x80Qc\xDA\x19\xDD\xFB`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\xDA\x19\xDD\xFB\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x11\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x05@\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05]W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x81\x91\x90a3\x97V[\x90P\x90V[`\0\x80`@Q\x80`\xA0\x01`@R\x80\x85`\0\x01Q\x81R` \x01`@Q\x80`@\x01`@R\x80`\x0C\x81R` \x01knaga-keyset1`\xA0\x1B\x81RP\x81R` \x01\x85` \x01Q\x81R` \x01\x85`@\x01Q\x81R` \x01a\x05\xE4a\x04\x9BV[`\x01`\x01`\xA0\x1B\x03\x16\x90R\x90Pa\x05\xFB\x81\x84a\x12\xC3V[\x94\x93PPPPV[`\0a\x06\ra\x19eV[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x95W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`:`$\x82\x01R\x7FPKPHelper: only accepts transfer`D\x82\x01Ry\x1C\xC8\x19\x9C\x9B\xDBH\x1D\x1A\x19H\x14\x12\xD4\x13\x91\x95\x08\x18\xDB\xDB\x9D\x1C\x98X\xDD`2\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[Pc\n\x85\xBD\x01`\xE1\x1B\x95\x94PPPPPV[`\0a\x06\xB3\x83\x83a\x05\x86V[\x93\x92PPPV[`\0\x90\x81R`\x01` \x81\x90R`@\x90\x91 \x01T\x90V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07\"W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07F\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07u\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\x92W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xB6\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x07\xE6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x07\xF0a\t\x9CV[`@Qc\xB6:vw`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R\x90\x91P`\x01`\x01`\xA0\x1B\x03\x82\x16\x90c\xB6:vw\x90`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x085W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08IW=`\0\x80>=`\0\xFD[PP`@Qc(\xCD\x10\xC7`\xE1\x1B\x81R`\x04\x81\x01\x85\x90R`\x01`\x01`\xA0\x1B\x03\x84\x16\x92PcQ\x9A!\x8E\x91P`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x08\x8FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08\xA3W=`\0\x80>=`\0\xFD[PPPPPPV[a\x08\xB4\x82a\x06\xBAV[a\x08\xBD\x81a\"\x07V[a\x08\xC7\x83\x83a\"\x11V[PPPV[`\x02T`@\x80Qc\x12\x0E_\x07`\xE3\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x90r\xF88\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\t\x8EW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a\t\x98\x82\x82a\"|V[PPV[`\x02T`@\x80Qc\x16\xF7k\xBF`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x16\xF7k\xBF\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\t\xF6a\"\xE3V[a\n\0`\0a#BV[V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\0\x80a\n_a\x19eV[\x83Q` \x85\x01Q`@Qc?\xF8\x06\x97`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x92c\x7F\xF0\r.\x924\x92a\n\x94\x92`\x04\x01a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\n\xB2W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n\xD7\x91\x90a3jV[\x90P\x82``\x01QQ\x83`@\x01QQ\x14a\x0B\x02W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x82`\xA0\x01QQ\x83`\x80\x01QQ\x14a\x0B+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x82`\xE0\x01QQ\x83`\xC0\x01QQ\x14a\x0BTW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x82a\x01\0\x01QQ\x83`\xC0\x01QQ\x14a\x0B~W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x82a\x01 \x01QQ\x83`\xC0\x01QQ\x14a\x0B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[`@\x83\x01QQ\x15a\x0CtW`\0[\x83`@\x01QQ\x81\x10\x15a\x0CrWa\x0B\xCBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x86`@\x01Q\x84\x81Q\x81\x10a\x0B\xF0Wa\x0B\xF0a6'V[` \x02` \x01\x01Q\x87``\x01Q\x85\x81Q\x81\x10a\x0C\x0EWa\x0C\x0Ea6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0C4\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0CNW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0CbW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0B\xB6\x90PV[P[`\x80\x83\x01QQ\x15a\r@W`\0[\x83`\x80\x01QQ\x81\x10\x15a\r>Wa\x0C\x97a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x86`\x80\x01Q\x84\x81Q\x81\x10a\x0C\xBCWa\x0C\xBCa6'V[` \x02` \x01\x01Q\x87`\xA0\x01Q\x85\x81Q\x81\x10a\x0C\xDAWa\x0C\xDAa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\0\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\x1AW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r.W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0C\x82\x90PV[P[`\xC0\x83\x01QQ\x15a\x0EbW`\0[\x83`\xC0\x01QQ\x81\x10\x15a\x0E`Wa\rca\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x88`\xC0\x01Q\x86\x81Q\x81\x10a\r\x93Wa\r\x93a6'V[` \x02` \x01\x01Q\x81R` \x01\x88`\xE0\x01Q\x86\x81Q\x81\x10a\r\xB6Wa\r\xB6a6'V[` \x02` \x01\x01Q\x81R` \x01\x88a\x01\0\x01Q\x86\x81Q\x81\x10a\r\xDAWa\r\xDAa6'V[` \x02` \x01\x01Q\x81RP\x87a\x01 \x01Q\x85\x81Q\x81\x10a\r\xFCWa\r\xFCa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\"\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0E=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\rN\x90PV[P[`\0a\x0Ela\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\x99\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E\xB6W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xDA\x91\x90a3\x97V[\x90P\x83a\x01@\x01Q\x15a\x0F|Wa\x0E\xEFa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0F*W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0FI\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0FcW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0FwW=`\0\x80>=`\0\xFD[PPPP[\x83a\x01`\x01Q\x15a\x0F\xF5Wa\x0F\x8Fa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\xBE\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0F\xD8W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F\xECW=`\0\x80>=`\0\xFD[PPPPa\x10_V[a\x0F\xFDa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x10,\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x10FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x10ZW=`\0\x80>=`\0\xFD[PPPP[P\x92\x91PPV[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x10\xB8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10\xDC\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x11\x0B\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11(W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11L\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x11|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x11\x86a\t\x9CV[\x82Q\x90\x91P\x15a\x08\xC7W\x80`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x84\x84`\0\x81Q\x81\x10a\x11\xB3Wa\x11\xB3a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x11\xD8\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x11\xF2W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x06W=`\0\x80>=`\0\xFD[PPPP\x80`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x84\x84`\x01\x81Q\x81\x10a\x12-Wa\x12-a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x12R\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x12lW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x80W=`\0\x80>=`\0\xFD[PPPPPPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\0\x91\x82R`\x01` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[\x80Q\x82Q`\0\x91\x14a\x13=W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`>`$\x82\x01R\x7FPKPHelper: Claim key type must m`D\x82\x01R\x7Fatch Auth Method data key type\0\0`d\x82\x01R`\x84\x01a\x06\x8CV[`\x01`\0a\x13Ia\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cq\xAA\x9A\xCF4\x84\x88`\0\x01Q\x89` \x01Q\x8A`@\x01Q\x8B``\x01Q\x8C`\x80\x01Q`@Q\x88c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\x93\x96\x95\x94\x93\x92\x91\x90a7cV[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x13\xB1W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xD6\x91\x90a3jV[\x90P\x83`@\x01QQ\x84` \x01QQ\x14a\x14\x01W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x83`\x80\x01QQ\x84``\x01QQ\x14a\x14*W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x83`\xC0\x01QQ\x84`\xA0\x01QQ\x14a\x14SW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x83`\xE0\x01QQ\x84`\xA0\x01QQ\x14a\x14|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x83a\x01\0\x01QQ\x84`\xA0\x01QQ\x14a\x14\xA6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[` \x84\x01QQ\x15a\x15rW`\0[\x84` \x01QQ\x81\x10\x15a\x15pWa\x14\xC9a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x87` \x01Q\x84\x81Q\x81\x10a\x14\xEEWa\x14\xEEa6'V[` \x02` \x01\x01Q\x88`@\x01Q\x85\x81Q\x81\x10a\x15\x0CWa\x15\x0Ca6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x152\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x15LW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x15`W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x14\xB4\x90PV[P[``\x84\x01QQ\x15a\x16>W`\0[\x84``\x01QQ\x81\x10\x15a\x16=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x15\x80\x90PV[P[`\xA0\x84\x01QQ\x15a\x17_W`\0[\x84`\xA0\x01QQ\x81\x10\x15a\x17]Wa\x16aa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x89`\xA0\x01Q\x86\x81Q\x81\x10a\x16\x91Wa\x16\x91a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xC0\x01Q\x86\x81Q\x81\x10a\x16\xB4Wa\x16\xB4a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xE0\x01Q\x86\x81Q\x81\x10a\x16\xD7Wa\x16\xD7a6'V[` \x02` \x01\x01Q\x81RP\x88a\x01\0\x01Q\x85\x81Q\x81\x10a\x16\xF9Wa\x16\xF9a6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x1F\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x179W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x17MW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x16L\x90PV[P[`\0a\x17ia\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x96\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\xB3W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17\xD7\x91\x90a3\x97V[\x90P\x84a\x01 \x01Q\x15a\x18yWa\x17\xECa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x18'W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18F\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18`W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18tW=`\0\x80>=`\0\xFD[PPPP[\x84a\x01@\x01Q\x15a\x18\xF2Wa\x18\x8Ca\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18\xBB\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18\xD5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18\xE9W=`\0\x80>=`\0\xFD[PPPPa\x19\\V[a\x18\xFAa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x19)\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x19CW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x19WW=`\0\x80>=`\0\xFD[PPPP[P\x94\x93PPPPV[`\x02T`@\x80Qc,\x0B\x8B\xF7`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c,\x0B\x8B\xF7\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\x19\xC0\x82a\x06\xBAV[a\x19\xC9\x81a\"\x07V[a\x08\xC7\x83\x83a\"|V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x1A%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1AI\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x1Ax\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1A\x95W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1A\xB9\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x1A\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x1A\xF3a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16c\x7F\xF0\r.4\x8D\x8D`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1B!\x92\x91\x90a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x1B?W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1Bd\x91\x90a3jV[\x90P\x87Q\x89Q\x14a\x1B\x87W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x86Q\x89Q\x14a\x1B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x85Q\x89Q\x14a\x1B\xC9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[\x88Q\x15a\x1C\xD1W`\0[\x89Q\x81\x10\x15a\x1C\xCFWa\x1B\xE4a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x8E\x86\x81Q\x81\x10a\x1C\x10Wa\x1C\x10a6'V[` \x02` \x01\x01Q\x81R` \x01\x8D\x86\x81Q\x81\x10a\x1C/Wa\x1C/a6'V[` \x02` \x01\x01Q\x81R` \x01\x8C\x86\x81Q\x81\x10a\x1CNWa\x1CNa6'V[` \x02` \x01\x01Q\x81RP\x8A\x85\x81Q\x81\x10a\x1CkWa\x1Cka6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\x91\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1C\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1C\xBFW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x1B\xD3\x90PV[P[`\0a\x1C\xDBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\x08\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1D%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1DI\x91\x90a3\x97V[\x90P\x84\x15a\x1D\xE6Wa\x1DYa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x1D\x94W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\xB3\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1D\xCDW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1D\xE1W=`\0\x80>=`\0\xFD[PPPP[\x83\x15a\x1EZWa\x1D\xF4a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E#\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E=W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1EQW=`\0\x80>=`\0\xFD[PPPPa\x1E\xC4V[a\x1Eba\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E\x91\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1E\xBFW=`\0\x80>=`\0\xFD[PPPP[\x85Q\x15a\x1F\xCEWa\x1E\xD3a\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x83\x88`\0\x81Q\x81\x10a\x1E\xF5Wa\x1E\xF5a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x1A\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F4W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1FHW=`\0\x80>=`\0\xFD[PPPPa\x1FTa\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x83\x88`\x01\x81Q\x81\x10a\x1FvWa\x1Fva6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x9B\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F\xB5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1F\xC9W=`\0\x80>=`\0\xFD[PPPP[P\x9A\x99PPPPPPPPPPV[`\0\x80`@Q\x80a\x01\x80\x01`@R\x80\x8B\x81R` \x01\x8A\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x81\x11\x15a \x11Wa \x11a%\xD6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a DW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a /W\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \x7FW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a jW\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xB0W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xEBW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a \xD6W\x90P[P\x81R` \x01\x89\x81R` \x01\x88\x81R` \x01\x87\x81R` \x01\x86\x81R` \x01\x85\x15\x15\x81R` \x01\x84\x15\x15\x81RP\x90Pa!\"\x81a\nTV[\x9A\x99PPPPPPPPPPV[a!8a\"\xE3V[`\x01`\x01`\xA0\x1B\x03\x81\x16a!\x9DW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`&`$\x82\x01R\x7FOwnable: new owner is the zero a`D\x82\x01Reddress`\xD0\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a!\xA6\x81a#BV[PV[a!\xB1a\"\xE3V[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x17\x90U`@Q\x7F'`\x07<|\xD8\xCA\xC51\xD7\xF6C\xBE\xCB\xFB\xB7M\x8B\x81VD>\xAC\xF8yb%2\xDB\xBB<\xD5\x90a!\xFC\x90\x83\x90a%\xC2V[`@Q\x80\x91\x03\x90\xA1PV[a!\xA6\x813a#\x92V[a\"\x1B\x82\x82a\x12\x98V[a\t\x98W`\0\x82\x81R`\x01` \x81\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x86\x16\x80\x86R\x92R\x80\x84 \x80T`\xFF\x19\x16\x90\x93\x17\x90\x92U\x90Q3\x92\x85\x91\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r\x91\x90\xA4PPV[a\"\x86\x82\x82a\x12\x98V[\x15a\t\x98W`\0\x82\x81R`\x01` \x90\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[3a\"\xECa\x12\x89V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\n\0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FOwnable: caller is not the owner`D\x82\x01R`d\x01a\x06\x8CV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[a#\x9C\x82\x82a\x12\x98V[a\t\x98Wa#\xA9\x81a#\xEBV[a#\xB4\x83` a#\xFDV[`@Q` \x01a#\xC5\x92\x91\x90a8\x03V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x06\x8C\x91`\x04\x01a8rV[``a\x04\x95`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a$\x0C\x83`\x02a8\x9BV[a$\x17\x90`\x02a8\xB2V[`\x01`\x01`@\x1B\x03\x81\x11\x15a$.Wa$.a%\xD6V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a$XW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a$sWa$sa6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a$\xA2Wa$\xA2a6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a$\xC6\x84`\x02a8\x9BV[a$\xD1\x90`\x01a8\xB2V[\x90P[`\x01\x81\x11\x15a%IWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a%\x05Wa%\x05a6'V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a%\x1BWa%\x1Ba6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a%B\x81a8\xC5V[\x90Pa$\xD4V[P\x83\x15a\x06\xB3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x06\x8CV[`\0` \x82\x84\x03\x12\x15a%\xAAW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x06\xB3W`\0\x80\xFD[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@R\x90V[`@Qa\x01`\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Qa\x01\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\xA4Wa&\xA4a%\xD6V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a&\xC5Wa&\xC5a%\xD6V[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a&\xE0W`\0\x80\xFD[\x815a&\xF3a&\xEE\x82a&\xACV[a&|V[\x80\x82\x82R` \x82\x01\x91P` ``\x84\x02\x86\x01\x01\x92P\x85\x83\x11\x15a'\x15W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW``\x81\x88\x03\x12\x15a'2W`\0\x80\xFD[a':a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\xFF\x81\x16\x81\x14a'\\W`\0\x80\xFD[`@\x82\x01R\x83R` \x90\x92\x01\x91``\x01a'\x1AV[P\x95\x94PPPPPV[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a'\x95Wa'\x95a%\xD6V[P`\x1F\x83\x01`\x1F\x19\x16` \x01a'\xAA\x81a&|V[\x91PP\x82\x81R\x83\x83\x83\x01\x11\x15a'\xBFW`\0\x80\xFD[\x82\x82` \x83\x017`\0` \x84\x83\x01\x01R\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a'\xE7W`\0\x80\xFD[\x815a'\xF5a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\x17W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a(:W`\0\x80\xFD[\x86\x01`?\x81\x01\x88\x13a(KW`\0\x80\xFD[a(]\x88` \x83\x015`@\x84\x01a'{V[\x84RP` \x92\x83\x01\x92\x01a(\x1CV[`\0\x82`\x1F\x83\x01\x12a(}W`\0\x80\xFD[\x815a(\x8Ba&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\xADW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805\x83R` \x92\x83\x01\x92\x01a(\xB2V[`\0\x82`\x1F\x83\x01\x12a(\xDBW`\0\x80\xFD[\x815a(\xE9a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\x0BW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a).W`\0\x80\xFD[a)=\x88` \x83\x8A\x01\x01a(lV[\x84RP` \x92\x83\x01\x92\x01a)\x10V[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a!\xA6W`\0\x80\xFD[`\0\x82`\x1F\x83\x01\x12a)rW`\0\x80\xFD[\x815a)\x80a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\xA2W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805a)\xBA\x81a)LV[\x83R` \x92\x83\x01\x92\x01a)\xA7V[\x805\x80\x15\x15\x81\x14a)\xD8W`\0\x80\xFD[\x91\x90PV[`\0a\x01`\x82\x84\x03\x12\x15a)\xF0W`\0\x80\xFD[a)\xF8a&\x14V[\x825\x81R\x90P` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x17W`\0\x80\xFD[a*#\x84\x82\x85\x01a'\xD6V[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*BW`\0\x80\xFD[a*N\x84\x82\x85\x01a(\xCAV[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*mW`\0\x80\xFD[a*y\x84\x82\x85\x01a)aV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x98W`\0\x80\xFD[a*\xA4\x84\x82\x85\x01a(\xCAV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xC3W`\0\x80\xFD[a*\xCF\x84\x82\x85\x01a(lV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xEEW`\0\x80\xFD[a*\xFA\x84\x82\x85\x01a'\xD6V[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\x19W`\0\x80\xFD[a+%\x84\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+EW`\0\x80\xFD[a+Q\x84\x82\x85\x01a(\xCAV[a\x01\0\x83\x01RPa+ea\x01 \x83\x01a)\xC8V[a\x01 \x82\x01Ra+xa\x01@\x83\x01a)\xC8V[a\x01@\x82\x01R\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15a+\x97W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xADW`\0\x80\xFD[\x83\x01``\x81\x86\x03\x12\x15a+\xBFW`\0\x80\xFD[a+\xC7a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xEEW`\0\x80\xFD[a+\xFA\x87\x82\x85\x01a&\xCFV[`@\x83\x01RP\x92PP` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[a,(\x85\x82\x86\x01a)\xDDV[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80`\0`\x80\x86\x88\x03\x12\x15a,JW`\0\x80\xFD[\x855a,U\x81a)LV[\x94P` \x86\x015a,e\x81a)LV[\x93P`@\x86\x015\x92P``\x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x87W`\0\x80\xFD[\x86\x01`\x1F\x81\x01\x88\x13a,\x98W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a,\xAEW`\0\x80\xFD[\x88` \x82\x84\x01\x01\x11\x15a,\xC0W`\0\x80\xFD[\x95\x98\x94\x97P\x92\x95PPP` \x01\x91\x90V[`\0` \x82\x84\x03\x12\x15a,\xE3W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a,\xFDW`\0\x80\xFD[\x825\x91P` \x83\x015a-\x0F\x81a)LV[\x80\x91PP\x92P\x92\x90PV[`\0\x82`\x1F\x83\x01\x12a-+W`\0\x80\xFD[a\x06\xB3\x83\x835` \x85\x01a'{V[`\0` \x82\x84\x03\x12\x15a-LW`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a-bW`\0\x80\xFD[\x82\x01a\x01\x80\x81\x85\x03\x12\x15a-uW`\0\x80\xFD[a-}a&7V[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\x9AW`\0\x80\xFD[a-\xA6\x86\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xC5W`\0\x80\xFD[a-\xD1\x86\x82\x85\x01a'\xD6V[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xF0W`\0\x80\xFD[a-\xFC\x86\x82\x85\x01a(\xCAV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x1BW`\0\x80\xFD[a.'\x86\x82\x85\x01a)aV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.FW`\0\x80\xFD[a.R\x86\x82\x85\x01a(\xCAV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.qW`\0\x80\xFD[a.}\x86\x82\x85\x01a(lV[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x9CW`\0\x80\xFD[a.\xA8\x86\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xC8W`\0\x80\xFD[a.\xD4\x86\x82\x85\x01a'\xD6V[a\x01\0\x83\x01RPa\x01 \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xF5W`\0\x80\xFD[a/\x01\x86\x82\x85\x01a(\xCAV[a\x01 \x83\x01RPa/\x15a\x01@\x83\x01a)\xC8V[a\x01@\x82\x01Ra/(a\x01`\x83\x01a)\xC8V[a\x01`\x82\x01R\x94\x93PPPPV[`\0\x82`\x1F\x83\x01\x12a/GW`\0\x80\xFD[\x815a/Ua&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a/wW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a/\x9AW`\0\x80\xFD[a/\xA9\x88` \x83\x8A\x01\x01a-\x1AV[\x84RP` \x92\x83\x01\x92\x01a/|V[`\0\x80`@\x83\x85\x03\x12\x15a/\xCBW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a/\xE8W`\0\x80\xFD[a,(\x85\x82\x86\x01a/6V[`\0\x80`@\x83\x85\x03\x12\x15a0\x07W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x1DW`\0\x80\xFD[\x83\x01`\xA0\x81\x86\x03\x12\x15a0/W`\0\x80\xFD[a07a&ZV[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0TW`\0\x80\xFD[a0`\x87\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x81\x015\x90\x82\x01R``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x89W`\0\x80\xFD[a0\x95\x87\x82\x85\x01a&\xCFV[``\x83\x01RP`\x80\x82\x015\x91Pa0\xAB\x82a)LV[`\x80\x81\x01\x91\x90\x91R\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[`\x03\x81\x10a0\xECWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x04\x95\x82\x84a0\xCEV[`\0\x80`\0\x80`\0\x80`\0\x80`\0a\x01 \x8A\x8C\x03\x12\x15a1\x1DW`\0\x80\xFD[\x895\x98P` \x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1:W`\0\x80\xFD[a1F\x8C\x82\x8D\x01a-\x1AV[\x98PP`@\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1bW`\0\x80\xFD[a1n\x8C\x82\x8D\x01a(lV[\x97PP``\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\x8AW`\0\x80\xFD[a1\x96\x8C\x82\x8D\x01a'\xD6V[\x96PP`\x80\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xB2W`\0\x80\xFD[a1\xBE\x8C\x82\x8D\x01a'\xD6V[\x95PP`\xA0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xDAW`\0\x80\xFD[a1\xE6\x8C\x82\x8D\x01a(\xCAV[\x94PP`\xC0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x02W`\0\x80\xFD[a2\x0E\x8C\x82\x8D\x01a/6V[\x93PPa2\x1D`\xE0\x8B\x01a)\xC8V[\x91Pa2,a\x01\0\x8B\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98P\x92\x95\x98V[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15a2XW`\0\x80\xFD[\x885\x97P` \x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2uW`\0\x80\xFD[a2\x81\x8B\x82\x8C\x01a-\x1AV[\x97PP`@\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x9DW`\0\x80\xFD[a2\xA9\x8B\x82\x8C\x01a(lV[\x96PP``\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xC5W`\0\x80\xFD[a2\xD1\x8B\x82\x8C\x01a'\xD6V[\x95PP`\x80\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xEDW`\0\x80\xFD[a2\xF9\x8B\x82\x8C\x01a'\xD6V[\x94PP`\xA0\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a3\x15W`\0\x80\xFD[a3!\x8B\x82\x8C\x01a(\xCAV[\x93PPa30`\xC0\x8A\x01a)\xC8V[\x91Pa3>`\xE0\x8A\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[`\0` \x82\x84\x03\x12\x15a3_W`\0\x80\xFD[\x815a\x06\xB3\x81a)LV[`\0` \x82\x84\x03\x12\x15a3|W`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xB3` \x83\x01\x84a0\xCEV[`\0` \x82\x84\x03\x12\x15a3\xA9W`\0\x80\xFD[\x81Qa\x06\xB3\x81a)LV[` \x80\x82R`Z\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rymain wallets, who are you?`0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\0[\x83\x81\x10\x15a4OW\x81\x81\x01Q\x83\x82\x01R` \x01a47V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra4p\x81` \x86\x01` \x86\x01a44V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x81R`@` \x82\x01R`\0a\x05\xFB`@\x83\x01\x84a4XV[` \x80\x82R`6\x90\x82\x01R\x7FPKPHelper: ipfs cid and scope ar`@\x82\x01Ru\x0EL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`S\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`5\x90\x82\x01R\x7FPKPHelper: address and scope arr`@\x82\x01Rt\x0C/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`[\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`;\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01Rz\r,\x84\x0C.NL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`+\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fpubkey array lengths must match\0``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fscopes array lengths must match\0``\x82\x01R`\x80\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81Q\x80\x84R` \x84\x01\x93P` \x83\x01`\0[\x82\x81\x10\x15a6oW\x81Q\x86R` \x95\x86\x01\x95\x90\x91\x01\x90`\x01\x01a6QV[P\x93\x94\x93PPPPV[\x83\x81R``` \x82\x01R`\0a6\x92``\x83\x01\x85a4XV[\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[\x96\x95PPPPPPV[\x83\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R```@\x82\x01\x81\x90R`\0\x90a6\xD8\x90\x83\x01\x84a6=V[\x95\x94PPPPPV[\x83\x81R``` \x82\x01R\x82Q``\x82\x01R`\0` \x84\x01Q```\x80\x84\x01Ra7\r`\xC0\x84\x01\x82a4XV[\x90P`@\x85\x01Q`_\x19\x84\x83\x03\x01`\xA0\x85\x01Ra7*\x82\x82a4XV[\x91PP\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x81R\x91\x90\x92\x16` \x82\x01R`@\x81\x01\x91\x90\x91R``\x01\x90V[\x86\x81R\x85` \x82\x01R`\xC0`@\x82\x01R`\0a7\x82`\xC0\x83\x01\x87a4XV[``\x83\x01\x86\x90R\x82\x81\x03`\x80\x84\x01R\x84Q\x80\x82R` \x80\x87\x01\x92\x01\x90`\0[\x81\x81\x10\x15a7\xDEW\x83Q\x80Q\x84R` \x81\x01Q` \x85\x01R`\xFF`@\x82\x01Q\x16`@\x85\x01RP``\x83\x01\x92P` \x84\x01\x93P`\x01\x81\x01\x90Pa7\xA1V[PP`\x01`\x01`\xA0\x1B\x03\x85\x16`\xA0\x85\x01R\x91Pa7\xF8\x90PV[\x97\x96PPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa85\x81`\x17\x85\x01` \x88\x01a44V[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa8f\x81`(\x84\x01` \x88\x01a44V[\x01`(\x01\x94\x93PPPPV[` \x81R`\0a\x06\xB3` \x83\x01\x84a4XV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x04\x95Wa\x04\x95a8\x85V[\x80\x82\x01\x80\x82\x11\x15a\x04\x95Wa\x04\x95a8\x85V[`\0\x81a8\xD4Wa8\xD4a8\x85V[P`\0\x19\x01\x90V\xFEPKPHelper: auth method type and \xA2dipfsX\"\x12 n\xD3\xA9v]n{\x1D\x8Fu`\xE6\xB2v\x01r\xCEl\xF0\xF5`Q\x8A\x13/\xC0\xCD\x9F\x1AX\xB8\xF8dsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static PKPHELPER_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __BYTECODE, ); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\x01LW`\x005`\xE0\x1C\x80cs\xCCA\x11\x11a\0\xBCW\x80cs\xCCA\x11\x14a\x02\xF6W\x80cw\x8F\xE5r\x14a\x03\x0BW\x80cx..\xA5\x14a\x03\x1EW\x80c\x8D\xA5\xCB[\x14a\x03>W\x80c\x91\xD1HT\x14a\x03SW\x80c\x91\xEEO\xD5\x14a\x03sW\x80c\x9D\xCA\x002\x14a\x03\x86W\x80c\xA2\x17\xFD\xDF\x14a\x03\xB4W\x80c\xCA\xEA\xD0\xC7\x14a\x03\xC9W\x80c\xD5Gt\x1F\x14a\x03\xDEW\x80c\xDB\x0B\xF93\x14a\x03\xFEW\x80c\xE4\xF1\x1D\xF6\x14a\x04\x11W\x80c\xF2\xFD\xE3\x8B\x14a\x04$W\x80c\xF9]q\xB1\x14a\x04DW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01QW\x80c\x0E\x9E\xD6\x8B\x14a\x01\x86W\x80c\x13\xAFA\x1B\x14a\x01\xA8W\x80c\x15\x0Bz\x02\x14a\x01\xC9W\x80c /rO\x14a\x02\x02W\x80c$\x8A\x9C\xA3\x14a\x02\x15W\x80c+U5Q\x14a\x025W\x80c//\xF1]\x14a\x02WW\x80c2vU\x8C\x14a\x02wW\x80c6V\x8A\xBE\x14a\x02\x8CW\x80cPC\x02l\x14a\x02\xACW\x80cP\xD1{^\x14a\x02\xC1W\x80cqP\x18\xA6\x14a\x02\xE1W[`\0\x80\xFD[4\x80\x15a\x01]W`\0\x80\xFD[Pa\x01qa\x01l6`\x04a%\x98V[a\x04dV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x92W`\0\x80\xFD[Pa\x01\x9Ba\x04\x9BV[`@Qa\x01}\x91\x90a%\xC2V[a\x01\xBBa\x01\xB66`\x04a+\x84V[a\x05\x86V[`@Q\x90\x81R` \x01a\x01}V[4\x80\x15a\x01\xD5W`\0\x80\xFD[Pa\x01\xE9a\x01\xE46`\x04a,2V[a\x06\x03V[`@Q`\x01`\x01`\xE0\x1B\x03\x19\x90\x91\x16\x81R` \x01a\x01}V[a\x01\xBBa\x02\x106`\x04a+\x84V[a\x06\xA7V[4\x80\x15a\x02!W`\0\x80\xFD[Pa\x01\xBBa\x0206`\x04a,\xD1V[a\x06\xBAV[4\x80\x15a\x02AW`\0\x80\xFD[Pa\x02Ua\x02P6`\x04a,\xD1V[a\x06\xD0V[\0[4\x80\x15a\x02cW`\0\x80\xFD[Pa\x02Ua\x02r6`\x04a,\xEAV[a\x08\xABV[4\x80\x15a\x02\x83W`\0\x80\xFD[Pa\x01\x9Ba\x08\xCCV[4\x80\x15a\x02\x98W`\0\x80\xFD[Pa\x02Ua\x02\xA76`\x04a,\xEAV[a\t\x1EV[4\x80\x15a\x02\xB8W`\0\x80\xFD[Pa\x01\x9Ba\t\x9CV[4\x80\x15a\x02\xCDW`\0\x80\xFD[P`\x02Ta\x01\x9B\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x02\xEDW`\0\x80\xFD[Pa\x02Ua\t\xEEV[4\x80\x15a\x03\x02W`\0\x80\xFD[Pa\x01\x9Ba\n\x02V[a\x01\xBBa\x03\x196`\x04a-:V[a\nTV[4\x80\x15a\x03*W`\0\x80\xFD[Pa\x02Ua\x0396`\x04a/\xB8V[a\x10fV[4\x80\x15a\x03JW`\0\x80\xFD[Pa\x01\x9Ba\x12\x89V[4\x80\x15a\x03_W`\0\x80\xFD[Pa\x01qa\x03n6`\x04a,\xEAV[a\x12\x98V[a\x01\xBBa\x03\x816`\x04a/\xF4V[a\x12\xC3V[4\x80\x15a\x03\x92W`\0\x80\xFD[P`\x02Ta\x03\xA7\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\x01}\x91\x90a0\xF0V[4\x80\x15a\x03\xC0W`\0\x80\xFD[Pa\x01\xBB`\0\x81V[4\x80\x15a\x03\xD5W`\0\x80\xFD[Pa\x01\x9Ba\x19eV[4\x80\x15a\x03\xEAW`\0\x80\xFD[Pa\x02Ua\x03\xF96`\x04a,\xEAV[a\x19\xB7V[a\x01\xBBa\x04\x0C6`\x04a0\xFEV[a\x19\xD3V[a\x01\xBBa\x04\x1F6`\x04a2;V[a\x1F\xDDV[4\x80\x15a\x040W`\0\x80\xFD[Pa\x02Ua\x04?6`\x04a3MV[a!0V[4\x80\x15a\x04PW`\0\x80\xFD[Pa\x02Ua\x04_6`\x04a3MV[a!\xA9V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x04\x95WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\x02T`@\x80Qc\xDA\x19\xDD\xFB`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\xDA\x19\xDD\xFB\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x11\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x05@\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05]W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x81\x91\x90a3\x97V[\x90P\x90V[`\0\x80`@Q\x80`\xA0\x01`@R\x80\x85`\0\x01Q\x81R` \x01`@Q\x80`@\x01`@R\x80`\x0C\x81R` \x01knaga-keyset1`\xA0\x1B\x81RP\x81R` \x01\x85` \x01Q\x81R` \x01\x85`@\x01Q\x81R` \x01a\x05\xE4a\x04\x9BV[`\x01`\x01`\xA0\x1B\x03\x16\x90R\x90Pa\x05\xFB\x81\x84a\x12\xC3V[\x94\x93PPPPV[`\0a\x06\ra\x19eV[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x95W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`:`$\x82\x01R\x7FPKPHelper: only accepts transfer`D\x82\x01Ry\x1C\xC8\x19\x9C\x9B\xDBH\x1D\x1A\x19H\x14\x12\xD4\x13\x91\x95\x08\x18\xDB\xDB\x9D\x1C\x98X\xDD`2\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[Pc\n\x85\xBD\x01`\xE1\x1B\x95\x94PPPPPV[`\0a\x06\xB3\x83\x83a\x05\x86V[\x93\x92PPPV[`\0\x90\x81R`\x01` \x81\x90R`@\x90\x91 \x01T\x90V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07\"W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07F\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07u\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\x92W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xB6\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x07\xE6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x07\xF0a\t\x9CV[`@Qc\xB6:vw`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R\x90\x91P`\x01`\x01`\xA0\x1B\x03\x82\x16\x90c\xB6:vw\x90`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x085W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08IW=`\0\x80>=`\0\xFD[PP`@Qc(\xCD\x10\xC7`\xE1\x1B\x81R`\x04\x81\x01\x85\x90R`\x01`\x01`\xA0\x1B\x03\x84\x16\x92PcQ\x9A!\x8E\x91P`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x08\x8FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08\xA3W=`\0\x80>=`\0\xFD[PPPPPPV[a\x08\xB4\x82a\x06\xBAV[a\x08\xBD\x81a\"\x07V[a\x08\xC7\x83\x83a\"\x11V[PPPV[`\x02T`@\x80Qc\x12\x0E_\x07`\xE3\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x90r\xF88\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\t\x8EW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a\t\x98\x82\x82a\"|V[PPV[`\x02T`@\x80Qc\x16\xF7k\xBF`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x16\xF7k\xBF\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\t\xF6a\"\xE3V[a\n\0`\0a#BV[V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\0\x80a\n_a\x19eV[\x83Q` \x85\x01Q`@Qc?\xF8\x06\x97`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x92c\x7F\xF0\r.\x924\x92a\n\x94\x92`\x04\x01a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\n\xB2W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n\xD7\x91\x90a3jV[\x90P\x82``\x01QQ\x83`@\x01QQ\x14a\x0B\x02W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x82`\xA0\x01QQ\x83`\x80\x01QQ\x14a\x0B+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x82`\xE0\x01QQ\x83`\xC0\x01QQ\x14a\x0BTW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x82a\x01\0\x01QQ\x83`\xC0\x01QQ\x14a\x0B~W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x82a\x01 \x01QQ\x83`\xC0\x01QQ\x14a\x0B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[`@\x83\x01QQ\x15a\x0CtW`\0[\x83`@\x01QQ\x81\x10\x15a\x0CrWa\x0B\xCBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x86`@\x01Q\x84\x81Q\x81\x10a\x0B\xF0Wa\x0B\xF0a6'V[` \x02` \x01\x01Q\x87``\x01Q\x85\x81Q\x81\x10a\x0C\x0EWa\x0C\x0Ea6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0C4\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0CNW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0CbW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0B\xB6\x90PV[P[`\x80\x83\x01QQ\x15a\r@W`\0[\x83`\x80\x01QQ\x81\x10\x15a\r>Wa\x0C\x97a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x86`\x80\x01Q\x84\x81Q\x81\x10a\x0C\xBCWa\x0C\xBCa6'V[` \x02` \x01\x01Q\x87`\xA0\x01Q\x85\x81Q\x81\x10a\x0C\xDAWa\x0C\xDAa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\0\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\x1AW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r.W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0C\x82\x90PV[P[`\xC0\x83\x01QQ\x15a\x0EbW`\0[\x83`\xC0\x01QQ\x81\x10\x15a\x0E`Wa\rca\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x88`\xC0\x01Q\x86\x81Q\x81\x10a\r\x93Wa\r\x93a6'V[` \x02` \x01\x01Q\x81R` \x01\x88`\xE0\x01Q\x86\x81Q\x81\x10a\r\xB6Wa\r\xB6a6'V[` \x02` \x01\x01Q\x81R` \x01\x88a\x01\0\x01Q\x86\x81Q\x81\x10a\r\xDAWa\r\xDAa6'V[` \x02` \x01\x01Q\x81RP\x87a\x01 \x01Q\x85\x81Q\x81\x10a\r\xFCWa\r\xFCa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\"\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0E=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\rN\x90PV[P[`\0a\x0Ela\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\x99\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E\xB6W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xDA\x91\x90a3\x97V[\x90P\x83a\x01@\x01Q\x15a\x0F|Wa\x0E\xEFa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0F*W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0FI\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0FcW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0FwW=`\0\x80>=`\0\xFD[PPPP[\x83a\x01`\x01Q\x15a\x0F\xF5Wa\x0F\x8Fa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\xBE\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0F\xD8W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F\xECW=`\0\x80>=`\0\xFD[PPPPa\x10_V[a\x0F\xFDa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x10,\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x10FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x10ZW=`\0\x80>=`\0\xFD[PPPP[P\x92\x91PPV[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x10\xB8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10\xDC\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x11\x0B\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11(W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11L\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x11|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x11\x86a\t\x9CV[\x82Q\x90\x91P\x15a\x08\xC7W\x80`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x84\x84`\0\x81Q\x81\x10a\x11\xB3Wa\x11\xB3a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x11\xD8\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x11\xF2W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x06W=`\0\x80>=`\0\xFD[PPPP\x80`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x84\x84`\x01\x81Q\x81\x10a\x12-Wa\x12-a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x12R\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x12lW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x80W=`\0\x80>=`\0\xFD[PPPPPPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\0\x91\x82R`\x01` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[\x80Q\x82Q`\0\x91\x14a\x13=W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`>`$\x82\x01R\x7FPKPHelper: Claim key type must m`D\x82\x01R\x7Fatch Auth Method data key type\0\0`d\x82\x01R`\x84\x01a\x06\x8CV[`\x01`\0a\x13Ia\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cq\xAA\x9A\xCF4\x84\x88`\0\x01Q\x89` \x01Q\x8A`@\x01Q\x8B``\x01Q\x8C`\x80\x01Q`@Q\x88c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\x93\x96\x95\x94\x93\x92\x91\x90a7cV[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x13\xB1W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xD6\x91\x90a3jV[\x90P\x83`@\x01QQ\x84` \x01QQ\x14a\x14\x01W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x83`\x80\x01QQ\x84``\x01QQ\x14a\x14*W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x83`\xC0\x01QQ\x84`\xA0\x01QQ\x14a\x14SW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x83`\xE0\x01QQ\x84`\xA0\x01QQ\x14a\x14|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x83a\x01\0\x01QQ\x84`\xA0\x01QQ\x14a\x14\xA6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[` \x84\x01QQ\x15a\x15rW`\0[\x84` \x01QQ\x81\x10\x15a\x15pWa\x14\xC9a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x87` \x01Q\x84\x81Q\x81\x10a\x14\xEEWa\x14\xEEa6'V[` \x02` \x01\x01Q\x88`@\x01Q\x85\x81Q\x81\x10a\x15\x0CWa\x15\x0Ca6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x152\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x15LW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x15`W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x14\xB4\x90PV[P[``\x84\x01QQ\x15a\x16>W`\0[\x84``\x01QQ\x81\x10\x15a\x16=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x15\x80\x90PV[P[`\xA0\x84\x01QQ\x15a\x17_W`\0[\x84`\xA0\x01QQ\x81\x10\x15a\x17]Wa\x16aa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x89`\xA0\x01Q\x86\x81Q\x81\x10a\x16\x91Wa\x16\x91a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xC0\x01Q\x86\x81Q\x81\x10a\x16\xB4Wa\x16\xB4a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xE0\x01Q\x86\x81Q\x81\x10a\x16\xD7Wa\x16\xD7a6'V[` \x02` \x01\x01Q\x81RP\x88a\x01\0\x01Q\x85\x81Q\x81\x10a\x16\xF9Wa\x16\xF9a6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x1F\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x179W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x17MW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x16L\x90PV[P[`\0a\x17ia\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x96\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\xB3W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17\xD7\x91\x90a3\x97V[\x90P\x84a\x01 \x01Q\x15a\x18yWa\x17\xECa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x18'W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18F\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18`W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18tW=`\0\x80>=`\0\xFD[PPPP[\x84a\x01@\x01Q\x15a\x18\xF2Wa\x18\x8Ca\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18\xBB\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18\xD5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18\xE9W=`\0\x80>=`\0\xFD[PPPPa\x19\\V[a\x18\xFAa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x19)\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x19CW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x19WW=`\0\x80>=`\0\xFD[PPPP[P\x94\x93PPPPV[`\x02T`@\x80Qc,\x0B\x8B\xF7`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c,\x0B\x8B\xF7\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\x19\xC0\x82a\x06\xBAV[a\x19\xC9\x81a\"\x07V[a\x08\xC7\x83\x83a\"|V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x1A%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1AI\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x1Ax\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1A\x95W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1A\xB9\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x1A\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x1A\xF3a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16c\x7F\xF0\r.4\x8D\x8D`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1B!\x92\x91\x90a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x1B?W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1Bd\x91\x90a3jV[\x90P\x87Q\x89Q\x14a\x1B\x87W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x86Q\x89Q\x14a\x1B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x85Q\x89Q\x14a\x1B\xC9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[\x88Q\x15a\x1C\xD1W`\0[\x89Q\x81\x10\x15a\x1C\xCFWa\x1B\xE4a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x8E\x86\x81Q\x81\x10a\x1C\x10Wa\x1C\x10a6'V[` \x02` \x01\x01Q\x81R` \x01\x8D\x86\x81Q\x81\x10a\x1C/Wa\x1C/a6'V[` \x02` \x01\x01Q\x81R` \x01\x8C\x86\x81Q\x81\x10a\x1CNWa\x1CNa6'V[` \x02` \x01\x01Q\x81RP\x8A\x85\x81Q\x81\x10a\x1CkWa\x1Cka6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\x91\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1C\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1C\xBFW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x1B\xD3\x90PV[P[`\0a\x1C\xDBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\x08\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1D%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1DI\x91\x90a3\x97V[\x90P\x84\x15a\x1D\xE6Wa\x1DYa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x1D\x94W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\xB3\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1D\xCDW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1D\xE1W=`\0\x80>=`\0\xFD[PPPP[\x83\x15a\x1EZWa\x1D\xF4a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E#\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E=W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1EQW=`\0\x80>=`\0\xFD[PPPPa\x1E\xC4V[a\x1Eba\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E\x91\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1E\xBFW=`\0\x80>=`\0\xFD[PPPP[\x85Q\x15a\x1F\xCEWa\x1E\xD3a\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x83\x88`\0\x81Q\x81\x10a\x1E\xF5Wa\x1E\xF5a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x1A\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F4W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1FHW=`\0\x80>=`\0\xFD[PPPPa\x1FTa\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x83\x88`\x01\x81Q\x81\x10a\x1FvWa\x1Fva6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x9B\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F\xB5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1F\xC9W=`\0\x80>=`\0\xFD[PPPP[P\x9A\x99PPPPPPPPPPV[`\0\x80`@Q\x80a\x01\x80\x01`@R\x80\x8B\x81R` \x01\x8A\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x81\x11\x15a \x11Wa \x11a%\xD6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a DW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a /W\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \x7FW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a jW\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xB0W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xEBW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a \xD6W\x90P[P\x81R` \x01\x89\x81R` \x01\x88\x81R` \x01\x87\x81R` \x01\x86\x81R` \x01\x85\x15\x15\x81R` \x01\x84\x15\x15\x81RP\x90Pa!\"\x81a\nTV[\x9A\x99PPPPPPPPPPV[a!8a\"\xE3V[`\x01`\x01`\xA0\x1B\x03\x81\x16a!\x9DW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`&`$\x82\x01R\x7FOwnable: new owner is the zero a`D\x82\x01Reddress`\xD0\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a!\xA6\x81a#BV[PV[a!\xB1a\"\xE3V[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x17\x90U`@Q\x7F'`\x07<|\xD8\xCA\xC51\xD7\xF6C\xBE\xCB\xFB\xB7M\x8B\x81VD>\xAC\xF8yb%2\xDB\xBB<\xD5\x90a!\xFC\x90\x83\x90a%\xC2V[`@Q\x80\x91\x03\x90\xA1PV[a!\xA6\x813a#\x92V[a\"\x1B\x82\x82a\x12\x98V[a\t\x98W`\0\x82\x81R`\x01` \x81\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x86\x16\x80\x86R\x92R\x80\x84 \x80T`\xFF\x19\x16\x90\x93\x17\x90\x92U\x90Q3\x92\x85\x91\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r\x91\x90\xA4PPV[a\"\x86\x82\x82a\x12\x98V[\x15a\t\x98W`\0\x82\x81R`\x01` \x90\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[3a\"\xECa\x12\x89V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\n\0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FOwnable: caller is not the owner`D\x82\x01R`d\x01a\x06\x8CV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[a#\x9C\x82\x82a\x12\x98V[a\t\x98Wa#\xA9\x81a#\xEBV[a#\xB4\x83` a#\xFDV[`@Q` \x01a#\xC5\x92\x91\x90a8\x03V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x06\x8C\x91`\x04\x01a8rV[``a\x04\x95`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a$\x0C\x83`\x02a8\x9BV[a$\x17\x90`\x02a8\xB2V[`\x01`\x01`@\x1B\x03\x81\x11\x15a$.Wa$.a%\xD6V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a$XW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a$sWa$sa6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a$\xA2Wa$\xA2a6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a$\xC6\x84`\x02a8\x9BV[a$\xD1\x90`\x01a8\xB2V[\x90P[`\x01\x81\x11\x15a%IWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a%\x05Wa%\x05a6'V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a%\x1BWa%\x1Ba6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a%B\x81a8\xC5V[\x90Pa$\xD4V[P\x83\x15a\x06\xB3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x06\x8CV[`\0` \x82\x84\x03\x12\x15a%\xAAW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x06\xB3W`\0\x80\xFD[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@R\x90V[`@Qa\x01`\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Qa\x01\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\xA4Wa&\xA4a%\xD6V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a&\xC5Wa&\xC5a%\xD6V[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a&\xE0W`\0\x80\xFD[\x815a&\xF3a&\xEE\x82a&\xACV[a&|V[\x80\x82\x82R` \x82\x01\x91P` ``\x84\x02\x86\x01\x01\x92P\x85\x83\x11\x15a'\x15W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW``\x81\x88\x03\x12\x15a'2W`\0\x80\xFD[a':a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\xFF\x81\x16\x81\x14a'\\W`\0\x80\xFD[`@\x82\x01R\x83R` \x90\x92\x01\x91``\x01a'\x1AV[P\x95\x94PPPPPV[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a'\x95Wa'\x95a%\xD6V[P`\x1F\x83\x01`\x1F\x19\x16` \x01a'\xAA\x81a&|V[\x91PP\x82\x81R\x83\x83\x83\x01\x11\x15a'\xBFW`\0\x80\xFD[\x82\x82` \x83\x017`\0` \x84\x83\x01\x01R\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a'\xE7W`\0\x80\xFD[\x815a'\xF5a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\x17W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a(:W`\0\x80\xFD[\x86\x01`?\x81\x01\x88\x13a(KW`\0\x80\xFD[a(]\x88` \x83\x015`@\x84\x01a'{V[\x84RP` \x92\x83\x01\x92\x01a(\x1CV[`\0\x82`\x1F\x83\x01\x12a(}W`\0\x80\xFD[\x815a(\x8Ba&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\xADW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805\x83R` \x92\x83\x01\x92\x01a(\xB2V[`\0\x82`\x1F\x83\x01\x12a(\xDBW`\0\x80\xFD[\x815a(\xE9a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\x0BW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a).W`\0\x80\xFD[a)=\x88` \x83\x8A\x01\x01a(lV[\x84RP` \x92\x83\x01\x92\x01a)\x10V[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a!\xA6W`\0\x80\xFD[`\0\x82`\x1F\x83\x01\x12a)rW`\0\x80\xFD[\x815a)\x80a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\xA2W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805a)\xBA\x81a)LV[\x83R` \x92\x83\x01\x92\x01a)\xA7V[\x805\x80\x15\x15\x81\x14a)\xD8W`\0\x80\xFD[\x91\x90PV[`\0a\x01`\x82\x84\x03\x12\x15a)\xF0W`\0\x80\xFD[a)\xF8a&\x14V[\x825\x81R\x90P` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x17W`\0\x80\xFD[a*#\x84\x82\x85\x01a'\xD6V[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*BW`\0\x80\xFD[a*N\x84\x82\x85\x01a(\xCAV[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*mW`\0\x80\xFD[a*y\x84\x82\x85\x01a)aV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x98W`\0\x80\xFD[a*\xA4\x84\x82\x85\x01a(\xCAV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xC3W`\0\x80\xFD[a*\xCF\x84\x82\x85\x01a(lV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xEEW`\0\x80\xFD[a*\xFA\x84\x82\x85\x01a'\xD6V[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\x19W`\0\x80\xFD[a+%\x84\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+EW`\0\x80\xFD[a+Q\x84\x82\x85\x01a(\xCAV[a\x01\0\x83\x01RPa+ea\x01 \x83\x01a)\xC8V[a\x01 \x82\x01Ra+xa\x01@\x83\x01a)\xC8V[a\x01@\x82\x01R\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15a+\x97W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xADW`\0\x80\xFD[\x83\x01``\x81\x86\x03\x12\x15a+\xBFW`\0\x80\xFD[a+\xC7a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xEEW`\0\x80\xFD[a+\xFA\x87\x82\x85\x01a&\xCFV[`@\x83\x01RP\x92PP` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[a,(\x85\x82\x86\x01a)\xDDV[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80`\0`\x80\x86\x88\x03\x12\x15a,JW`\0\x80\xFD[\x855a,U\x81a)LV[\x94P` \x86\x015a,e\x81a)LV[\x93P`@\x86\x015\x92P``\x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x87W`\0\x80\xFD[\x86\x01`\x1F\x81\x01\x88\x13a,\x98W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a,\xAEW`\0\x80\xFD[\x88` \x82\x84\x01\x01\x11\x15a,\xC0W`\0\x80\xFD[\x95\x98\x94\x97P\x92\x95PPP` \x01\x91\x90V[`\0` \x82\x84\x03\x12\x15a,\xE3W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a,\xFDW`\0\x80\xFD[\x825\x91P` \x83\x015a-\x0F\x81a)LV[\x80\x91PP\x92P\x92\x90PV[`\0\x82`\x1F\x83\x01\x12a-+W`\0\x80\xFD[a\x06\xB3\x83\x835` \x85\x01a'{V[`\0` \x82\x84\x03\x12\x15a-LW`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a-bW`\0\x80\xFD[\x82\x01a\x01\x80\x81\x85\x03\x12\x15a-uW`\0\x80\xFD[a-}a&7V[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\x9AW`\0\x80\xFD[a-\xA6\x86\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xC5W`\0\x80\xFD[a-\xD1\x86\x82\x85\x01a'\xD6V[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xF0W`\0\x80\xFD[a-\xFC\x86\x82\x85\x01a(\xCAV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x1BW`\0\x80\xFD[a.'\x86\x82\x85\x01a)aV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.FW`\0\x80\xFD[a.R\x86\x82\x85\x01a(\xCAV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.qW`\0\x80\xFD[a.}\x86\x82\x85\x01a(lV[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x9CW`\0\x80\xFD[a.\xA8\x86\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xC8W`\0\x80\xFD[a.\xD4\x86\x82\x85\x01a'\xD6V[a\x01\0\x83\x01RPa\x01 \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xF5W`\0\x80\xFD[a/\x01\x86\x82\x85\x01a(\xCAV[a\x01 \x83\x01RPa/\x15a\x01@\x83\x01a)\xC8V[a\x01@\x82\x01Ra/(a\x01`\x83\x01a)\xC8V[a\x01`\x82\x01R\x94\x93PPPPV[`\0\x82`\x1F\x83\x01\x12a/GW`\0\x80\xFD[\x815a/Ua&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a/wW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a/\x9AW`\0\x80\xFD[a/\xA9\x88` \x83\x8A\x01\x01a-\x1AV[\x84RP` \x92\x83\x01\x92\x01a/|V[`\0\x80`@\x83\x85\x03\x12\x15a/\xCBW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a/\xE8W`\0\x80\xFD[a,(\x85\x82\x86\x01a/6V[`\0\x80`@\x83\x85\x03\x12\x15a0\x07W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x1DW`\0\x80\xFD[\x83\x01`\xA0\x81\x86\x03\x12\x15a0/W`\0\x80\xFD[a07a&ZV[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0TW`\0\x80\xFD[a0`\x87\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x81\x015\x90\x82\x01R``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x89W`\0\x80\xFD[a0\x95\x87\x82\x85\x01a&\xCFV[``\x83\x01RP`\x80\x82\x015\x91Pa0\xAB\x82a)LV[`\x80\x81\x01\x91\x90\x91R\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[`\x03\x81\x10a0\xECWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x04\x95\x82\x84a0\xCEV[`\0\x80`\0\x80`\0\x80`\0\x80`\0a\x01 \x8A\x8C\x03\x12\x15a1\x1DW`\0\x80\xFD[\x895\x98P` \x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1:W`\0\x80\xFD[a1F\x8C\x82\x8D\x01a-\x1AV[\x98PP`@\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1bW`\0\x80\xFD[a1n\x8C\x82\x8D\x01a(lV[\x97PP``\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\x8AW`\0\x80\xFD[a1\x96\x8C\x82\x8D\x01a'\xD6V[\x96PP`\x80\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xB2W`\0\x80\xFD[a1\xBE\x8C\x82\x8D\x01a'\xD6V[\x95PP`\xA0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xDAW`\0\x80\xFD[a1\xE6\x8C\x82\x8D\x01a(\xCAV[\x94PP`\xC0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x02W`\0\x80\xFD[a2\x0E\x8C\x82\x8D\x01a/6V[\x93PPa2\x1D`\xE0\x8B\x01a)\xC8V[\x91Pa2,a\x01\0\x8B\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98P\x92\x95\x98V[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15a2XW`\0\x80\xFD[\x885\x97P` \x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2uW`\0\x80\xFD[a2\x81\x8B\x82\x8C\x01a-\x1AV[\x97PP`@\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x9DW`\0\x80\xFD[a2\xA9\x8B\x82\x8C\x01a(lV[\x96PP``\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xC5W`\0\x80\xFD[a2\xD1\x8B\x82\x8C\x01a'\xD6V[\x95PP`\x80\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xEDW`\0\x80\xFD[a2\xF9\x8B\x82\x8C\x01a'\xD6V[\x94PP`\xA0\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a3\x15W`\0\x80\xFD[a3!\x8B\x82\x8C\x01a(\xCAV[\x93PPa30`\xC0\x8A\x01a)\xC8V[\x91Pa3>`\xE0\x8A\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[`\0` \x82\x84\x03\x12\x15a3_W`\0\x80\xFD[\x815a\x06\xB3\x81a)LV[`\0` \x82\x84\x03\x12\x15a3|W`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xB3` \x83\x01\x84a0\xCEV[`\0` \x82\x84\x03\x12\x15a3\xA9W`\0\x80\xFD[\x81Qa\x06\xB3\x81a)LV[` \x80\x82R`Z\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rymain wallets, who are you?`0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\0[\x83\x81\x10\x15a4OW\x81\x81\x01Q\x83\x82\x01R` \x01a47V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra4p\x81` \x86\x01` \x86\x01a44V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x81R`@` \x82\x01R`\0a\x05\xFB`@\x83\x01\x84a4XV[` \x80\x82R`6\x90\x82\x01R\x7FPKPHelper: ipfs cid and scope ar`@\x82\x01Ru\x0EL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`S\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`5\x90\x82\x01R\x7FPKPHelper: address and scope arr`@\x82\x01Rt\x0C/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`[\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`;\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01Rz\r,\x84\x0C.NL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`+\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fpubkey array lengths must match\0``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fscopes array lengths must match\0``\x82\x01R`\x80\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81Q\x80\x84R` \x84\x01\x93P` \x83\x01`\0[\x82\x81\x10\x15a6oW\x81Q\x86R` \x95\x86\x01\x95\x90\x91\x01\x90`\x01\x01a6QV[P\x93\x94\x93PPPPV[\x83\x81R``` \x82\x01R`\0a6\x92``\x83\x01\x85a4XV[\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[\x96\x95PPPPPPV[\x83\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R```@\x82\x01\x81\x90R`\0\x90a6\xD8\x90\x83\x01\x84a6=V[\x95\x94PPPPPV[\x83\x81R``` \x82\x01R\x82Q``\x82\x01R`\0` \x84\x01Q```\x80\x84\x01Ra7\r`\xC0\x84\x01\x82a4XV[\x90P`@\x85\x01Q`_\x19\x84\x83\x03\x01`\xA0\x85\x01Ra7*\x82\x82a4XV[\x91PP\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x81R\x91\x90\x92\x16` \x82\x01R`@\x81\x01\x91\x90\x91R``\x01\x90V[\x86\x81R\x85` \x82\x01R`\xC0`@\x82\x01R`\0a7\x82`\xC0\x83\x01\x87a4XV[``\x83\x01\x86\x90R\x82\x81\x03`\x80\x84\x01R\x84Q\x80\x82R` \x80\x87\x01\x92\x01\x90`\0[\x81\x81\x10\x15a7\xDEW\x83Q\x80Q\x84R` \x81\x01Q` \x85\x01R`\xFF`@\x82\x01Q\x16`@\x85\x01RP``\x83\x01\x92P` \x84\x01\x93P`\x01\x81\x01\x90Pa7\xA1V[PP`\x01`\x01`\xA0\x1B\x03\x85\x16`\xA0\x85\x01R\x91Pa7\xF8\x90PV[\x97\x96PPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa85\x81`\x17\x85\x01` \x88\x01a44V[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa8f\x81`(\x84\x01` \x88\x01a44V[\x01`(\x01\x94\x93PPPPV[` \x81R`\0a\x06\xB3` \x83\x01\x84a4XV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x04\x95Wa\x04\x95a8\x85V[\x80\x82\x01\x80\x82\x11\x15a\x04\x95Wa\x04\x95a8\x85V[`\0\x81a8\xD4Wa8\xD4a8\x85V[P`\0\x19\x01\x90V\xFEPKPHelper: auth method type and \xA2dipfsX\"\x12 8)W\x80\xA3\x13\xE8\x95\xB6\xDC\xEAh\xE9\0\xA6o\x08;\xF3mzE$\xB6<\xF8\xBF#\xE4\x9Dc\rdsolcC\0\x08\x1C\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\x01LW`\x005`\xE0\x1C\x80cs\xCCA\x11\x11a\0\xBCW\x80cs\xCCA\x11\x14a\x02\xF6W\x80cw\x8F\xE5r\x14a\x03\x0BW\x80cx..\xA5\x14a\x03\x1EW\x80c\x8D\xA5\xCB[\x14a\x03>W\x80c\x91\xD1HT\x14a\x03SW\x80c\x91\xEEO\xD5\x14a\x03sW\x80c\x9D\xCA\x002\x14a\x03\x86W\x80c\xA2\x17\xFD\xDF\x14a\x03\xB4W\x80c\xCA\xEA\xD0\xC7\x14a\x03\xC9W\x80c\xD5Gt\x1F\x14a\x03\xDEW\x80c\xDB\x0B\xF93\x14a\x03\xFEW\x80c\xE4\xF1\x1D\xF6\x14a\x04\x11W\x80c\xF2\xFD\xE3\x8B\x14a\x04$W\x80c\xF9]q\xB1\x14a\x04DW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01QW\x80c\x0E\x9E\xD6\x8B\x14a\x01\x86W\x80c\x13\xAFA\x1B\x14a\x01\xA8W\x80c\x15\x0Bz\x02\x14a\x01\xC9W\x80c /rO\x14a\x02\x02W\x80c$\x8A\x9C\xA3\x14a\x02\x15W\x80c+U5Q\x14a\x025W\x80c//\xF1]\x14a\x02WW\x80c2vU\x8C\x14a\x02wW\x80c6V\x8A\xBE\x14a\x02\x8CW\x80cPC\x02l\x14a\x02\xACW\x80cP\xD1{^\x14a\x02\xC1W\x80cqP\x18\xA6\x14a\x02\xE1W[`\0\x80\xFD[4\x80\x15a\x01]W`\0\x80\xFD[Pa\x01qa\x01l6`\x04a%\x98V[a\x04dV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x92W`\0\x80\xFD[Pa\x01\x9Ba\x04\x9BV[`@Qa\x01}\x91\x90a%\xC2V[a\x01\xBBa\x01\xB66`\x04a+\x84V[a\x05\x86V[`@Q\x90\x81R` \x01a\x01}V[4\x80\x15a\x01\xD5W`\0\x80\xFD[Pa\x01\xE9a\x01\xE46`\x04a,2V[a\x06\x03V[`@Q`\x01`\x01`\xE0\x1B\x03\x19\x90\x91\x16\x81R` \x01a\x01}V[a\x01\xBBa\x02\x106`\x04a+\x84V[a\x06\xA7V[4\x80\x15a\x02!W`\0\x80\xFD[Pa\x01\xBBa\x0206`\x04a,\xD1V[a\x06\xBAV[4\x80\x15a\x02AW`\0\x80\xFD[Pa\x02Ua\x02P6`\x04a,\xD1V[a\x06\xD0V[\0[4\x80\x15a\x02cW`\0\x80\xFD[Pa\x02Ua\x02r6`\x04a,\xEAV[a\x08\xABV[4\x80\x15a\x02\x83W`\0\x80\xFD[Pa\x01\x9Ba\x08\xCCV[4\x80\x15a\x02\x98W`\0\x80\xFD[Pa\x02Ua\x02\xA76`\x04a,\xEAV[a\t\x1EV[4\x80\x15a\x02\xB8W`\0\x80\xFD[Pa\x01\x9Ba\t\x9CV[4\x80\x15a\x02\xCDW`\0\x80\xFD[P`\x02Ta\x01\x9B\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x02\xEDW`\0\x80\xFD[Pa\x02Ua\t\xEEV[4\x80\x15a\x03\x02W`\0\x80\xFD[Pa\x01\x9Ba\n\x02V[a\x01\xBBa\x03\x196`\x04a-:V[a\nTV[4\x80\x15a\x03*W`\0\x80\xFD[Pa\x02Ua\x0396`\x04a/\xB8V[a\x10fV[4\x80\x15a\x03JW`\0\x80\xFD[Pa\x01\x9Ba\x12\x89V[4\x80\x15a\x03_W`\0\x80\xFD[Pa\x01qa\x03n6`\x04a,\xEAV[a\x12\x98V[a\x01\xBBa\x03\x816`\x04a/\xF4V[a\x12\xC3V[4\x80\x15a\x03\x92W`\0\x80\xFD[P`\x02Ta\x03\xA7\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\x01}\x91\x90a0\xF0V[4\x80\x15a\x03\xC0W`\0\x80\xFD[Pa\x01\xBB`\0\x81V[4\x80\x15a\x03\xD5W`\0\x80\xFD[Pa\x01\x9Ba\x19eV[4\x80\x15a\x03\xEAW`\0\x80\xFD[Pa\x02Ua\x03\xF96`\x04a,\xEAV[a\x19\xB7V[a\x01\xBBa\x04\x0C6`\x04a0\xFEV[a\x19\xD3V[a\x01\xBBa\x04\x1F6`\x04a2;V[a\x1F\xDDV[4\x80\x15a\x040W`\0\x80\xFD[Pa\x02Ua\x04?6`\x04a3MV[a!0V[4\x80\x15a\x04PW`\0\x80\xFD[Pa\x02Ua\x04_6`\x04a3MV[a!\xA9V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x04\x95WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\x02T`@\x80Qc\xDA\x19\xDD\xFB`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\xDA\x19\xDD\xFB\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x11\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x05@\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05]W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x81\x91\x90a3\x97V[\x90P\x90V[`\0\x80`@Q\x80`\xA0\x01`@R\x80\x85`\0\x01Q\x81R` \x01`@Q\x80`@\x01`@R\x80`\x0C\x81R` \x01knaga-keyset1`\xA0\x1B\x81RP\x81R` \x01\x85` \x01Q\x81R` \x01\x85`@\x01Q\x81R` \x01a\x05\xE4a\x04\x9BV[`\x01`\x01`\xA0\x1B\x03\x16\x90R\x90Pa\x05\xFB\x81\x84a\x12\xC3V[\x94\x93PPPPV[`\0a\x06\ra\x19eV[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x95W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`:`$\x82\x01R\x7FPKPHelper: only accepts transfer`D\x82\x01Ry\x1C\xC8\x19\x9C\x9B\xDBH\x1D\x1A\x19H\x14\x12\xD4\x13\x91\x95\x08\x18\xDB\xDB\x9D\x1C\x98X\xDD`2\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[Pc\n\x85\xBD\x01`\xE1\x1B\x95\x94PPPPPV[`\0a\x06\xB3\x83\x83a\x05\x86V[\x93\x92PPPV[`\0\x90\x81R`\x01` \x81\x90R`@\x90\x91 \x01T\x90V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07\"W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07F\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07u\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\x92W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xB6\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x07\xE6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x07\xF0a\t\x9CV[`@Qc\xB6:vw`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R\x90\x91P`\x01`\x01`\xA0\x1B\x03\x82\x16\x90c\xB6:vw\x90`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x085W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08IW=`\0\x80>=`\0\xFD[PP`@Qc(\xCD\x10\xC7`\xE1\x1B\x81R`\x04\x81\x01\x85\x90R`\x01`\x01`\xA0\x1B\x03\x84\x16\x92PcQ\x9A!\x8E\x91P`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x08\x8FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08\xA3W=`\0\x80>=`\0\xFD[PPPPPPV[a\x08\xB4\x82a\x06\xBAV[a\x08\xBD\x81a\"\x07V[a\x08\xC7\x83\x83a\"\x11V[PPPV[`\x02T`@\x80Qc\x12\x0E_\x07`\xE3\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x90r\xF88\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\t\x8EW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a\t\x98\x82\x82a\"|V[PPV[`\x02T`@\x80Qc\x16\xF7k\xBF`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x16\xF7k\xBF\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\t\xF6a\"\xE3V[a\n\0`\0a#BV[V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\0\x80a\n_a\x19eV[\x83Q` \x85\x01Q`@Qc?\xF8\x06\x97`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x92c\x7F\xF0\r.\x924\x92a\n\x94\x92`\x04\x01a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\n\xB2W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n\xD7\x91\x90a3jV[\x90P\x82``\x01QQ\x83`@\x01QQ\x14a\x0B\x02W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x82`\xA0\x01QQ\x83`\x80\x01QQ\x14a\x0B+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x82`\xE0\x01QQ\x83`\xC0\x01QQ\x14a\x0BTW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x82a\x01\0\x01QQ\x83`\xC0\x01QQ\x14a\x0B~W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x82a\x01 \x01QQ\x83`\xC0\x01QQ\x14a\x0B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[`@\x83\x01QQ\x15a\x0CtW`\0[\x83`@\x01QQ\x81\x10\x15a\x0CrWa\x0B\xCBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x86`@\x01Q\x84\x81Q\x81\x10a\x0B\xF0Wa\x0B\xF0a6'V[` \x02` \x01\x01Q\x87``\x01Q\x85\x81Q\x81\x10a\x0C\x0EWa\x0C\x0Ea6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0C4\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0CNW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0CbW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0B\xB6\x90PV[P[`\x80\x83\x01QQ\x15a\r@W`\0[\x83`\x80\x01QQ\x81\x10\x15a\r>Wa\x0C\x97a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x86`\x80\x01Q\x84\x81Q\x81\x10a\x0C\xBCWa\x0C\xBCa6'V[` \x02` \x01\x01Q\x87`\xA0\x01Q\x85\x81Q\x81\x10a\x0C\xDAWa\x0C\xDAa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\0\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\x1AW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r.W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0C\x82\x90PV[P[`\xC0\x83\x01QQ\x15a\x0EbW`\0[\x83`\xC0\x01QQ\x81\x10\x15a\x0E`Wa\rca\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x88`\xC0\x01Q\x86\x81Q\x81\x10a\r\x93Wa\r\x93a6'V[` \x02` \x01\x01Q\x81R` \x01\x88`\xE0\x01Q\x86\x81Q\x81\x10a\r\xB6Wa\r\xB6a6'V[` \x02` \x01\x01Q\x81R` \x01\x88a\x01\0\x01Q\x86\x81Q\x81\x10a\r\xDAWa\r\xDAa6'V[` \x02` \x01\x01Q\x81RP\x87a\x01 \x01Q\x85\x81Q\x81\x10a\r\xFCWa\r\xFCa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\"\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0E=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\rN\x90PV[P[`\0a\x0Ela\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\x99\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E\xB6W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xDA\x91\x90a3\x97V[\x90P\x83a\x01@\x01Q\x15a\x0F|Wa\x0E\xEFa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0F*W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0FI\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0FcW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0FwW=`\0\x80>=`\0\xFD[PPPP[\x83a\x01`\x01Q\x15a\x0F\xF5Wa\x0F\x8Fa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\xBE\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0F\xD8W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F\xECW=`\0\x80>=`\0\xFD[PPPPa\x10_V[a\x0F\xFDa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x10,\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x10FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x10ZW=`\0\x80>=`\0\xFD[PPPP[P\x92\x91PPV[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x10\xB8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10\xDC\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x11\x0B\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11(W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11L\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x11|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x11\x86a\t\x9CV[\x82Q\x90\x91P\x15a\x08\xC7W\x80`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x84\x84`\0\x81Q\x81\x10a\x11\xB3Wa\x11\xB3a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x11\xD8\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x11\xF2W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x06W=`\0\x80>=`\0\xFD[PPPP\x80`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x84\x84`\x01\x81Q\x81\x10a\x12-Wa\x12-a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x12R\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x12lW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x80W=`\0\x80>=`\0\xFD[PPPPPPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\0\x91\x82R`\x01` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[\x80Q\x82Q`\0\x91\x14a\x13=W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`>`$\x82\x01R\x7FPKPHelper: Claim key type must m`D\x82\x01R\x7Fatch Auth Method data key type\0\0`d\x82\x01R`\x84\x01a\x06\x8CV[`\x01`\0a\x13Ia\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cq\xAA\x9A\xCF4\x84\x88`\0\x01Q\x89` \x01Q\x8A`@\x01Q\x8B``\x01Q\x8C`\x80\x01Q`@Q\x88c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\x93\x96\x95\x94\x93\x92\x91\x90a7cV[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x13\xB1W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xD6\x91\x90a3jV[\x90P\x83`@\x01QQ\x84` \x01QQ\x14a\x14\x01W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x83`\x80\x01QQ\x84``\x01QQ\x14a\x14*W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x83`\xC0\x01QQ\x84`\xA0\x01QQ\x14a\x14SW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x83`\xE0\x01QQ\x84`\xA0\x01QQ\x14a\x14|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x83a\x01\0\x01QQ\x84`\xA0\x01QQ\x14a\x14\xA6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[` \x84\x01QQ\x15a\x15rW`\0[\x84` \x01QQ\x81\x10\x15a\x15pWa\x14\xC9a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x87` \x01Q\x84\x81Q\x81\x10a\x14\xEEWa\x14\xEEa6'V[` \x02` \x01\x01Q\x88`@\x01Q\x85\x81Q\x81\x10a\x15\x0CWa\x15\x0Ca6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x152\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x15LW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x15`W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x14\xB4\x90PV[P[``\x84\x01QQ\x15a\x16>W`\0[\x84``\x01QQ\x81\x10\x15a\x16=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x15\x80\x90PV[P[`\xA0\x84\x01QQ\x15a\x17_W`\0[\x84`\xA0\x01QQ\x81\x10\x15a\x17]Wa\x16aa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x89`\xA0\x01Q\x86\x81Q\x81\x10a\x16\x91Wa\x16\x91a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xC0\x01Q\x86\x81Q\x81\x10a\x16\xB4Wa\x16\xB4a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xE0\x01Q\x86\x81Q\x81\x10a\x16\xD7Wa\x16\xD7a6'V[` \x02` \x01\x01Q\x81RP\x88a\x01\0\x01Q\x85\x81Q\x81\x10a\x16\xF9Wa\x16\xF9a6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x1F\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x179W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x17MW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x16L\x90PV[P[`\0a\x17ia\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x96\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\xB3W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17\xD7\x91\x90a3\x97V[\x90P\x84a\x01 \x01Q\x15a\x18yWa\x17\xECa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x18'W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18F\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18`W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18tW=`\0\x80>=`\0\xFD[PPPP[\x84a\x01@\x01Q\x15a\x18\xF2Wa\x18\x8Ca\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18\xBB\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18\xD5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18\xE9W=`\0\x80>=`\0\xFD[PPPPa\x19\\V[a\x18\xFAa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x19)\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x19CW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x19WW=`\0\x80>=`\0\xFD[PPPP[P\x94\x93PPPPV[`\x02T`@\x80Qc,\x0B\x8B\xF7`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c,\x0B\x8B\xF7\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\x19\xC0\x82a\x06\xBAV[a\x19\xC9\x81a\"\x07V[a\x08\xC7\x83\x83a\"|V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x1A%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1AI\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x1Ax\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1A\x95W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1A\xB9\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x1A\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x1A\xF3a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16c\x7F\xF0\r.4\x8D\x8D`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1B!\x92\x91\x90a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x1B?W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1Bd\x91\x90a3jV[\x90P\x87Q\x89Q\x14a\x1B\x87W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x86Q\x89Q\x14a\x1B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x85Q\x89Q\x14a\x1B\xC9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[\x88Q\x15a\x1C\xD1W`\0[\x89Q\x81\x10\x15a\x1C\xCFWa\x1B\xE4a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x8E\x86\x81Q\x81\x10a\x1C\x10Wa\x1C\x10a6'V[` \x02` \x01\x01Q\x81R` \x01\x8D\x86\x81Q\x81\x10a\x1C/Wa\x1C/a6'V[` \x02` \x01\x01Q\x81R` \x01\x8C\x86\x81Q\x81\x10a\x1CNWa\x1CNa6'V[` \x02` \x01\x01Q\x81RP\x8A\x85\x81Q\x81\x10a\x1CkWa\x1Cka6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\x91\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1C\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1C\xBFW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x1B\xD3\x90PV[P[`\0a\x1C\xDBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\x08\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1D%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1DI\x91\x90a3\x97V[\x90P\x84\x15a\x1D\xE6Wa\x1DYa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x1D\x94W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\xB3\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1D\xCDW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1D\xE1W=`\0\x80>=`\0\xFD[PPPP[\x83\x15a\x1EZWa\x1D\xF4a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E#\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E=W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1EQW=`\0\x80>=`\0\xFD[PPPPa\x1E\xC4V[a\x1Eba\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E\x91\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1E\xBFW=`\0\x80>=`\0\xFD[PPPP[\x85Q\x15a\x1F\xCEWa\x1E\xD3a\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x83\x88`\0\x81Q\x81\x10a\x1E\xF5Wa\x1E\xF5a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x1A\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F4W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1FHW=`\0\x80>=`\0\xFD[PPPPa\x1FTa\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x83\x88`\x01\x81Q\x81\x10a\x1FvWa\x1Fva6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x9B\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F\xB5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1F\xC9W=`\0\x80>=`\0\xFD[PPPP[P\x9A\x99PPPPPPPPPPV[`\0\x80`@Q\x80a\x01\x80\x01`@R\x80\x8B\x81R` \x01\x8A\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x81\x11\x15a \x11Wa \x11a%\xD6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a DW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a /W\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \x7FW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a jW\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xB0W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xEBW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a \xD6W\x90P[P\x81R` \x01\x89\x81R` \x01\x88\x81R` \x01\x87\x81R` \x01\x86\x81R` \x01\x85\x15\x15\x81R` \x01\x84\x15\x15\x81RP\x90Pa!\"\x81a\nTV[\x9A\x99PPPPPPPPPPV[a!8a\"\xE3V[`\x01`\x01`\xA0\x1B\x03\x81\x16a!\x9DW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`&`$\x82\x01R\x7FOwnable: new owner is the zero a`D\x82\x01Reddress`\xD0\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a!\xA6\x81a#BV[PV[a!\xB1a\"\xE3V[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x17\x90U`@Q\x7F'`\x07<|\xD8\xCA\xC51\xD7\xF6C\xBE\xCB\xFB\xB7M\x8B\x81VD>\xAC\xF8yb%2\xDB\xBB<\xD5\x90a!\xFC\x90\x83\x90a%\xC2V[`@Q\x80\x91\x03\x90\xA1PV[a!\xA6\x813a#\x92V[a\"\x1B\x82\x82a\x12\x98V[a\t\x98W`\0\x82\x81R`\x01` \x81\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x86\x16\x80\x86R\x92R\x80\x84 \x80T`\xFF\x19\x16\x90\x93\x17\x90\x92U\x90Q3\x92\x85\x91\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r\x91\x90\xA4PPV[a\"\x86\x82\x82a\x12\x98V[\x15a\t\x98W`\0\x82\x81R`\x01` \x90\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[3a\"\xECa\x12\x89V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\n\0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FOwnable: caller is not the owner`D\x82\x01R`d\x01a\x06\x8CV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[a#\x9C\x82\x82a\x12\x98V[a\t\x98Wa#\xA9\x81a#\xEBV[a#\xB4\x83` a#\xFDV[`@Q` \x01a#\xC5\x92\x91\x90a8\x03V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x06\x8C\x91`\x04\x01a8rV[``a\x04\x95`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a$\x0C\x83`\x02a8\x9BV[a$\x17\x90`\x02a8\xB2V[`\x01`\x01`@\x1B\x03\x81\x11\x15a$.Wa$.a%\xD6V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a$XW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a$sWa$sa6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a$\xA2Wa$\xA2a6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a$\xC6\x84`\x02a8\x9BV[a$\xD1\x90`\x01a8\xB2V[\x90P[`\x01\x81\x11\x15a%IWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a%\x05Wa%\x05a6'V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a%\x1BWa%\x1Ba6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a%B\x81a8\xC5V[\x90Pa$\xD4V[P\x83\x15a\x06\xB3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x06\x8CV[`\0` \x82\x84\x03\x12\x15a%\xAAW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x06\xB3W`\0\x80\xFD[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@R\x90V[`@Qa\x01`\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Qa\x01\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\xA4Wa&\xA4a%\xD6V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a&\xC5Wa&\xC5a%\xD6V[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a&\xE0W`\0\x80\xFD[\x815a&\xF3a&\xEE\x82a&\xACV[a&|V[\x80\x82\x82R` \x82\x01\x91P` ``\x84\x02\x86\x01\x01\x92P\x85\x83\x11\x15a'\x15W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW``\x81\x88\x03\x12\x15a'2W`\0\x80\xFD[a':a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\xFF\x81\x16\x81\x14a'\\W`\0\x80\xFD[`@\x82\x01R\x83R` \x90\x92\x01\x91``\x01a'\x1AV[P\x95\x94PPPPPV[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a'\x95Wa'\x95a%\xD6V[P`\x1F\x83\x01`\x1F\x19\x16` \x01a'\xAA\x81a&|V[\x91PP\x82\x81R\x83\x83\x83\x01\x11\x15a'\xBFW`\0\x80\xFD[\x82\x82` \x83\x017`\0` \x84\x83\x01\x01R\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a'\xE7W`\0\x80\xFD[\x815a'\xF5a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\x17W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a(:W`\0\x80\xFD[\x86\x01`?\x81\x01\x88\x13a(KW`\0\x80\xFD[a(]\x88` \x83\x015`@\x84\x01a'{V[\x84RP` \x92\x83\x01\x92\x01a(\x1CV[`\0\x82`\x1F\x83\x01\x12a(}W`\0\x80\xFD[\x815a(\x8Ba&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\xADW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805\x83R` \x92\x83\x01\x92\x01a(\xB2V[`\0\x82`\x1F\x83\x01\x12a(\xDBW`\0\x80\xFD[\x815a(\xE9a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\x0BW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a).W`\0\x80\xFD[a)=\x88` \x83\x8A\x01\x01a(lV[\x84RP` \x92\x83\x01\x92\x01a)\x10V[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a!\xA6W`\0\x80\xFD[`\0\x82`\x1F\x83\x01\x12a)rW`\0\x80\xFD[\x815a)\x80a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\xA2W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805a)\xBA\x81a)LV[\x83R` \x92\x83\x01\x92\x01a)\xA7V[\x805\x80\x15\x15\x81\x14a)\xD8W`\0\x80\xFD[\x91\x90PV[`\0a\x01`\x82\x84\x03\x12\x15a)\xF0W`\0\x80\xFD[a)\xF8a&\x14V[\x825\x81R\x90P` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x17W`\0\x80\xFD[a*#\x84\x82\x85\x01a'\xD6V[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*BW`\0\x80\xFD[a*N\x84\x82\x85\x01a(\xCAV[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*mW`\0\x80\xFD[a*y\x84\x82\x85\x01a)aV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x98W`\0\x80\xFD[a*\xA4\x84\x82\x85\x01a(\xCAV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xC3W`\0\x80\xFD[a*\xCF\x84\x82\x85\x01a(lV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xEEW`\0\x80\xFD[a*\xFA\x84\x82\x85\x01a'\xD6V[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\x19W`\0\x80\xFD[a+%\x84\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+EW`\0\x80\xFD[a+Q\x84\x82\x85\x01a(\xCAV[a\x01\0\x83\x01RPa+ea\x01 \x83\x01a)\xC8V[a\x01 \x82\x01Ra+xa\x01@\x83\x01a)\xC8V[a\x01@\x82\x01R\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15a+\x97W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xADW`\0\x80\xFD[\x83\x01``\x81\x86\x03\x12\x15a+\xBFW`\0\x80\xFD[a+\xC7a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xEEW`\0\x80\xFD[a+\xFA\x87\x82\x85\x01a&\xCFV[`@\x83\x01RP\x92PP` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[a,(\x85\x82\x86\x01a)\xDDV[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80`\0`\x80\x86\x88\x03\x12\x15a,JW`\0\x80\xFD[\x855a,U\x81a)LV[\x94P` \x86\x015a,e\x81a)LV[\x93P`@\x86\x015\x92P``\x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x87W`\0\x80\xFD[\x86\x01`\x1F\x81\x01\x88\x13a,\x98W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a,\xAEW`\0\x80\xFD[\x88` \x82\x84\x01\x01\x11\x15a,\xC0W`\0\x80\xFD[\x95\x98\x94\x97P\x92\x95PPP` \x01\x91\x90V[`\0` \x82\x84\x03\x12\x15a,\xE3W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a,\xFDW`\0\x80\xFD[\x825\x91P` \x83\x015a-\x0F\x81a)LV[\x80\x91PP\x92P\x92\x90PV[`\0\x82`\x1F\x83\x01\x12a-+W`\0\x80\xFD[a\x06\xB3\x83\x835` \x85\x01a'{V[`\0` \x82\x84\x03\x12\x15a-LW`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a-bW`\0\x80\xFD[\x82\x01a\x01\x80\x81\x85\x03\x12\x15a-uW`\0\x80\xFD[a-}a&7V[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\x9AW`\0\x80\xFD[a-\xA6\x86\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xC5W`\0\x80\xFD[a-\xD1\x86\x82\x85\x01a'\xD6V[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xF0W`\0\x80\xFD[a-\xFC\x86\x82\x85\x01a(\xCAV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x1BW`\0\x80\xFD[a.'\x86\x82\x85\x01a)aV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.FW`\0\x80\xFD[a.R\x86\x82\x85\x01a(\xCAV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.qW`\0\x80\xFD[a.}\x86\x82\x85\x01a(lV[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x9CW`\0\x80\xFD[a.\xA8\x86\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xC8W`\0\x80\xFD[a.\xD4\x86\x82\x85\x01a'\xD6V[a\x01\0\x83\x01RPa\x01 \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xF5W`\0\x80\xFD[a/\x01\x86\x82\x85\x01a(\xCAV[a\x01 \x83\x01RPa/\x15a\x01@\x83\x01a)\xC8V[a\x01@\x82\x01Ra/(a\x01`\x83\x01a)\xC8V[a\x01`\x82\x01R\x94\x93PPPPV[`\0\x82`\x1F\x83\x01\x12a/GW`\0\x80\xFD[\x815a/Ua&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a/wW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a/\x9AW`\0\x80\xFD[a/\xA9\x88` \x83\x8A\x01\x01a-\x1AV[\x84RP` \x92\x83\x01\x92\x01a/|V[`\0\x80`@\x83\x85\x03\x12\x15a/\xCBW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a/\xE8W`\0\x80\xFD[a,(\x85\x82\x86\x01a/6V[`\0\x80`@\x83\x85\x03\x12\x15a0\x07W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x1DW`\0\x80\xFD[\x83\x01`\xA0\x81\x86\x03\x12\x15a0/W`\0\x80\xFD[a07a&ZV[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0TW`\0\x80\xFD[a0`\x87\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x81\x015\x90\x82\x01R``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x89W`\0\x80\xFD[a0\x95\x87\x82\x85\x01a&\xCFV[``\x83\x01RP`\x80\x82\x015\x91Pa0\xAB\x82a)LV[`\x80\x81\x01\x91\x90\x91R\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[`\x03\x81\x10a0\xECWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x04\x95\x82\x84a0\xCEV[`\0\x80`\0\x80`\0\x80`\0\x80`\0a\x01 \x8A\x8C\x03\x12\x15a1\x1DW`\0\x80\xFD[\x895\x98P` \x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1:W`\0\x80\xFD[a1F\x8C\x82\x8D\x01a-\x1AV[\x98PP`@\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1bW`\0\x80\xFD[a1n\x8C\x82\x8D\x01a(lV[\x97PP``\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\x8AW`\0\x80\xFD[a1\x96\x8C\x82\x8D\x01a'\xD6V[\x96PP`\x80\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xB2W`\0\x80\xFD[a1\xBE\x8C\x82\x8D\x01a'\xD6V[\x95PP`\xA0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xDAW`\0\x80\xFD[a1\xE6\x8C\x82\x8D\x01a(\xCAV[\x94PP`\xC0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x02W`\0\x80\xFD[a2\x0E\x8C\x82\x8D\x01a/6V[\x93PPa2\x1D`\xE0\x8B\x01a)\xC8V[\x91Pa2,a\x01\0\x8B\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98P\x92\x95\x98V[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15a2XW`\0\x80\xFD[\x885\x97P` \x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2uW`\0\x80\xFD[a2\x81\x8B\x82\x8C\x01a-\x1AV[\x97PP`@\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x9DW`\0\x80\xFD[a2\xA9\x8B\x82\x8C\x01a(lV[\x96PP``\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xC5W`\0\x80\xFD[a2\xD1\x8B\x82\x8C\x01a'\xD6V[\x95PP`\x80\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xEDW`\0\x80\xFD[a2\xF9\x8B\x82\x8C\x01a'\xD6V[\x94PP`\xA0\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a3\x15W`\0\x80\xFD[a3!\x8B\x82\x8C\x01a(\xCAV[\x93PPa30`\xC0\x8A\x01a)\xC8V[\x91Pa3>`\xE0\x8A\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[`\0` \x82\x84\x03\x12\x15a3_W`\0\x80\xFD[\x815a\x06\xB3\x81a)LV[`\0` \x82\x84\x03\x12\x15a3|W`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xB3` \x83\x01\x84a0\xCEV[`\0` \x82\x84\x03\x12\x15a3\xA9W`\0\x80\xFD[\x81Qa\x06\xB3\x81a)LV[` \x80\x82R`Z\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rymain wallets, who are you?`0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\0[\x83\x81\x10\x15a4OW\x81\x81\x01Q\x83\x82\x01R` \x01a47V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra4p\x81` \x86\x01` \x86\x01a44V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x81R`@` \x82\x01R`\0a\x05\xFB`@\x83\x01\x84a4XV[` \x80\x82R`6\x90\x82\x01R\x7FPKPHelper: ipfs cid and scope ar`@\x82\x01Ru\x0EL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`S\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`5\x90\x82\x01R\x7FPKPHelper: address and scope arr`@\x82\x01Rt\x0C/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`[\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`;\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01Rz\r,\x84\x0C.NL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`+\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fpubkey array lengths must match\0``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fscopes array lengths must match\0``\x82\x01R`\x80\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81Q\x80\x84R` \x84\x01\x93P` \x83\x01`\0[\x82\x81\x10\x15a6oW\x81Q\x86R` \x95\x86\x01\x95\x90\x91\x01\x90`\x01\x01a6QV[P\x93\x94\x93PPPPV[\x83\x81R``` \x82\x01R`\0a6\x92``\x83\x01\x85a4XV[\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[\x96\x95PPPPPPV[\x83\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R```@\x82\x01\x81\x90R`\0\x90a6\xD8\x90\x83\x01\x84a6=V[\x95\x94PPPPPV[\x83\x81R``` \x82\x01R\x82Q``\x82\x01R`\0` \x84\x01Q```\x80\x84\x01Ra7\r`\xC0\x84\x01\x82a4XV[\x90P`@\x85\x01Q`_\x19\x84\x83\x03\x01`\xA0\x85\x01Ra7*\x82\x82a4XV[\x91PP\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x81R\x91\x90\x92\x16` \x82\x01R`@\x81\x01\x91\x90\x91R``\x01\x90V[\x86\x81R\x85` \x82\x01R`\xC0`@\x82\x01R`\0a7\x82`\xC0\x83\x01\x87a4XV[``\x83\x01\x86\x90R\x82\x81\x03`\x80\x84\x01R\x84Q\x80\x82R` \x80\x87\x01\x92\x01\x90`\0[\x81\x81\x10\x15a7\xDEW\x83Q\x80Q\x84R` \x81\x01Q` \x85\x01R`\xFF`@\x82\x01Q\x16`@\x85\x01RP``\x83\x01\x92P` \x84\x01\x93P`\x01\x81\x01\x90Pa7\xA1V[PP`\x01`\x01`\xA0\x1B\x03\x85\x16`\xA0\x85\x01R\x91Pa7\xF8\x90PV[\x97\x96PPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa85\x81`\x17\x85\x01` \x88\x01a44V[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa8f\x81`(\x84\x01` \x88\x01a44V[\x01`(\x01\x94\x93PPPPV[` \x81R`\0a\x06\xB3` \x83\x01\x84a4XV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x04\x95Wa\x04\x95a8\x85V[\x80\x82\x01\x80\x82\x11\x15a\x04\x95Wa\x04\x95a8\x85V[`\0\x81a8\xD4Wa8\xD4a8\x85V[P`\0\x19\x01\x90V\xFEPKPHelper: auth method type and \xA2dipfsX\"\x12 n\xD3\xA9v]n{\x1D\x8Fu`\xE6\xB2v\x01r\xCEl\xF0\xF5`Q\x8A\x13/\xC0\xCD\x9F\x1AX\xB8\xF8dsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static PKPHELPER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __DEPLOYED_BYTECODE, diff --git a/rust/lit-core/lit-blockchain-lite/src/contracts/pkpnft_metadata.rs b/rust/lit-core/lit-blockchain-lite/src/contracts/pkpnft_metadata.rs index 1dec6bcc..8f315c8f 100644 --- a/rust/lit-core/lit-blockchain-lite/src/contracts/pkpnft_metadata.rs +++ b/rust/lit-core/lit-blockchain-lite/src/contracts/pkpnft_metadata.rs @@ -278,13 +278,13 @@ pub mod pkpnft_metadata { __abi, ); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15`\x0FW`\0\x80\xFD[P`@Qa\x1C}8\x03\x80a\x1C}\x839\x81\x01`@\x81\x90R`,\x91`vV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x84\x16`\x01`\x01`\xA0\x1B\x03\x19\x82\x16\x81\x17\x83U\x83\x92\x91`\x01`\x01`\xA8\x1B\x03\x19\x16\x17`\x01`\xA0\x1B\x83`\x02\x81\x11\x15`kW`k`\xBDV[\x02\x17\x90UPPP`\xD3V[`\0\x80`@\x83\x85\x03\x12\x15`\x88W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14`\x9EW`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x03\x81\x10`\xB2W`\0\x80\xFD[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[a\x1B\x9B\x80a\0\xE2`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0xW`\x005`\xE0\x1C\x80cE\x1D\x89\xFA\x14a\0}W\x80cP\xD1{^\x14a\0\xA6W\x80cQ\x9A!\x8E\x14a\0\xD1W\x80c\x85^\xEC\"\x14a\0\xE6W\x80c\x90\0\xFE\xE1\x14a\0\xF9W\x80c\x95\x04b\xEE\x14a\x01\x0CW\x80c\x9D\xCA\x002\x14a\x01\x1FW\x80c\xB6:vw\x14a\x01@W[`\0\x80\xFD[a\0\x90a\0\x8B6`\x04a\x0F\xB0V[a\x01SV[`@Qa\0\x9D\x91\x90a\x10\x10V[`@Q\x80\x91\x03\x90\xF3[`\0Ta\0\xB9\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\x9DV[a\0\xE4a\0\xDF6`\x04a\x10CV[a\x03\x0CV[\0[a\0\xE4a\0\xF46`\x04a\x10\\V[a\x04VV[a\0\xE4a\x01\x076`\x04a\x10\\V[a\x05\x89V[a\0\x90a\x01\x1A6`\x04a\x10\xCEV[a\x06\xB7V[`\0Ta\x013\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\x9D\x91\x90a\x11JV[a\0\xE4a\x01N6`\x04a\x10CV[a\x06\xF3V[```\0\x82Q`\x02a\x01e\x91\x90a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x01|Wa\x01|a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x01\xA6W` \x82\x01\x81\x806\x837\x01\x90P[P`@\x80Q\x80\x82\x01\x90\x91R`\x10\x81Ro\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B` \x82\x01R\x90\x91P`\0[\x84Q\x81\x10\x15a\x02\xE2W\x81\x82Q\x86\x83\x81Q\x81\x10a\x01\xF2Wa\x01\xF2a\x11\x85V[\x01` \x01Qa\x02\x04\x91\x90`\xF8\x1Ca\x11\xB1V[\x81Q\x81\x10a\x02\x14Wa\x02\x14a\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02/\x83`\x02a\x11nV[\x81Q\x81\x10a\x02?Wa\x02?a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP\x81\x82Q\x86\x83\x81Q\x81\x10a\x02kWa\x02ka\x11\x85V[\x01` \x01Qa\x02}\x91\x90`\xF8\x1Ca\x11\xC5V[\x81Q\x81\x10a\x02\x8DWa\x02\x8Da\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02\xA8\x83`\x02a\x11nV[a\x02\xB3\x90`\x01a\x11\xD9V[\x81Q\x81\x10a\x02\xC3Wa\x02\xC3a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x01\x01a\x01\xD4V[P\x81`@Q` \x01a\x02\xF4\x91\x90a\x12\x08V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92PPP\x91\x90PV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x03^W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\x82\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x03\xB1\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xCEW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xF2\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x04+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@Q\x80\x91\x03\x90\xFD[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x01\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[PPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xA8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xCC\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x04\xFB\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05\x18W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05<\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x05lW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x01` R`@\x90 a\x05\x84\x82\x82a\x13vV[PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x05\xDBW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\xFF\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x06.\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06KW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06o\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x9FW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x02` R`@\x90 a\x05\x84\x82\x82a\x13vV[```\0a\x06\xC6\x85\x85\x85a\x080V[\x90P\x80`@Q` \x01a\x06\xD9\x91\x90a\x144V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP[\x93\x92PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07EW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07i\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07\x98\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xB5W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xD9\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\tW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x02\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[```\0`@Q\x80a\x04\x80\x01`@R\x80a\x04V\x81R` \x01a\x16\xD0a\x04V\x919\x90P`\0a\x08]\x85a\x01SV[\x90P`\0a\x08j\x85a\n\x84V[\x90P`\0a\x08w\x88a\n\xA0V[`\0\x89\x81R`\x01` R`@\x81 \x80T\x92\x93P\x90\x91a\x08\x95\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x08\xC1\x90a\x12\xEEV[\x80\x15a\t\x0EW\x80`\x1F\x10a\x08\xE3Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\x0EV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x08\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P`\0`\x02`\0\x8B\x81R` \x01\x90\x81R` \x01`\0 \x80Ta\t5\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\ta\x90a\x12\xEEV[\x80\x15a\t\xAEW\x80`\x1F\x10a\t\x83Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\xAEV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\t\x91W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x81Q`\0\x14\x80\x15a\t\xC6WP\x80Q\x15\x15[\x15a\t\xF2W\x82`@Q` \x01a\t\xDC\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91Pa\nFV[\x81Q\x15\x80\x15\x90a\n\x01WP\x80Q\x15[\x15a\n\rWP\x84a\nFV[\x81Q\x15\x80\x15a\n\x1BWP\x80Q\x15[\x15a\nFW\x82`@Q` \x01a\n1\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P\x85\x90P[a\nv\x82\x82\x87\x87\x87`@Q` \x01a\nb\x95\x94\x93\x92\x91\x90a\x14\xAAV[`@Q` \x81\x83\x03\x03\x81R\x90`@Ra\x0B2V[\x9A\x99PPPPPPPPPPV[``a\n\x9A`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14a\x0C\x91V[\x92\x91PPV[```\0a\n\xAD\x83a\x0E,V[`\x01\x01\x90P`\0\x81`\x01`\x01`@\x1B\x03\x81\x11\x15a\n\xCCWa\n\xCCa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\n\xF6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P\x81\x81\x01` \x01[`\0\x19\x01o\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B`\n\x86\x06\x1A\x81S`\n\x85\x04\x94P\x84a\x0B\0WP\x93\x92PPPV[``\x81Q`\0\x03a\x0BQWPP`@\x80Q` \x81\x01\x90\x91R`\0\x81R\x90V[`\0`@Q\x80``\x01`@R\x80`@\x81R` \x01a\x1B&`@\x919\x90P`\0`\x03\x84Q`\x02a\x0B\x80\x91\x90a\x11\xD9V[a\x0B\x8A\x91\x90a\x11\xB1V[a\x0B\x95\x90`\x04a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xACWa\x0B\xACa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0B\xD6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x01\x82\x01` \x82\x01\x85\x86Q\x87\x01` \x81\x01\x80Q`\0\x82R[\x82\x84\x10\x15a\x0CLW`\x03\x84\x01\x93P\x83Q`?\x81`\x12\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x0C\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x06\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81\x16\x87\x01Q\x86SP`\x01\x85\x01\x94Pa\x0B\xF1V[\x90RPP\x85Q`\x03\x90\x06`\x01\x81\x14a\x0CkW`\x02\x81\x14a\x0C~Wa\x0C\x86V[`=`\x01\x83\x03S`=`\x02\x83\x03Sa\x0C\x86V[`=`\x01\x83\x03S[P\x91\x95\x94PPPPPV[```\0a\x0C\xA0\x83`\x02a\x11nV[a\x0C\xAB\x90`\x02a\x11\xD9V[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0C\xC2Wa\x0C\xC2a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0C\xECW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\x07Wa\r\x07a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r6Wa\r6a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\rZ\x84`\x02a\x11nV[a\re\x90`\x01a\x11\xD9V[\x90P[`\x01\x81\x11\x15a\r\xDDWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\r\x99Wa\r\x99a\x11\x85V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\r\xAFWa\r\xAFa\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\r\xD6\x81a\x16\xB8V[\x90Pa\rhV[P\x83\x15a\x06\xECW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x04\"V[`\0\x80r\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x10a\x0EkWr\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x04\x92P`@\x01[i\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x10a\x0E\x95Wi\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x04\x92P` \x01[f#\x86\xF2o\xC1\0\0\x83\x10a\x0E\xB3Wf#\x86\xF2o\xC1\0\0\x83\x04\x92P`\x10\x01[c\x05\xF5\xE1\0\x83\x10a\x0E\xCBWc\x05\xF5\xE1\0\x83\x04\x92P`\x08\x01[a'\x10\x83\x10a\x0E\xDFWa'\x10\x83\x04\x92P`\x04\x01[`d\x83\x10a\x0E\xF1W`d\x83\x04\x92P`\x02\x01[`\n\x83\x10a\n\x9AW`\x01\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a\x0F2Wa\x0F2a\x0F\x02V[P`@Q`\x1F\x19`\x1F\x85\x01\x81\x16`?\x01\x16\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a\x0F`Wa\x0F`a\x0F\x02V[`@R\x83\x81R\x90P\x80\x82\x84\x01\x85\x10\x15a\x0FxW`\0\x80\xFD[\x83\x83` \x83\x017`\0` \x85\x83\x01\x01RP\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a\x0F\xA1W`\0\x80\xFD[a\x06\xEC\x83\x835` \x85\x01a\x0F\x18V[`\0` \x82\x84\x03\x12\x15a\x0F\xC2W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0F\xD8W`\0\x80\xFD[a\x0F\xE4\x84\x82\x85\x01a\x0F\x90V[\x94\x93PPPPV[`\0[\x83\x81\x10\x15a\x10\x07W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0F\xEFV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x10/\x81`@\x85\x01` \x87\x01a\x0F\xECV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x10UW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x10oW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x10\x8CW`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a\x10\x9DW`\0\x80\xFD[a\x10\xAC\x85\x825` \x84\x01a\x0F\x18V[\x91PP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x10\xCBW`\0\x80\xFD[PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x10\xE3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x11\0W`\0\x80\xFD[a\x11\x0C\x86\x82\x87\x01a\x0F\x90V[\x92PP`@\x84\x015a\x11\x1D\x81a\x10\xB6V[\x80\x91PP\x92P\x92P\x92V[`\x03\x81\x10a\x11FWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\n\x9A\x82\x84a\x11(V[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\n\x9AWa\n\x9Aa\x11XV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a\x11\xC0Wa\x11\xC0a\x11\x9BV[P\x04\x90V[`\0\x82a\x11\xD4Wa\x11\xD4a\x11\x9BV[P\x06\x90V[\x80\x82\x01\x80\x82\x11\x15a\n\x9AWa\n\x9Aa\x11XV[`\0\x81Qa\x11\xFE\x81\x85` \x86\x01a\x0F\xECV[\x92\x90\x92\x01\x92\x91PPV[a\x06\x0F`\xF3\x1B\x81R`\0\x82Qa\x12%\x81`\x02\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x02\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x12DW`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xEC` \x83\x01\x84a\x11(V[`\0` \x82\x84\x03\x12\x15a\x12qW`\0\x80\xFD[\x81Qa\x06\xEC\x81a\x10\xB6V[` \x80\x82R`L\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rkmain wallets`\xA0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x13\x02W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x13\"WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x05\x84W\x80`\0R` `\0 `\x1F\x84\x01`\x05\x1C\x81\x01` \x85\x10\x15a\x13OWP\x80[`\x1F\x84\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a\x13oW`\0\x81U`\x01\x01a\x13[V[PPPPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\x13\x8FWa\x13\x8Fa\x0F\x02V[a\x13\xA3\x81a\x13\x9D\x84Ta\x12\xEEV[\x84a\x13(V[` `\x1F\x82\x11`\x01\x81\x14a\x13\xD7W`\0\x83\x15a\x13\xBFWP\x84\x82\x01Q[`\0\x19`\x03\x85\x90\x1B\x1C\x19\x16`\x01\x84\x90\x1B\x17\x84Ua\x13oV[`\0\x84\x81R` \x81 `\x1F\x19\x85\x16\x91[\x82\x81\x10\x15a\x14\x07W\x87\x85\x01Q\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01a\x13\xE7V[P\x84\x82\x10\x15a\x14%W\x86\x84\x01Q`\0\x19`\x03\x87\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPP`\x01\x90\x81\x1B\x01\x90UPV[\x7Fdata:application/json;base64,\0\0\0\x81R`\0\x82Qa\x14l\x81`\x1D\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x1D\x01\x92\x91PPV[hLit PKP #`\xB8\x1B\x81R`\0\x82Qa\x14\x9D\x81`\t\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\t\x01\x92\x91PPV[h=\x9170\xB6\xB2\x91\x1D\x11`\xB9\x1B\x81R\x85Q`\0\x90a\x14\xCF\x81`\t\x85\x01` \x8B\x01a\x0F\xECV[\x7F\", \"description\": \"This NFT enti`\t\x91\x84\x01\x91\x82\x01R\x7Ftles the holder to use a Lit Pro`)\x82\x01R\x7Ftocol PKP, and to grant access t`I\x82\x01R\x7Fo other users and Lit Actions to`i\x82\x01R\x7F use this PKP\",\"image_data\": \"\0\0`\x89\x82\x01R\x86Qa\x15\xA4\x81`\xA7\x84\x01` \x8B\x01a\x0F\xECV[`\t\x81\x83\x01\x01\x91PP\x7F\",\"attributes\": [{\"trait_type\": `\x9E\x82\x01Rw\x11(:\xB164\xB1\x90%\xB2\xBC\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`A\x1B`\xBE\x82\x01Ra\x16\xACa\x16\x9Ca\x16\x96a\x16[a\x16Ua\x16\x10`\xD6\x87\x01\x8Ca\x11\xECV[\x7F\"}, {\"trait_type\": \"ETH Wallet A\x81Rr2292\xB9\xB9\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`i\x1B` \x82\x01R`3\x01\x90V[\x89a\x11\xECV[\x7F\"}, {\"trait_type\": \"Token ID\", \"\x81Rh;0\xB6:\xB2\x91\x1D\x10\x11`\xB9\x1B` \x82\x01R`)\x01\x90V[\x86a\x11\xECV[c\"}]}`\xE0\x1B\x81R`\x04\x01\x90V[\x98\x97PPPPPPPPV[`\0\x81a\x16\xC7Wa\x16\xC7a\x11XV[P`\0\x19\x01\x90V\xFEABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\xA2dipfsX\"\x12 \x8F\x13\x99\xB0\x85\xBF\xFD\xE0ex\xF1\xDD\x04\xAD6!~\xEDG\xFB\xA0mu\xA3\x1F\\\xE9\xE6qQx\x82dsolcC\0\x08\x1C\x003"; + const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15`\x0FW`\0\x80\xFD[P`@Qa\x1C}8\x03\x80a\x1C}\x839\x81\x01`@\x81\x90R`,\x91`vV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x84\x16`\x01`\x01`\xA0\x1B\x03\x19\x82\x16\x81\x17\x83U\x83\x92\x91`\x01`\x01`\xA8\x1B\x03\x19\x16\x17`\x01`\xA0\x1B\x83`\x02\x81\x11\x15`kW`k`\xBDV[\x02\x17\x90UPPP`\xD3V[`\0\x80`@\x83\x85\x03\x12\x15`\x88W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14`\x9EW`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x03\x81\x10`\xB2W`\0\x80\xFD[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[a\x1B\x9B\x80a\0\xE2`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0xW`\x005`\xE0\x1C\x80cE\x1D\x89\xFA\x14a\0}W\x80cP\xD1{^\x14a\0\xA6W\x80cQ\x9A!\x8E\x14a\0\xD1W\x80c\x85^\xEC\"\x14a\0\xE6W\x80c\x90\0\xFE\xE1\x14a\0\xF9W\x80c\x95\x04b\xEE\x14a\x01\x0CW\x80c\x9D\xCA\x002\x14a\x01\x1FW\x80c\xB6:vw\x14a\x01@W[`\0\x80\xFD[a\0\x90a\0\x8B6`\x04a\x0F\xB0V[a\x01SV[`@Qa\0\x9D\x91\x90a\x10\x10V[`@Q\x80\x91\x03\x90\xF3[`\0Ta\0\xB9\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\x9DV[a\0\xE4a\0\xDF6`\x04a\x10CV[a\x03\x0CV[\0[a\0\xE4a\0\xF46`\x04a\x10\\V[a\x04VV[a\0\xE4a\x01\x076`\x04a\x10\\V[a\x05\x89V[a\0\x90a\x01\x1A6`\x04a\x10\xCEV[a\x06\xB7V[`\0Ta\x013\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\x9D\x91\x90a\x11JV[a\0\xE4a\x01N6`\x04a\x10CV[a\x06\xF3V[```\0\x82Q`\x02a\x01e\x91\x90a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x01|Wa\x01|a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x01\xA6W` \x82\x01\x81\x806\x837\x01\x90P[P`@\x80Q\x80\x82\x01\x90\x91R`\x10\x81Ro\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B` \x82\x01R\x90\x91P`\0[\x84Q\x81\x10\x15a\x02\xE2W\x81\x82Q\x86\x83\x81Q\x81\x10a\x01\xF2Wa\x01\xF2a\x11\x85V[\x01` \x01Qa\x02\x04\x91\x90`\xF8\x1Ca\x11\xB1V[\x81Q\x81\x10a\x02\x14Wa\x02\x14a\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02/\x83`\x02a\x11nV[\x81Q\x81\x10a\x02?Wa\x02?a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP\x81\x82Q\x86\x83\x81Q\x81\x10a\x02kWa\x02ka\x11\x85V[\x01` \x01Qa\x02}\x91\x90`\xF8\x1Ca\x11\xC5V[\x81Q\x81\x10a\x02\x8DWa\x02\x8Da\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02\xA8\x83`\x02a\x11nV[a\x02\xB3\x90`\x01a\x11\xD9V[\x81Q\x81\x10a\x02\xC3Wa\x02\xC3a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x01\x01a\x01\xD4V[P\x81`@Q` \x01a\x02\xF4\x91\x90a\x12\x08V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92PPP\x91\x90PV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x03^W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\x82\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x03\xB1\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xCEW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xF2\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x04+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@Q\x80\x91\x03\x90\xFD[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x01\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[PPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xA8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xCC\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x04\xFB\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05\x18W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05<\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x05lW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x01` R`@\x90 a\x05\x84\x82\x82a\x13vV[PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x05\xDBW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\xFF\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x06.\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06KW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06o\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x9FW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x02` R`@\x90 a\x05\x84\x82\x82a\x13vV[```\0a\x06\xC6\x85\x85\x85a\x080V[\x90P\x80`@Q` \x01a\x06\xD9\x91\x90a\x144V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP[\x93\x92PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07EW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07i\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07\x98\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xB5W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xD9\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\tW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x02\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[```\0`@Q\x80a\x04\x80\x01`@R\x80a\x04V\x81R` \x01a\x16\xD0a\x04V\x919\x90P`\0a\x08]\x85a\x01SV[\x90P`\0a\x08j\x85a\n\x84V[\x90P`\0a\x08w\x88a\n\xA0V[`\0\x89\x81R`\x01` R`@\x81 \x80T\x92\x93P\x90\x91a\x08\x95\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x08\xC1\x90a\x12\xEEV[\x80\x15a\t\x0EW\x80`\x1F\x10a\x08\xE3Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\x0EV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x08\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P`\0`\x02`\0\x8B\x81R` \x01\x90\x81R` \x01`\0 \x80Ta\t5\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\ta\x90a\x12\xEEV[\x80\x15a\t\xAEW\x80`\x1F\x10a\t\x83Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\xAEV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\t\x91W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x81Q`\0\x14\x80\x15a\t\xC6WP\x80Q\x15\x15[\x15a\t\xF2W\x82`@Q` \x01a\t\xDC\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91Pa\nFV[\x81Q\x15\x80\x15\x90a\n\x01WP\x80Q\x15[\x15a\n\rWP\x84a\nFV[\x81Q\x15\x80\x15a\n\x1BWP\x80Q\x15[\x15a\nFW\x82`@Q` \x01a\n1\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P\x85\x90P[a\nv\x82\x82\x87\x87\x87`@Q` \x01a\nb\x95\x94\x93\x92\x91\x90a\x14\xAAV[`@Q` \x81\x83\x03\x03\x81R\x90`@Ra\x0B2V[\x9A\x99PPPPPPPPPPV[``a\n\x9A`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14a\x0C\x91V[\x92\x91PPV[```\0a\n\xAD\x83a\x0E,V[`\x01\x01\x90P`\0\x81`\x01`\x01`@\x1B\x03\x81\x11\x15a\n\xCCWa\n\xCCa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\n\xF6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P\x81\x81\x01` \x01[`\0\x19\x01o\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B`\n\x86\x06\x1A\x81S`\n\x85\x04\x94P\x84a\x0B\0WP\x93\x92PPPV[``\x81Q`\0\x03a\x0BQWPP`@\x80Q` \x81\x01\x90\x91R`\0\x81R\x90V[`\0`@Q\x80``\x01`@R\x80`@\x81R` \x01a\x1B&`@\x919\x90P`\0`\x03\x84Q`\x02a\x0B\x80\x91\x90a\x11\xD9V[a\x0B\x8A\x91\x90a\x11\xB1V[a\x0B\x95\x90`\x04a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xACWa\x0B\xACa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0B\xD6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x01\x82\x01` \x82\x01\x85\x86Q\x87\x01` \x81\x01\x80Q`\0\x82R[\x82\x84\x10\x15a\x0CLW`\x03\x84\x01\x93P\x83Q`?\x81`\x12\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x0C\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x06\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81\x16\x87\x01Q\x86SP`\x01\x85\x01\x94Pa\x0B\xF1V[\x90RPP\x85Q`\x03\x90\x06`\x01\x81\x14a\x0CkW`\x02\x81\x14a\x0C~Wa\x0C\x86V[`=`\x01\x83\x03S`=`\x02\x83\x03Sa\x0C\x86V[`=`\x01\x83\x03S[P\x91\x95\x94PPPPPV[```\0a\x0C\xA0\x83`\x02a\x11nV[a\x0C\xAB\x90`\x02a\x11\xD9V[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0C\xC2Wa\x0C\xC2a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0C\xECW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\x07Wa\r\x07a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r6Wa\r6a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\rZ\x84`\x02a\x11nV[a\re\x90`\x01a\x11\xD9V[\x90P[`\x01\x81\x11\x15a\r\xDDWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\r\x99Wa\r\x99a\x11\x85V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\r\xAFWa\r\xAFa\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\r\xD6\x81a\x16\xB8V[\x90Pa\rhV[P\x83\x15a\x06\xECW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x04\"V[`\0\x80r\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x10a\x0EkWr\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x04\x92P`@\x01[i\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x10a\x0E\x95Wi\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x04\x92P` \x01[f#\x86\xF2o\xC1\0\0\x83\x10a\x0E\xB3Wf#\x86\xF2o\xC1\0\0\x83\x04\x92P`\x10\x01[c\x05\xF5\xE1\0\x83\x10a\x0E\xCBWc\x05\xF5\xE1\0\x83\x04\x92P`\x08\x01[a'\x10\x83\x10a\x0E\xDFWa'\x10\x83\x04\x92P`\x04\x01[`d\x83\x10a\x0E\xF1W`d\x83\x04\x92P`\x02\x01[`\n\x83\x10a\n\x9AW`\x01\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a\x0F2Wa\x0F2a\x0F\x02V[P`@Q`\x1F\x19`\x1F\x85\x01\x81\x16`?\x01\x16\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a\x0F`Wa\x0F`a\x0F\x02V[`@R\x83\x81R\x90P\x80\x82\x84\x01\x85\x10\x15a\x0FxW`\0\x80\xFD[\x83\x83` \x83\x017`\0` \x85\x83\x01\x01RP\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a\x0F\xA1W`\0\x80\xFD[a\x06\xEC\x83\x835` \x85\x01a\x0F\x18V[`\0` \x82\x84\x03\x12\x15a\x0F\xC2W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0F\xD8W`\0\x80\xFD[a\x0F\xE4\x84\x82\x85\x01a\x0F\x90V[\x94\x93PPPPV[`\0[\x83\x81\x10\x15a\x10\x07W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0F\xEFV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x10/\x81`@\x85\x01` \x87\x01a\x0F\xECV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x10UW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x10oW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x10\x8CW`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a\x10\x9DW`\0\x80\xFD[a\x10\xAC\x85\x825` \x84\x01a\x0F\x18V[\x91PP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x10\xCBW`\0\x80\xFD[PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x10\xE3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x11\0W`\0\x80\xFD[a\x11\x0C\x86\x82\x87\x01a\x0F\x90V[\x92PP`@\x84\x015a\x11\x1D\x81a\x10\xB6V[\x80\x91PP\x92P\x92P\x92V[`\x03\x81\x10a\x11FWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\n\x9A\x82\x84a\x11(V[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\n\x9AWa\n\x9Aa\x11XV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a\x11\xC0Wa\x11\xC0a\x11\x9BV[P\x04\x90V[`\0\x82a\x11\xD4Wa\x11\xD4a\x11\x9BV[P\x06\x90V[\x80\x82\x01\x80\x82\x11\x15a\n\x9AWa\n\x9Aa\x11XV[`\0\x81Qa\x11\xFE\x81\x85` \x86\x01a\x0F\xECV[\x92\x90\x92\x01\x92\x91PPV[a\x06\x0F`\xF3\x1B\x81R`\0\x82Qa\x12%\x81`\x02\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x02\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x12DW`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xEC` \x83\x01\x84a\x11(V[`\0` \x82\x84\x03\x12\x15a\x12qW`\0\x80\xFD[\x81Qa\x06\xEC\x81a\x10\xB6V[` \x80\x82R`L\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rkmain wallets`\xA0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x13\x02W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x13\"WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x05\x84W\x80`\0R` `\0 `\x1F\x84\x01`\x05\x1C\x81\x01` \x85\x10\x15a\x13OWP\x80[`\x1F\x84\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a\x13oW`\0\x81U`\x01\x01a\x13[V[PPPPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\x13\x8FWa\x13\x8Fa\x0F\x02V[a\x13\xA3\x81a\x13\x9D\x84Ta\x12\xEEV[\x84a\x13(V[` `\x1F\x82\x11`\x01\x81\x14a\x13\xD7W`\0\x83\x15a\x13\xBFWP\x84\x82\x01Q[`\0\x19`\x03\x85\x90\x1B\x1C\x19\x16`\x01\x84\x90\x1B\x17\x84Ua\x13oV[`\0\x84\x81R` \x81 `\x1F\x19\x85\x16\x91[\x82\x81\x10\x15a\x14\x07W\x87\x85\x01Q\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01a\x13\xE7V[P\x84\x82\x10\x15a\x14%W\x86\x84\x01Q`\0\x19`\x03\x87\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPP`\x01\x90\x81\x1B\x01\x90UPV[\x7Fdata:application/json;base64,\0\0\0\x81R`\0\x82Qa\x14l\x81`\x1D\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x1D\x01\x92\x91PPV[hLit PKP #`\xB8\x1B\x81R`\0\x82Qa\x14\x9D\x81`\t\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\t\x01\x92\x91PPV[h=\x9170\xB6\xB2\x91\x1D\x11`\xB9\x1B\x81R\x85Q`\0\x90a\x14\xCF\x81`\t\x85\x01` \x8B\x01a\x0F\xECV[\x7F\", \"description\": \"This NFT enti`\t\x91\x84\x01\x91\x82\x01R\x7Ftles the holder to use a Lit Pro`)\x82\x01R\x7Ftocol PKP, and to grant access t`I\x82\x01R\x7Fo other users and Lit Actions to`i\x82\x01R\x7F use this PKP\",\"image_data\": \"\0\0`\x89\x82\x01R\x86Qa\x15\xA4\x81`\xA7\x84\x01` \x8B\x01a\x0F\xECV[`\t\x81\x83\x01\x01\x91PP\x7F\",\"attributes\": [{\"trait_type\": `\x9E\x82\x01Rw\x11(:\xB164\xB1\x90%\xB2\xBC\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`A\x1B`\xBE\x82\x01Ra\x16\xACa\x16\x9Ca\x16\x96a\x16[a\x16Ua\x16\x10`\xD6\x87\x01\x8Ca\x11\xECV[\x7F\"}, {\"trait_type\": \"ETH Wallet A\x81Rr2292\xB9\xB9\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`i\x1B` \x82\x01R`3\x01\x90V[\x89a\x11\xECV[\x7F\"}, {\"trait_type\": \"Token ID\", \"\x81Rh;0\xB6:\xB2\x91\x1D\x10\x11`\xB9\x1B` \x82\x01R`)\x01\x90V[\x86a\x11\xECV[c\"}]}`\xE0\x1B\x81R`\x04\x01\x90V[\x98\x97PPPPPPPPV[`\0\x81a\x16\xC7Wa\x16\xC7a\x11XV[P`\0\x19\x01\x90V\xFEABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\xA2dipfsX\"\x12 \x11\x9F>\xFF\x15\xD9\xF5\xEA\x1C\x05_7\x90\x172\x96\x03\x0EY\x97>*\xD6`\xE8q\x1AU\xE2\xF03\x13dsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static PKPNFTMETADATA_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __BYTECODE, ); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0xW`\x005`\xE0\x1C\x80cE\x1D\x89\xFA\x14a\0}W\x80cP\xD1{^\x14a\0\xA6W\x80cQ\x9A!\x8E\x14a\0\xD1W\x80c\x85^\xEC\"\x14a\0\xE6W\x80c\x90\0\xFE\xE1\x14a\0\xF9W\x80c\x95\x04b\xEE\x14a\x01\x0CW\x80c\x9D\xCA\x002\x14a\x01\x1FW\x80c\xB6:vw\x14a\x01@W[`\0\x80\xFD[a\0\x90a\0\x8B6`\x04a\x0F\xB0V[a\x01SV[`@Qa\0\x9D\x91\x90a\x10\x10V[`@Q\x80\x91\x03\x90\xF3[`\0Ta\0\xB9\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\x9DV[a\0\xE4a\0\xDF6`\x04a\x10CV[a\x03\x0CV[\0[a\0\xE4a\0\xF46`\x04a\x10\\V[a\x04VV[a\0\xE4a\x01\x076`\x04a\x10\\V[a\x05\x89V[a\0\x90a\x01\x1A6`\x04a\x10\xCEV[a\x06\xB7V[`\0Ta\x013\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\x9D\x91\x90a\x11JV[a\0\xE4a\x01N6`\x04a\x10CV[a\x06\xF3V[```\0\x82Q`\x02a\x01e\x91\x90a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x01|Wa\x01|a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x01\xA6W` \x82\x01\x81\x806\x837\x01\x90P[P`@\x80Q\x80\x82\x01\x90\x91R`\x10\x81Ro\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B` \x82\x01R\x90\x91P`\0[\x84Q\x81\x10\x15a\x02\xE2W\x81\x82Q\x86\x83\x81Q\x81\x10a\x01\xF2Wa\x01\xF2a\x11\x85V[\x01` \x01Qa\x02\x04\x91\x90`\xF8\x1Ca\x11\xB1V[\x81Q\x81\x10a\x02\x14Wa\x02\x14a\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02/\x83`\x02a\x11nV[\x81Q\x81\x10a\x02?Wa\x02?a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP\x81\x82Q\x86\x83\x81Q\x81\x10a\x02kWa\x02ka\x11\x85V[\x01` \x01Qa\x02}\x91\x90`\xF8\x1Ca\x11\xC5V[\x81Q\x81\x10a\x02\x8DWa\x02\x8Da\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02\xA8\x83`\x02a\x11nV[a\x02\xB3\x90`\x01a\x11\xD9V[\x81Q\x81\x10a\x02\xC3Wa\x02\xC3a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x01\x01a\x01\xD4V[P\x81`@Q` \x01a\x02\xF4\x91\x90a\x12\x08V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92PPP\x91\x90PV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x03^W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\x82\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x03\xB1\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xCEW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xF2\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x04+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@Q\x80\x91\x03\x90\xFD[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x01\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[PPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xA8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xCC\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x04\xFB\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05\x18W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05<\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x05lW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x01` R`@\x90 a\x05\x84\x82\x82a\x13vV[PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x05\xDBW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\xFF\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x06.\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06KW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06o\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x9FW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x02` R`@\x90 a\x05\x84\x82\x82a\x13vV[```\0a\x06\xC6\x85\x85\x85a\x080V[\x90P\x80`@Q` \x01a\x06\xD9\x91\x90a\x144V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP[\x93\x92PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07EW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07i\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07\x98\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xB5W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xD9\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\tW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x02\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[```\0`@Q\x80a\x04\x80\x01`@R\x80a\x04V\x81R` \x01a\x16\xD0a\x04V\x919\x90P`\0a\x08]\x85a\x01SV[\x90P`\0a\x08j\x85a\n\x84V[\x90P`\0a\x08w\x88a\n\xA0V[`\0\x89\x81R`\x01` R`@\x81 \x80T\x92\x93P\x90\x91a\x08\x95\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x08\xC1\x90a\x12\xEEV[\x80\x15a\t\x0EW\x80`\x1F\x10a\x08\xE3Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\x0EV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x08\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P`\0`\x02`\0\x8B\x81R` \x01\x90\x81R` \x01`\0 \x80Ta\t5\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\ta\x90a\x12\xEEV[\x80\x15a\t\xAEW\x80`\x1F\x10a\t\x83Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\xAEV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\t\x91W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x81Q`\0\x14\x80\x15a\t\xC6WP\x80Q\x15\x15[\x15a\t\xF2W\x82`@Q` \x01a\t\xDC\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91Pa\nFV[\x81Q\x15\x80\x15\x90a\n\x01WP\x80Q\x15[\x15a\n\rWP\x84a\nFV[\x81Q\x15\x80\x15a\n\x1BWP\x80Q\x15[\x15a\nFW\x82`@Q` \x01a\n1\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P\x85\x90P[a\nv\x82\x82\x87\x87\x87`@Q` \x01a\nb\x95\x94\x93\x92\x91\x90a\x14\xAAV[`@Q` \x81\x83\x03\x03\x81R\x90`@Ra\x0B2V[\x9A\x99PPPPPPPPPPV[``a\n\x9A`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14a\x0C\x91V[\x92\x91PPV[```\0a\n\xAD\x83a\x0E,V[`\x01\x01\x90P`\0\x81`\x01`\x01`@\x1B\x03\x81\x11\x15a\n\xCCWa\n\xCCa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\n\xF6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P\x81\x81\x01` \x01[`\0\x19\x01o\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B`\n\x86\x06\x1A\x81S`\n\x85\x04\x94P\x84a\x0B\0WP\x93\x92PPPV[``\x81Q`\0\x03a\x0BQWPP`@\x80Q` \x81\x01\x90\x91R`\0\x81R\x90V[`\0`@Q\x80``\x01`@R\x80`@\x81R` \x01a\x1B&`@\x919\x90P`\0`\x03\x84Q`\x02a\x0B\x80\x91\x90a\x11\xD9V[a\x0B\x8A\x91\x90a\x11\xB1V[a\x0B\x95\x90`\x04a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xACWa\x0B\xACa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0B\xD6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x01\x82\x01` \x82\x01\x85\x86Q\x87\x01` \x81\x01\x80Q`\0\x82R[\x82\x84\x10\x15a\x0CLW`\x03\x84\x01\x93P\x83Q`?\x81`\x12\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x0C\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x06\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81\x16\x87\x01Q\x86SP`\x01\x85\x01\x94Pa\x0B\xF1V[\x90RPP\x85Q`\x03\x90\x06`\x01\x81\x14a\x0CkW`\x02\x81\x14a\x0C~Wa\x0C\x86V[`=`\x01\x83\x03S`=`\x02\x83\x03Sa\x0C\x86V[`=`\x01\x83\x03S[P\x91\x95\x94PPPPPV[```\0a\x0C\xA0\x83`\x02a\x11nV[a\x0C\xAB\x90`\x02a\x11\xD9V[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0C\xC2Wa\x0C\xC2a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0C\xECW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\x07Wa\r\x07a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r6Wa\r6a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\rZ\x84`\x02a\x11nV[a\re\x90`\x01a\x11\xD9V[\x90P[`\x01\x81\x11\x15a\r\xDDWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\r\x99Wa\r\x99a\x11\x85V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\r\xAFWa\r\xAFa\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\r\xD6\x81a\x16\xB8V[\x90Pa\rhV[P\x83\x15a\x06\xECW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x04\"V[`\0\x80r\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x10a\x0EkWr\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x04\x92P`@\x01[i\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x10a\x0E\x95Wi\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x04\x92P` \x01[f#\x86\xF2o\xC1\0\0\x83\x10a\x0E\xB3Wf#\x86\xF2o\xC1\0\0\x83\x04\x92P`\x10\x01[c\x05\xF5\xE1\0\x83\x10a\x0E\xCBWc\x05\xF5\xE1\0\x83\x04\x92P`\x08\x01[a'\x10\x83\x10a\x0E\xDFWa'\x10\x83\x04\x92P`\x04\x01[`d\x83\x10a\x0E\xF1W`d\x83\x04\x92P`\x02\x01[`\n\x83\x10a\n\x9AW`\x01\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a\x0F2Wa\x0F2a\x0F\x02V[P`@Q`\x1F\x19`\x1F\x85\x01\x81\x16`?\x01\x16\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a\x0F`Wa\x0F`a\x0F\x02V[`@R\x83\x81R\x90P\x80\x82\x84\x01\x85\x10\x15a\x0FxW`\0\x80\xFD[\x83\x83` \x83\x017`\0` \x85\x83\x01\x01RP\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a\x0F\xA1W`\0\x80\xFD[a\x06\xEC\x83\x835` \x85\x01a\x0F\x18V[`\0` \x82\x84\x03\x12\x15a\x0F\xC2W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0F\xD8W`\0\x80\xFD[a\x0F\xE4\x84\x82\x85\x01a\x0F\x90V[\x94\x93PPPPV[`\0[\x83\x81\x10\x15a\x10\x07W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0F\xEFV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x10/\x81`@\x85\x01` \x87\x01a\x0F\xECV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x10UW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x10oW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x10\x8CW`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a\x10\x9DW`\0\x80\xFD[a\x10\xAC\x85\x825` \x84\x01a\x0F\x18V[\x91PP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x10\xCBW`\0\x80\xFD[PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x10\xE3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x11\0W`\0\x80\xFD[a\x11\x0C\x86\x82\x87\x01a\x0F\x90V[\x92PP`@\x84\x015a\x11\x1D\x81a\x10\xB6V[\x80\x91PP\x92P\x92P\x92V[`\x03\x81\x10a\x11FWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\n\x9A\x82\x84a\x11(V[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\n\x9AWa\n\x9Aa\x11XV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a\x11\xC0Wa\x11\xC0a\x11\x9BV[P\x04\x90V[`\0\x82a\x11\xD4Wa\x11\xD4a\x11\x9BV[P\x06\x90V[\x80\x82\x01\x80\x82\x11\x15a\n\x9AWa\n\x9Aa\x11XV[`\0\x81Qa\x11\xFE\x81\x85` \x86\x01a\x0F\xECV[\x92\x90\x92\x01\x92\x91PPV[a\x06\x0F`\xF3\x1B\x81R`\0\x82Qa\x12%\x81`\x02\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x02\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x12DW`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xEC` \x83\x01\x84a\x11(V[`\0` \x82\x84\x03\x12\x15a\x12qW`\0\x80\xFD[\x81Qa\x06\xEC\x81a\x10\xB6V[` \x80\x82R`L\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rkmain wallets`\xA0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x13\x02W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x13\"WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x05\x84W\x80`\0R` `\0 `\x1F\x84\x01`\x05\x1C\x81\x01` \x85\x10\x15a\x13OWP\x80[`\x1F\x84\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a\x13oW`\0\x81U`\x01\x01a\x13[V[PPPPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\x13\x8FWa\x13\x8Fa\x0F\x02V[a\x13\xA3\x81a\x13\x9D\x84Ta\x12\xEEV[\x84a\x13(V[` `\x1F\x82\x11`\x01\x81\x14a\x13\xD7W`\0\x83\x15a\x13\xBFWP\x84\x82\x01Q[`\0\x19`\x03\x85\x90\x1B\x1C\x19\x16`\x01\x84\x90\x1B\x17\x84Ua\x13oV[`\0\x84\x81R` \x81 `\x1F\x19\x85\x16\x91[\x82\x81\x10\x15a\x14\x07W\x87\x85\x01Q\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01a\x13\xE7V[P\x84\x82\x10\x15a\x14%W\x86\x84\x01Q`\0\x19`\x03\x87\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPP`\x01\x90\x81\x1B\x01\x90UPV[\x7Fdata:application/json;base64,\0\0\0\x81R`\0\x82Qa\x14l\x81`\x1D\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x1D\x01\x92\x91PPV[hLit PKP #`\xB8\x1B\x81R`\0\x82Qa\x14\x9D\x81`\t\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\t\x01\x92\x91PPV[h=\x9170\xB6\xB2\x91\x1D\x11`\xB9\x1B\x81R\x85Q`\0\x90a\x14\xCF\x81`\t\x85\x01` \x8B\x01a\x0F\xECV[\x7F\", \"description\": \"This NFT enti`\t\x91\x84\x01\x91\x82\x01R\x7Ftles the holder to use a Lit Pro`)\x82\x01R\x7Ftocol PKP, and to grant access t`I\x82\x01R\x7Fo other users and Lit Actions to`i\x82\x01R\x7F use this PKP\",\"image_data\": \"\0\0`\x89\x82\x01R\x86Qa\x15\xA4\x81`\xA7\x84\x01` \x8B\x01a\x0F\xECV[`\t\x81\x83\x01\x01\x91PP\x7F\",\"attributes\": [{\"trait_type\": `\x9E\x82\x01Rw\x11(:\xB164\xB1\x90%\xB2\xBC\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`A\x1B`\xBE\x82\x01Ra\x16\xACa\x16\x9Ca\x16\x96a\x16[a\x16Ua\x16\x10`\xD6\x87\x01\x8Ca\x11\xECV[\x7F\"}, {\"trait_type\": \"ETH Wallet A\x81Rr2292\xB9\xB9\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`i\x1B` \x82\x01R`3\x01\x90V[\x89a\x11\xECV[\x7F\"}, {\"trait_type\": \"Token ID\", \"\x81Rh;0\xB6:\xB2\x91\x1D\x10\x11`\xB9\x1B` \x82\x01R`)\x01\x90V[\x86a\x11\xECV[c\"}]}`\xE0\x1B\x81R`\x04\x01\x90V[\x98\x97PPPPPPPPV[`\0\x81a\x16\xC7Wa\x16\xC7a\x11XV[P`\0\x19\x01\x90V\xFEABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\xA2dipfsX\"\x12 \x8F\x13\x99\xB0\x85\xBF\xFD\xE0ex\xF1\xDD\x04\xAD6!~\xEDG\xFB\xA0mu\xA3\x1F\\\xE9\xE6qQx\x82dsolcC\0\x08\x1C\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0xW`\x005`\xE0\x1C\x80cE\x1D\x89\xFA\x14a\0}W\x80cP\xD1{^\x14a\0\xA6W\x80cQ\x9A!\x8E\x14a\0\xD1W\x80c\x85^\xEC\"\x14a\0\xE6W\x80c\x90\0\xFE\xE1\x14a\0\xF9W\x80c\x95\x04b\xEE\x14a\x01\x0CW\x80c\x9D\xCA\x002\x14a\x01\x1FW\x80c\xB6:vw\x14a\x01@W[`\0\x80\xFD[a\0\x90a\0\x8B6`\x04a\x0F\xB0V[a\x01SV[`@Qa\0\x9D\x91\x90a\x10\x10V[`@Q\x80\x91\x03\x90\xF3[`\0Ta\0\xB9\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\x9DV[a\0\xE4a\0\xDF6`\x04a\x10CV[a\x03\x0CV[\0[a\0\xE4a\0\xF46`\x04a\x10\\V[a\x04VV[a\0\xE4a\x01\x076`\x04a\x10\\V[a\x05\x89V[a\0\x90a\x01\x1A6`\x04a\x10\xCEV[a\x06\xB7V[`\0Ta\x013\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\x9D\x91\x90a\x11JV[a\0\xE4a\x01N6`\x04a\x10CV[a\x06\xF3V[```\0\x82Q`\x02a\x01e\x91\x90a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x01|Wa\x01|a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x01\xA6W` \x82\x01\x81\x806\x837\x01\x90P[P`@\x80Q\x80\x82\x01\x90\x91R`\x10\x81Ro\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B` \x82\x01R\x90\x91P`\0[\x84Q\x81\x10\x15a\x02\xE2W\x81\x82Q\x86\x83\x81Q\x81\x10a\x01\xF2Wa\x01\xF2a\x11\x85V[\x01` \x01Qa\x02\x04\x91\x90`\xF8\x1Ca\x11\xB1V[\x81Q\x81\x10a\x02\x14Wa\x02\x14a\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02/\x83`\x02a\x11nV[\x81Q\x81\x10a\x02?Wa\x02?a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP\x81\x82Q\x86\x83\x81Q\x81\x10a\x02kWa\x02ka\x11\x85V[\x01` \x01Qa\x02}\x91\x90`\xF8\x1Ca\x11\xC5V[\x81Q\x81\x10a\x02\x8DWa\x02\x8Da\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02\xA8\x83`\x02a\x11nV[a\x02\xB3\x90`\x01a\x11\xD9V[\x81Q\x81\x10a\x02\xC3Wa\x02\xC3a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x01\x01a\x01\xD4V[P\x81`@Q` \x01a\x02\xF4\x91\x90a\x12\x08V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92PPP\x91\x90PV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x03^W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\x82\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x03\xB1\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xCEW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xF2\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x04+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@Q\x80\x91\x03\x90\xFD[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x01\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[PPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xA8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xCC\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x04\xFB\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05\x18W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05<\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x05lW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x01` R`@\x90 a\x05\x84\x82\x82a\x13vV[PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x05\xDBW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\xFF\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x06.\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06KW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06o\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x9FW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x02` R`@\x90 a\x05\x84\x82\x82a\x13vV[```\0a\x06\xC6\x85\x85\x85a\x080V[\x90P\x80`@Q` \x01a\x06\xD9\x91\x90a\x144V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP[\x93\x92PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07EW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07i\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07\x98\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xB5W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xD9\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\tW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x02\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[```\0`@Q\x80a\x04\x80\x01`@R\x80a\x04V\x81R` \x01a\x16\xD0a\x04V\x919\x90P`\0a\x08]\x85a\x01SV[\x90P`\0a\x08j\x85a\n\x84V[\x90P`\0a\x08w\x88a\n\xA0V[`\0\x89\x81R`\x01` R`@\x81 \x80T\x92\x93P\x90\x91a\x08\x95\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x08\xC1\x90a\x12\xEEV[\x80\x15a\t\x0EW\x80`\x1F\x10a\x08\xE3Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\x0EV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x08\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P`\0`\x02`\0\x8B\x81R` \x01\x90\x81R` \x01`\0 \x80Ta\t5\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\ta\x90a\x12\xEEV[\x80\x15a\t\xAEW\x80`\x1F\x10a\t\x83Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\xAEV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\t\x91W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x81Q`\0\x14\x80\x15a\t\xC6WP\x80Q\x15\x15[\x15a\t\xF2W\x82`@Q` \x01a\t\xDC\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91Pa\nFV[\x81Q\x15\x80\x15\x90a\n\x01WP\x80Q\x15[\x15a\n\rWP\x84a\nFV[\x81Q\x15\x80\x15a\n\x1BWP\x80Q\x15[\x15a\nFW\x82`@Q` \x01a\n1\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P\x85\x90P[a\nv\x82\x82\x87\x87\x87`@Q` \x01a\nb\x95\x94\x93\x92\x91\x90a\x14\xAAV[`@Q` \x81\x83\x03\x03\x81R\x90`@Ra\x0B2V[\x9A\x99PPPPPPPPPPV[``a\n\x9A`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14a\x0C\x91V[\x92\x91PPV[```\0a\n\xAD\x83a\x0E,V[`\x01\x01\x90P`\0\x81`\x01`\x01`@\x1B\x03\x81\x11\x15a\n\xCCWa\n\xCCa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\n\xF6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P\x81\x81\x01` \x01[`\0\x19\x01o\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B`\n\x86\x06\x1A\x81S`\n\x85\x04\x94P\x84a\x0B\0WP\x93\x92PPPV[``\x81Q`\0\x03a\x0BQWPP`@\x80Q` \x81\x01\x90\x91R`\0\x81R\x90V[`\0`@Q\x80``\x01`@R\x80`@\x81R` \x01a\x1B&`@\x919\x90P`\0`\x03\x84Q`\x02a\x0B\x80\x91\x90a\x11\xD9V[a\x0B\x8A\x91\x90a\x11\xB1V[a\x0B\x95\x90`\x04a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xACWa\x0B\xACa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0B\xD6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x01\x82\x01` \x82\x01\x85\x86Q\x87\x01` \x81\x01\x80Q`\0\x82R[\x82\x84\x10\x15a\x0CLW`\x03\x84\x01\x93P\x83Q`?\x81`\x12\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x0C\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x06\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81\x16\x87\x01Q\x86SP`\x01\x85\x01\x94Pa\x0B\xF1V[\x90RPP\x85Q`\x03\x90\x06`\x01\x81\x14a\x0CkW`\x02\x81\x14a\x0C~Wa\x0C\x86V[`=`\x01\x83\x03S`=`\x02\x83\x03Sa\x0C\x86V[`=`\x01\x83\x03S[P\x91\x95\x94PPPPPV[```\0a\x0C\xA0\x83`\x02a\x11nV[a\x0C\xAB\x90`\x02a\x11\xD9V[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0C\xC2Wa\x0C\xC2a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0C\xECW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\x07Wa\r\x07a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r6Wa\r6a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\rZ\x84`\x02a\x11nV[a\re\x90`\x01a\x11\xD9V[\x90P[`\x01\x81\x11\x15a\r\xDDWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\r\x99Wa\r\x99a\x11\x85V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\r\xAFWa\r\xAFa\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\r\xD6\x81a\x16\xB8V[\x90Pa\rhV[P\x83\x15a\x06\xECW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x04\"V[`\0\x80r\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x10a\x0EkWr\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x04\x92P`@\x01[i\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x10a\x0E\x95Wi\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x04\x92P` \x01[f#\x86\xF2o\xC1\0\0\x83\x10a\x0E\xB3Wf#\x86\xF2o\xC1\0\0\x83\x04\x92P`\x10\x01[c\x05\xF5\xE1\0\x83\x10a\x0E\xCBWc\x05\xF5\xE1\0\x83\x04\x92P`\x08\x01[a'\x10\x83\x10a\x0E\xDFWa'\x10\x83\x04\x92P`\x04\x01[`d\x83\x10a\x0E\xF1W`d\x83\x04\x92P`\x02\x01[`\n\x83\x10a\n\x9AW`\x01\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a\x0F2Wa\x0F2a\x0F\x02V[P`@Q`\x1F\x19`\x1F\x85\x01\x81\x16`?\x01\x16\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a\x0F`Wa\x0F`a\x0F\x02V[`@R\x83\x81R\x90P\x80\x82\x84\x01\x85\x10\x15a\x0FxW`\0\x80\xFD[\x83\x83` \x83\x017`\0` \x85\x83\x01\x01RP\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a\x0F\xA1W`\0\x80\xFD[a\x06\xEC\x83\x835` \x85\x01a\x0F\x18V[`\0` \x82\x84\x03\x12\x15a\x0F\xC2W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0F\xD8W`\0\x80\xFD[a\x0F\xE4\x84\x82\x85\x01a\x0F\x90V[\x94\x93PPPPV[`\0[\x83\x81\x10\x15a\x10\x07W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0F\xEFV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x10/\x81`@\x85\x01` \x87\x01a\x0F\xECV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x10UW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x10oW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x10\x8CW`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a\x10\x9DW`\0\x80\xFD[a\x10\xAC\x85\x825` \x84\x01a\x0F\x18V[\x91PP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x10\xCBW`\0\x80\xFD[PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x10\xE3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x11\0W`\0\x80\xFD[a\x11\x0C\x86\x82\x87\x01a\x0F\x90V[\x92PP`@\x84\x015a\x11\x1D\x81a\x10\xB6V[\x80\x91PP\x92P\x92P\x92V[`\x03\x81\x10a\x11FWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\n\x9A\x82\x84a\x11(V[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\n\x9AWa\n\x9Aa\x11XV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a\x11\xC0Wa\x11\xC0a\x11\x9BV[P\x04\x90V[`\0\x82a\x11\xD4Wa\x11\xD4a\x11\x9BV[P\x06\x90V[\x80\x82\x01\x80\x82\x11\x15a\n\x9AWa\n\x9Aa\x11XV[`\0\x81Qa\x11\xFE\x81\x85` \x86\x01a\x0F\xECV[\x92\x90\x92\x01\x92\x91PPV[a\x06\x0F`\xF3\x1B\x81R`\0\x82Qa\x12%\x81`\x02\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x02\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x12DW`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xEC` \x83\x01\x84a\x11(V[`\0` \x82\x84\x03\x12\x15a\x12qW`\0\x80\xFD[\x81Qa\x06\xEC\x81a\x10\xB6V[` \x80\x82R`L\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rkmain wallets`\xA0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x13\x02W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x13\"WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x05\x84W\x80`\0R` `\0 `\x1F\x84\x01`\x05\x1C\x81\x01` \x85\x10\x15a\x13OWP\x80[`\x1F\x84\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a\x13oW`\0\x81U`\x01\x01a\x13[V[PPPPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\x13\x8FWa\x13\x8Fa\x0F\x02V[a\x13\xA3\x81a\x13\x9D\x84Ta\x12\xEEV[\x84a\x13(V[` `\x1F\x82\x11`\x01\x81\x14a\x13\xD7W`\0\x83\x15a\x13\xBFWP\x84\x82\x01Q[`\0\x19`\x03\x85\x90\x1B\x1C\x19\x16`\x01\x84\x90\x1B\x17\x84Ua\x13oV[`\0\x84\x81R` \x81 `\x1F\x19\x85\x16\x91[\x82\x81\x10\x15a\x14\x07W\x87\x85\x01Q\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01a\x13\xE7V[P\x84\x82\x10\x15a\x14%W\x86\x84\x01Q`\0\x19`\x03\x87\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPP`\x01\x90\x81\x1B\x01\x90UPV[\x7Fdata:application/json;base64,\0\0\0\x81R`\0\x82Qa\x14l\x81`\x1D\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x1D\x01\x92\x91PPV[hLit PKP #`\xB8\x1B\x81R`\0\x82Qa\x14\x9D\x81`\t\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\t\x01\x92\x91PPV[h=\x9170\xB6\xB2\x91\x1D\x11`\xB9\x1B\x81R\x85Q`\0\x90a\x14\xCF\x81`\t\x85\x01` \x8B\x01a\x0F\xECV[\x7F\", \"description\": \"This NFT enti`\t\x91\x84\x01\x91\x82\x01R\x7Ftles the holder to use a Lit Pro`)\x82\x01R\x7Ftocol PKP, and to grant access t`I\x82\x01R\x7Fo other users and Lit Actions to`i\x82\x01R\x7F use this PKP\",\"image_data\": \"\0\0`\x89\x82\x01R\x86Qa\x15\xA4\x81`\xA7\x84\x01` \x8B\x01a\x0F\xECV[`\t\x81\x83\x01\x01\x91PP\x7F\",\"attributes\": [{\"trait_type\": `\x9E\x82\x01Rw\x11(:\xB164\xB1\x90%\xB2\xBC\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`A\x1B`\xBE\x82\x01Ra\x16\xACa\x16\x9Ca\x16\x96a\x16[a\x16Ua\x16\x10`\xD6\x87\x01\x8Ca\x11\xECV[\x7F\"}, {\"trait_type\": \"ETH Wallet A\x81Rr2292\xB9\xB9\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`i\x1B` \x82\x01R`3\x01\x90V[\x89a\x11\xECV[\x7F\"}, {\"trait_type\": \"Token ID\", \"\x81Rh;0\xB6:\xB2\x91\x1D\x10\x11`\xB9\x1B` \x82\x01R`)\x01\x90V[\x86a\x11\xECV[c\"}]}`\xE0\x1B\x81R`\x04\x01\x90V[\x98\x97PPPPPPPPV[`\0\x81a\x16\xC7Wa\x16\xC7a\x11XV[P`\0\x19\x01\x90V\xFEABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\xA2dipfsX\"\x12 \x11\x9F>\xFF\x15\xD9\xF5\xEA\x1C\x05_7\x90\x172\x96\x03\x0EY\x97>*\xD6`\xE8q\x1AU\xE2\xF03\x13dsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static PKPNFTMETADATA_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __DEPLOYED_BYTECODE, diff --git a/rust/lit-core/lit-blockchain-lite/src/contracts/pubkey_router.rs b/rust/lit-core/lit-blockchain-lite/src/contracts/pubkey_router.rs index 900433a8..fe9416fd 100644 --- a/rust/lit-core/lit-blockchain-lite/src/contracts/pubkey_router.rs +++ b/rust/lit-core/lit-blockchain-lite/src/contracts/pubkey_router.rs @@ -671,6 +671,7 @@ pub mod pubkey_router { ::ethers::core::abi::ethabi::ParamType::Bytes, ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), + ::ethers::core::abi::ethabi::ParamType::String, ], ), internal_type: ::core::option::Option::Some( @@ -781,6 +782,7 @@ pub mod pubkey_router { ::ethers::core::abi::ethabi::ParamType::Bytes, ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), + ::ethers::core::abi::ethabi::ParamType::String, ], ), internal_type: ::core::option::Option::Some( @@ -868,6 +870,13 @@ pub mod pubkey_router { ::std::borrow::ToOwned::to_owned("bytes32"), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("keySetIdentifier"), + kind: ::ethers::core::abi::ethabi::ParamType::String, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("string"), + ), + }, ], outputs: ::std::vec![], constant: ::core::option::Option::None, @@ -924,6 +933,13 @@ pub mod pubkey_router { ::std::borrow::ToOwned::to_owned("bytes32"), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("keySetIdentifier"), + kind: ::ethers::core::abi::ethabi::ParamType::String, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("string"), + ), + }, ], outputs: ::std::vec![], constant: ::core::option::Option::None, @@ -1209,6 +1225,11 @@ pub mod pubkey_router { ), indexed: false, }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("keySetIdentifier"), + kind: ::ethers::core::abi::ethabi::ParamType::String, + indexed: false, + }, ], anonymous: false, }, @@ -1979,7 +2000,7 @@ pub mod pubkey_router { .method_hash([249, 93, 113, 177], new_resolver_address) .expect("method not found (this should never happen)") } - ///Calls the contract's `setRoutingData` (0x0fccbd62) function + ///Calls the contract's `setRoutingData` (0xff463de6) function pub fn set_routing_data( &self, token_id: ::ethers::core::types::U256, @@ -1987,21 +2008,23 @@ pub mod pubkey_router { staking_contract_address: ::ethers::core::types::Address, key_type: ::ethers::core::types::U256, derived_key_id: [u8; 32], + key_set_identifier: ::std::string::String, ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash( - [15, 204, 189, 98], + [255, 70, 61, 230], ( token_id, pubkey, staking_contract_address, key_type, derived_key_id, + key_set_identifier, ), ) .expect("method not found (this should never happen)") } - ///Calls the contract's `setRoutingDataAsAdmin` (0x6e289d8e) function + ///Calls the contract's `setRoutingDataAsAdmin` (0x6c095735) function pub fn set_routing_data_as_admin( &self, token_id: ::ethers::core::types::U256, @@ -2009,11 +2032,19 @@ pub mod pubkey_router { staking_contract: ::ethers::core::types::Address, key_type: ::ethers::core::types::U256, derived_key_id: [u8; 32], + key_set_identifier: ::std::string::String, ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash( - [110, 40, 157, 142], - (token_id, pubkey, staking_contract, key_type, derived_key_id), + [108, 9, 87, 53], + ( + token_id, + pubkey, + staking_contract, + key_type, + derived_key_id, + key_set_identifier, + ), ) .expect("method not found (this should never happen)") } @@ -3001,7 +3032,7 @@ pub mod pubkey_router { )] #[ethevent( name = "PubkeyRoutingDataSet", - abi = "PubkeyRoutingDataSet(uint256,bytes,address,uint256,bytes32)" + abi = "PubkeyRoutingDataSet(uint256,bytes,address,uint256,bytes32,string)" )] pub struct PubkeyRoutingDataSetFilter { #[ethevent(indexed)] @@ -3010,6 +3041,7 @@ pub mod pubkey_router { pub staking_contract: ::ethers::core::types::Address, pub key_type: ::ethers::core::types::U256, pub derived_key_id: [u8; 32], + pub key_set_identifier: ::std::string::String, } #[derive( Clone, @@ -3587,7 +3619,7 @@ pub mod pubkey_router { pub struct SetContractResolverCall { pub new_resolver_address: ::ethers::core::types::Address, } - ///Container type for all input parameters for the `setRoutingData` function with signature `setRoutingData(uint256,bytes,address,uint256,bytes32)` and selector `0x0fccbd62` + ///Container type for all input parameters for the `setRoutingData` function with signature `setRoutingData(uint256,bytes,address,uint256,bytes32,string)` and selector `0xff463de6` #[derive( Clone, ::ethers::contract::EthCall, @@ -3602,7 +3634,7 @@ pub mod pubkey_router { )] #[ethcall( name = "setRoutingData", - abi = "setRoutingData(uint256,bytes,address,uint256,bytes32)" + abi = "setRoutingData(uint256,bytes,address,uint256,bytes32,string)" )] pub struct SetRoutingDataCall { pub token_id: ::ethers::core::types::U256, @@ -3610,8 +3642,9 @@ pub mod pubkey_router { pub staking_contract_address: ::ethers::core::types::Address, pub key_type: ::ethers::core::types::U256, pub derived_key_id: [u8; 32], + pub key_set_identifier: ::std::string::String, } - ///Container type for all input parameters for the `setRoutingDataAsAdmin` function with signature `setRoutingDataAsAdmin(uint256,bytes,address,uint256,bytes32)` and selector `0x6e289d8e` + ///Container type for all input parameters for the `setRoutingDataAsAdmin` function with signature `setRoutingDataAsAdmin(uint256,bytes,address,uint256,bytes32,string)` and selector `0x6c095735` #[derive( Clone, ::ethers::contract::EthCall, @@ -3626,7 +3659,7 @@ pub mod pubkey_router { )] #[ethcall( name = "setRoutingDataAsAdmin", - abi = "setRoutingDataAsAdmin(uint256,bytes,address,uint256,bytes32)" + abi = "setRoutingDataAsAdmin(uint256,bytes,address,uint256,bytes32,string)" )] pub struct SetRoutingDataAsAdminCall { pub token_id: ::ethers::core::types::U256, @@ -3634,6 +3667,7 @@ pub mod pubkey_router { pub staking_contract: ::ethers::core::types::Address, pub key_type: ::ethers::core::types::U256, pub derived_key_id: [u8; 32], + pub key_set_identifier: ::std::string::String, } ///Container type for all input parameters for the `setTrustedForwarder` function with signature `setTrustedForwarder(address)` and selector `0xda742228` #[derive( @@ -4568,7 +4602,7 @@ pub mod pubkey_router { pub pubkey: ::ethers::core::types::Bytes, pub eth_address: ::ethers::core::types::Address, } - ///`PubkeyRoutingData(bytes,uint256,bytes32)` + ///`PubkeyRoutingData(bytes,uint256,bytes32,string)` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -4585,5 +4619,6 @@ pub mod pubkey_router { pub pubkey: ::ethers::core::types::Bytes, pub key_type: ::ethers::core::types::U256, pub derived_key_id: [u8; 32], + pub key_set_identifier: ::std::string::String, } } diff --git a/rust/lit-core/lit-blockchain-lite/src/contracts/staking.rs b/rust/lit-core/lit-blockchain-lite/src/contracts/staking.rs index bc8580af..2dbcc498 100644 --- a/rust/lit-core/lit-blockchain-lite/src/contracts/staking.rs +++ b/rust/lit-core/lit-blockchain-lite/src/contracts/staking.rs @@ -1722,11 +1722,7 @@ abi_functions.append(&mut __abi_functions_4()); ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ), ), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Address, - ), - ), + ::ethers::core::abi::ethabi::ParamType::Bytes, ], ), internal_type: ::core::option::Option::Some( @@ -1741,30 +1737,6 @@ abi_functions.append(&mut __abi_functions_4()); }, ], ), - ( - ::std::borrow::ToOwned::to_owned("getKeyTypes"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("getKeyTypes"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[]"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), ( ::std::borrow::ToOwned::to_owned("getKickedValidators"), ::std::vec![ @@ -1800,19 +1772,8 @@ abi_functions.append(&mut __abi_functions_4()); state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, }, ], - ) - ] - ) - } - - - -#[allow(deprecated)] - fn __abi_functions_2() -> std::collections::BTreeMap> { - - std::collections::BTreeMap::from( - [ - ( + ), + ( ::std::borrow::ToOwned::to_owned("getLastStakeRecord"), ::std::vec![ ::ethers::core::abi::ethabi::Function { @@ -1861,8 +1822,19 @@ abi_functions.append(&mut __abi_functions_4()); state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, }, ], - ), - ( + ) + ] + ) + } + + + +#[allow(deprecated)] + fn __abi_functions_2() -> std::collections::BTreeMap> { + + std::collections::BTreeMap::from( + [ + ( ::std::borrow::ToOwned::to_owned("getLitCirc"), ::std::vec![ ::ethers::core::abi::ethabi::Function { @@ -3567,11 +3539,6 @@ abi_functions.append(&mut __abi_functions_4()); kind: ::ethers::core::abi::ethabi::ParamType::Tuple( ::std::vec![ ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - ), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), @@ -3832,19 +3799,8 @@ abi_functions.append(&mut __abi_functions_4()); state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, }, ], - ) - ] - ) - } - - - -#[allow(deprecated)] - fn __abi_functions_3() -> std::collections::BTreeMap> { - - std::collections::BTreeMap::from( - [ - ( + ), + ( ::std::borrow::ToOwned::to_owned("isActiveValidatorByNodeAddress"), ::std::vec![ ::ethers::core::abi::ethabi::Function { @@ -3882,8 +3838,19 @@ abi_functions.append(&mut __abi_functions_4()); state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, }, ], - ), - ( + ) + ] + ) + } + + + +#[allow(deprecated)] + fn __abi_functions_3() -> std::collections::BTreeMap> { + + std::collections::BTreeMap::from( + [ + ( ::std::borrow::ToOwned::to_owned( "isActiveValidatorByNodeAddressForNextEpoch", ), @@ -4206,11 +4173,7 @@ abi_functions.append(&mut __abi_functions_4()); ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ), ), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Address, - ), - ), + ::ethers::core::abi::ethabi::ParamType::Bytes, ], ), ), @@ -4867,6 +4830,7 @@ abi_functions.append(&mut __abi_functions_4()); ::ethers::core::abi::ethabi::ParamType::Bool, ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Bool, + ::ethers::core::abi::ethabi::ParamType::String, ], ), internal_type: ::core::option::Option::Some( @@ -5157,11 +5121,6 @@ abi_functions.append(&mut __abi_functions_4()); kind: ::ethers::core::abi::ethabi::ParamType::Tuple( ::std::vec![ ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - ), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), @@ -5464,11 +5423,7 @@ abi_functions.append(&mut __abi_functions_4()); ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ), ), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Address, - ), - ), + ::ethers::core::abi::ethabi::ParamType::Bytes, ], ), internal_type: ::core::option::Option::Some( @@ -5483,19 +5438,8 @@ abi_functions.append(&mut __abi_functions_4()); state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, }, ], - ) - ] - ) - } - - - -#[allow(deprecated)] - fn __abi_functions_4() -> std::collections::BTreeMap> { - - std::collections::BTreeMap::from( - [ - ( + ), + ( ::std::borrow::ToOwned::to_owned("setLitActionConfig"), ::std::vec![ ::ethers::core::abi::ethabi::Function { @@ -5540,8 +5484,19 @@ abi_functions.append(&mut __abi_functions_4()); state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, }, ], - ), - ( + ) + ] + ) + } + + + +#[allow(deprecated)] + fn __abi_functions_4() -> std::collections::BTreeMap> { + + std::collections::BTreeMap::from( + [ + ( ::std::borrow::ToOwned::to_owned("setMaxVersion"), ::std::vec![ ::ethers::core::abi::ethabi::Function { @@ -5734,6 +5689,7 @@ abi_functions.append(&mut __abi_functions_4()); ::ethers::core::abi::ethabi::ParamType::Bool, ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Bool, + ::ethers::core::abi::ethabi::ParamType::String, ], ), internal_type: ::core::option::Option::Some( @@ -6475,96 +6431,6 @@ abi_functions.append(&mut __abi_functions_4()); }, ], ), - ( - ::std::borrow::ToOwned::to_owned("ConfigSet"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("ConfigSet"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newTokenRewardPerTokenPerEpoch", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("newKeyTypes"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newMinimumValidatorCount", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newMaxConcurrentRequests", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newMaxPresignCount", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newMinPresignCount", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newPeerCheckingIntervalSecs", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newMaxPresignConcurrency", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newRpcHealthcheckEnabled", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - indexed: false, - }, - ], - anonymous: false, - }, - ], - ), ( ::std::borrow::ToOwned::to_owned("CountOfflinePhaseData"), ::std::vec![ @@ -9482,17 +9348,6 @@ abi_errors.append(&mut __abi_errors_2()); .method_hash([163, 5, 229, 254], identifier) .expect("method not found (this should never happen)") } - ///Calls the contract's `getKeyTypes` (0xf1b877a8) function - pub fn get_key_types( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::std::vec::Vec<::ethers::core::types::U256>, - > { - self.0 - .method_hash([241, 184, 119, 168], ()) - .expect("method not found (this should never happen)") - } ///Calls the contract's `getKickedValidators` (0x4b6afbbb) function pub fn get_kicked_validators( &self, @@ -10472,13 +10327,13 @@ abi_errors.append(&mut __abi_errors_2()); .method_hash([68, 14, 141, 34], (reason, config)) .expect("method not found (this should never happen)") } - ///Calls the contract's `setConfig` (0x077b0d40) function + ///Calls the contract's `setConfig` (0xd94c412d) function pub fn set_config( &self, new_config: GlobalConfig, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([7, 123, 13, 64], (new_config,)) + .method_hash([217, 76, 65, 45], (new_config,)) .expect("method not found (this should never happen)") } ///Calls the contract's `setContractResolver` (0xf95d71b1) function @@ -10560,13 +10415,13 @@ abi_errors.append(&mut __abi_errors_2()); .method_hash([44, 128, 181, 73], (ip, ipv_6, port, operator_address)) .expect("method not found (this should never happen)") } - ///Calls the contract's `setKeySet` (0x74d0be87) function + ///Calls the contract's `setKeySet` (0x774d0151) function pub fn set_key_set( &self, update: KeySetConfig, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([116, 208, 190, 135], (update,)) + .method_hash([119, 77, 1, 81], (update,)) .expect("method not found (this should never happen)") } ///Calls the contract's `setLitActionConfig` (0xe7d1f9a1) function @@ -10628,14 +10483,14 @@ abi_errors.append(&mut __abi_errors_2()); .method_hash([116, 162, 44, 81], (realm_id, permitted_validators_on)) .expect("method not found (this should never happen)") } - ///Calls the contract's `setRealmConfig` (0x7d35690f) function + ///Calls the contract's `setRealmConfig` (0x006d27b6) function pub fn set_realm_config( &self, realm_id: ::ethers::core::types::U256, new_config: RealmConfig, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([125, 53, 105, 15], (realm_id, new_config)) + .method_hash([0, 109, 39, 182], (realm_id, new_config)) .expect("method not found (this should never happen)") } ///Calls the contract's `setTokenTotalSupplyStandIn` (0xe941a733) function @@ -10860,16 +10715,6 @@ abi_errors.append(&mut __abi_errors_2()); > { self.0.event() } - ///Gets the contract's `ConfigSet` event - pub fn config_set_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - ConfigSetFilter, - > { - self.0.event() - } ///Gets the contract's `CountOfflinePhaseData` event pub fn count_offline_phase_data_filter( &self, @@ -14206,33 +14051,6 @@ abi_errors.append(&mut __abi_errors_2()); Eq, Hash )] - #[ethevent( - name = "ConfigSet", - abi = "ConfigSet(uint256,uint256[],uint256,uint256,uint256,uint256,uint256,uint256,bool)" - )] - pub struct ConfigSetFilter { - pub new_token_reward_per_token_per_epoch: ::ethers::core::types::U256, - pub new_key_types: ::std::vec::Vec<::ethers::core::types::U256>, - pub new_minimum_validator_count: ::ethers::core::types::U256, - pub new_max_concurrent_requests: ::ethers::core::types::U256, - pub new_max_presign_count: ::ethers::core::types::U256, - pub new_min_presign_count: ::ethers::core::types::U256, - pub new_peer_checking_interval_secs: ::ethers::core::types::U256, - pub new_max_presign_concurrency: ::ethers::core::types::U256, - pub new_rpc_healthcheck_enabled: bool, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] #[ethevent(name = "CountOfflinePhaseData", abi = "CountOfflinePhaseData(uint256)")] pub struct CountOfflinePhaseDataFilter { pub data_type: ::ethers::core::types::U256, @@ -14884,7 +14702,6 @@ abi_errors.append(&mut __abi_errors_2()); AttestedWalletRegisteredFilter(AttestedWalletRegisteredFilter), ClearOfflinePhaseDataFilter(ClearOfflinePhaseDataFilter), ComplaintConfigSetFilter(ComplaintConfigSetFilter), - ConfigSetFilter(ConfigSetFilter), CountOfflinePhaseDataFilter(CountOfflinePhaseDataFilter), DebugEventFilter(DebugEventFilter), DevopsAdminSetFilter(DevopsAdminSetFilter), @@ -14937,9 +14754,6 @@ abi_errors.append(&mut __abi_errors_2()); if let Ok(decoded) = ComplaintConfigSetFilter::decode_log(log) { return Ok(StakingEvents::ComplaintConfigSetFilter(decoded)); } - if let Ok(decoded) = ConfigSetFilter::decode_log(log) { - return Ok(StakingEvents::ConfigSetFilter(decoded)); - } if let Ok(decoded) = CountOfflinePhaseDataFilter::decode_log(log) { return Ok(StakingEvents::CountOfflinePhaseDataFilter(decoded)); } @@ -15063,7 +14877,6 @@ abi_errors.append(&mut __abi_errors_2()); Self::ComplaintConfigSetFilter(element) => { ::core::fmt::Display::fmt(element, f) } - Self::ConfigSetFilter(element) => ::core::fmt::Display::fmt(element, f), Self::CountOfflinePhaseDataFilter(element) => { ::core::fmt::Display::fmt(element, f) } @@ -15182,11 +14995,6 @@ abi_errors.append(&mut __abi_errors_2()); Self::ComplaintConfigSetFilter(value) } } - impl ::core::convert::From for StakingEvents { - fn from(value: ConfigSetFilter) -> Self { - Self::ConfigSetFilter(value) - } - } impl ::core::convert::From for StakingEvents { fn from(value: CountOfflinePhaseDataFilter) -> Self { Self::CountOfflinePhaseDataFilter(value) @@ -16275,21 +16083,6 @@ abi_errors.append(&mut __abi_errors_2()); pub struct GetKeySetCall { pub identifier: ::std::string::String, } - ///Container type for all input parameters for the `getKeyTypes` function with signature `getKeyTypes()` and selector `0xf1b877a8` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "getKeyTypes", abi = "getKeyTypes()")] - pub struct GetKeyTypesCall; ///Container type for all input parameters for the `getKickedValidators` function with signature `getKickedValidators(uint256)` and selector `0x4b6afbbb` #[derive( Clone, @@ -17990,7 +17783,7 @@ abi_errors.append(&mut __abi_errors_2()); pub reason: ::ethers::core::types::U256, pub config: ComplaintConfig, } - ///Container type for all input parameters for the `setConfig` function with signature `setConfig((uint256,uint256[],uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x077b0d40` + ///Container type for all input parameters for the `setConfig` function with signature `setConfig((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0xd94c412d` #[derive( Clone, ::ethers::contract::EthCall, @@ -18000,7 +17793,7 @@ abi_errors.append(&mut __abi_errors_2()); )] #[ethcall( name = "setConfig", - abi = "setConfig((uint256,uint256[],uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" + abi = "setConfig((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" )] pub struct SetConfigCall { pub new_config: GlobalConfig, @@ -18154,7 +17947,7 @@ abi_errors.append(&mut __abi_errors_2()); pub port: u32, pub operator_address: ::ethers::core::types::Address, } - ///Container type for all input parameters for the `setKeySet` function with signature `setKeySet((uint32,uint32,bool,string,string,uint256[],uint256[],uint256[],address[]))` and selector `0x74d0be87` + ///Container type for all input parameters for the `setKeySet` function with signature `setKeySet((uint32,uint32,bool,string,string,uint256[],uint256[],uint256[],bytes))` and selector `0x774d0151` #[derive( Clone, ::ethers::contract::EthCall, @@ -18169,7 +17962,7 @@ abi_errors.append(&mut __abi_errors_2()); )] #[ethcall( name = "setKeySet", - abi = "setKeySet((uint32,uint32,bool,string,string,uint256[],uint256[],uint256[],address[]))" + abi = "setKeySet((uint32,uint32,bool,string,string,uint256[],uint256[],uint256[],bytes))" )] pub struct SetKeySetCall { pub update: KeySetConfig, @@ -18299,7 +18092,7 @@ abi_errors.append(&mut __abi_errors_2()); pub realm_id: ::ethers::core::types::U256, pub permitted_validators_on: bool, } - ///Container type for all input parameters for the `setRealmConfig` function with signature `setRealmConfig(uint256,(uint256,uint256,uint256,uint256,uint256,bool,uint256,bool))` and selector `0x7d35690f` + ///Container type for all input parameters for the `setRealmConfig` function with signature `setRealmConfig(uint256,(uint256,uint256,uint256,uint256,uint256,bool,uint256,bool,string))` and selector `0x006d27b6` #[derive( Clone, ::ethers::contract::EthCall, @@ -18314,7 +18107,7 @@ abi_errors.append(&mut __abi_errors_2()); )] #[ethcall( name = "setRealmConfig", - abi = "setRealmConfig(uint256,(uint256,uint256,uint256,uint256,uint256,bool,uint256,bool))" + abi = "setRealmConfig(uint256,(uint256,uint256,uint256,uint256,uint256,bool,uint256,bool,string))" )] pub struct SetRealmConfigCall { pub realm_id: ::ethers::core::types::U256, @@ -18715,7 +18508,6 @@ abi_errors.append(&mut __abi_errors_2()); GetDelegatedStakersWithUnfreezingStakesCountCall, ), GetKeySet(GetKeySetCall), - GetKeyTypes(GetKeyTypesCall), GetKickedValidators(GetKickedValidatorsCall), GetLastStakeRecord(GetLastStakeRecordCall), GetLitCirc(GetLitCircCall), @@ -19096,11 +18888,6 @@ abi_errors.append(&mut __abi_errors_2()); ) { return Ok(Self::GetKeySet(decoded)); } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::GetKeyTypes(decoded)); - } if let Ok(decoded) = ::decode( data, ) { @@ -19875,9 +19662,6 @@ abi_errors.append(&mut __abi_errors_2()); Self::GetKeySet(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::GetKeyTypes(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } Self::GetKickedValidators(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -20360,7 +20144,6 @@ abi_errors.append(&mut __abi_errors_2()); ::core::fmt::Display::fmt(element, f) } Self::GetKeySet(element) => ::core::fmt::Display::fmt(element, f), - Self::GetKeyTypes(element) => ::core::fmt::Display::fmt(element, f), Self::GetKickedValidators(element) => { ::core::fmt::Display::fmt(element, f) } @@ -20890,11 +20673,6 @@ abi_errors.append(&mut __abi_errors_2()); Self::GetKeySet(value) } } - impl ::core::convert::From for StakingCalls { - fn from(value: GetKeyTypesCall) -> Self { - Self::GetKeyTypes(value) - } - } impl ::core::convert::From for StakingCalls { fn from(value: GetKickedValidatorsCall) -> Self { Self::GetKickedValidators(value) @@ -21940,20 +21718,6 @@ abi_errors.append(&mut __abi_errors_2()); Hash )] pub struct GetKeySetReturn(pub KeySetConfig); - ///Container type for all return fields from the `getKeyTypes` function with signature `getKeyTypes()` and selector `0xf1b877a8` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct GetKeyTypesReturn(pub ::std::vec::Vec<::ethers::core::types::U256>); ///Container type for all return fields from the `getKickedValidators` function with signature `getKickedValidators(uint256)` and selector `0x4b6afbbb` #[derive( Clone, @@ -23251,7 +23015,7 @@ abi_errors.append(&mut __abi_errors_2()); pub start_time: ::ethers::core::types::U256, pub last_advance_vote_time: ::ethers::core::types::U256, } - ///`GlobalConfig(uint256,uint256[],uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)` + ///`GlobalConfig(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -23266,7 +23030,6 @@ abi_errors.append(&mut __abi_errors_2()); )] pub struct GlobalConfig { pub token_reward_per_token_per_epoch: ::ethers::core::types::U256, - pub key_types: ::std::vec::Vec<::ethers::core::types::U256>, pub minimum_validator_count: ::ethers::core::types::U256, pub reward_epoch_duration: ::ethers::core::types::U256, pub max_time_lock: ::ethers::core::types::U256, @@ -23288,7 +23051,7 @@ abi_errors.append(&mut __abi_errors_2()); pub min_threshold_to_clamp_at: ::ethers::core::types::U256, pub vote_to_advance_time_out: ::ethers::core::types::U256, } - ///`KeySetConfig(uint32,uint32,bool,string,string,uint256[],uint256[],uint256[],address[])` + ///`KeySetConfig(uint32,uint32,bool,string,string,uint256[],uint256[],uint256[],bytes)` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -23310,7 +23073,7 @@ abi_errors.append(&mut __abi_errors_2()); pub realms: ::std::vec::Vec<::ethers::core::types::U256>, pub curves: ::std::vec::Vec<::ethers::core::types::U256>, pub counts: ::std::vec::Vec<::ethers::core::types::U256>, - pub recovery_party_members: ::std::vec::Vec<::ethers::core::types::Address>, + pub recovery_session_id: ::ethers::core::types::Bytes, } ///`LitActionConfig(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)` #[derive( @@ -23356,7 +23119,7 @@ abi_errors.append(&mut __abi_errors_2()); pub node_address: ::ethers::core::types::Address, pub pub_key: UncompressedK256Key, } - ///`RealmConfig(uint256,uint256,uint256,uint256,uint256,bool,uint256,bool)` + ///`RealmConfig(uint256,uint256,uint256,uint256,uint256,bool,uint256,bool,string)` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -23378,6 +23141,7 @@ abi_errors.append(&mut __abi_errors_2()); pub rpc_healthcheck_enabled: bool, pub min_epoch_for_rewards: ::ethers::core::types::U256, pub permitted_validators_on: bool, + pub default_key_set: ::std::string::String, } ///`RewardEpoch(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)` #[derive( diff --git a/rust/lit-core/lit-blockchain/Cargo.toml b/rust/lit-core/lit-blockchain/Cargo.toml index 7ad1d955..8444c6f9 100644 --- a/rust/lit-core/lit-blockchain/Cargo.toml +++ b/rust/lit-core/lit-blockchain/Cargo.toml @@ -20,7 +20,7 @@ im = "15.1.0" moka = { version = "0.12.10", features = ["sync"] } once_cell.workspace = true reqwest.workspace = true -scc = "2.4" +scc.workspace = true serde.workspace = true serde_json.workspace = true serde_yaml = { version = "0.9.14" } diff --git a/rust/lit-core/lit-blockchain/abis/ArbitrumKeyDeriver.json b/rust/lit-core/lit-blockchain/abis/ArbitrumKeyDeriver.json index f48ee967..132cb67a 100644 --- a/rust/lit-core/lit-blockchain/abis/ArbitrumKeyDeriver.json +++ b/rust/lit-core/lit-blockchain/abis/ArbitrumKeyDeriver.json @@ -348,8 +348,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506040516111ca3803806111ca83398101604081905261002f916101a4565b6100476000805160206111aa833981519152336100ad565b61005f6000805160206111aa833981519152806100bb565b600180546001600160a01b0384166001600160a01b03198216811783558392916001600160a81b03191617600160a01b8360028111156100a1576100a16101ee565b02179055505050610204565b6100b78282610106565b5050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166100b7576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556101603390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600080604083850312156101b757600080fd5b82516001600160a01b03811681146101ce57600080fd5b6020840151909250600381106101e357600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b610f97806102136000396000f3fe608060405234801561001057600080fd5b50600436106100ba5760003560e01c806301ffc9a7146100bf578063248a9ca3146100e75780632f2ff15d1461010857806336568abe1461011d57806350d17b5e1461013057806375b238fc1461015b57806391d14854146101825780639dca003214610195578063a217fddf146101b6578063a32c2b99146101be578063b24ed308146101df578063d547741f14610206578063f95d71b114610219578063fe89c9701461022c575b600080fd5b6100d26100cd36600461098d565b610252565b60405190151581526020015b60405180910390f35b6100fa6100f53660046109b7565b610289565b6040519081526020016100de565b61011b6101163660046109e5565b61029e565b005b61011b61012b3660046109e5565b6102bf565b600154610143906001600160a01b031681565b6040516001600160a01b0390911681526020016100de565b6100fa7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b6100d26101903660046109e5565b610342565b6001546101a990600160a01b900460ff1681565b6040516100de9190610a37565b6100fa600081565b6101d16101cc366004610ada565b61036b565b6040516100de929190610c92565b6100fa7f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d981565b61011b6102143660046109e5565b6104f6565b61011b610227366004610cb5565b610512565b6100fa7ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c6481565b60006001600160e01b03198216637965db0b60e01b148061028357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60009081526020819052604090206001015490565b6102a782610289565b6102b08161055f565b6102ba838361056c565b505050565b6001600160a01b03811633146103345760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61033e82826105f0565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60006060600061037c868686610655565b905060008160008151811061039357610393610cd2565b01602001516001600160f81b0319166000036103d057507f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d96103f2565b507ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c645b600154604051634746fe8b60e11b81526000916001600160a01b03811691638e8dfd169161042f918691600160a01b900460ff1690600401610ce8565b602060405180830381865afa15801561044c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104709190610cfc565b90506000816001600160a01b031663ec723367856040518263ffffffff1660e01b81526004016104a09190610d19565b600060405180830381865afa1580156104bd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104e59190810190610d2c565b60019a909950975050505050505050565b6104ff82610289565b6105088161055f565b6102ba83836105f0565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261053c8161055f565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6105698133610787565b50565b6105768282610342565b61033e576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556105ac3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6105fa8282610342565b1561033e576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60408051600080825260208201909252606091805b85518110156106ef578486828151811061068657610686610cd2565b602002602001015160200151036106e757828682815181106106aa576106aa610cd2565b6020026020010151600001516040516020016106c7929190610da2565b604051602081830303815290604052925081806106e390610de7565b9250505b60010161066a565b5083600203610701576001935061070e565b8360030361070e57600093505b60006040518060600160405280602b8152602001610f37602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061076590869086908f9087908b9088908f90602001610e0c565b60408051601f19818403018152919052985050505050505050505b9392505050565b6107918282610342565b61033e5761079e816107e0565b6107a98360206107f2565b6040516020016107ba929190610e86565b60408051601f198184030181529082905262461bcd60e51b825261032b91600401610d19565b60606102836001600160a01b03831660145b60606000610801836002610ef5565b61080c906002610f0c565b6001600160401b0381111561082357610823610a45565b6040519080825280601f01601f19166020018201604052801561084d576020820181803683370190505b509050600360fc1b8160008151811061086857610868610cd2565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061089757610897610cd2565b60200101906001600160f81b031916908160001a90535060006108bb846002610ef5565b6108c6906001610f0c565b90505b600181111561093e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106108fa576108fa610cd2565b1a60f81b82828151811061091057610910610cd2565b60200101906001600160f81b031916908160001a90535060049490941c9361093781610f1f565b90506108c9565b5083156107805760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161032b565b60006020828403121561099f57600080fd5b81356001600160e01b03198116811461078057600080fd5b6000602082840312156109c957600080fd5b5035919050565b6001600160a01b038116811461056957600080fd5b600080604083850312156109f857600080fd5b823591506020830135610a0a816109d0565b809150509250929050565b60038110610a3357634e487b7160e01b600052602160045260246000fd5b9052565b602081016102838284610a15565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610a7d57610a7d610a45565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610aab57610aab610a45565b604052919050565b60006001600160401b03821115610acc57610acc610a45565b50601f01601f191660200190565b600080600060608486031215610aef57600080fd5b8335925060208401356001600160401b03811115610b0c57600080fd5b8401601f81018613610b1d57600080fd5b80356001600160401b03811115610b3657610b36610a45565b8060051b610b4660208201610a83565b91825260208184018101929081019089841115610b6257600080fd5b6020850192505b83831015610c2d5782356001600160401b03811115610b8757600080fd5b85016040818c03601f19011215610b9d57600080fd5b610ba5610a5b565b60208201356001600160401b03811115610bbe57600080fd5b82016020810190603f018d13610bd357600080fd5b8035610be6610be182610ab3565b610a83565b8181528e6020838501011115610bfb57600080fd5b816020840160208301376000602092820183015283526040939093013582840152508352928301929190910190610b69565b96999698505050506040949094013593505050565b60005b83811015610c5d578181015183820152602001610c45565b50506000910152565b60008151808452610c7e816020860160208601610c42565b601f01601f19169290920160200192915050565b8215158152604060208201526000610cad6040830184610c66565b949350505050565b600060208284031215610cc757600080fd5b8135610780816109d0565b634e487b7160e01b600052603260045260246000fd5b828152604081016107806020830184610a15565b600060208284031215610d0e57600080fd5b8151610780816109d0565b6020815260006107806020830184610c66565b600060208284031215610d3e57600080fd5b81516001600160401b03811115610d5457600080fd5b8201601f81018413610d6557600080fd5b8051610d73610be182610ab3565b818152856020838501011115610d8857600080fd5b610d99826020830160208601610c42565b95945050505050565b60008351610db4818460208801610c42565b835190830190610dc8818360208801610c42565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff821663ffffffff8103610e0357610e03610dd1565b60010192915050565b6001600160f81b0319881681526001600160e01b0319878116600183015260058201879052851660258201528351600090610e4e816029850160208901610c42565b6001600160e01b031985166029918401918201528351610e7581602d840160208801610c42565b01602d019998505050505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351610eb8816017850160208801610c42565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610ee9816028840160208801610c42565b01602801949350505050565b808202811582820484141761028357610283610dd1565b8082018082111561028357610283610dd1565b600081610f2e57610f2e610dd1565b50600019019056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa264697066735822122037243bc43e78ac34bb45bfe243450c281f61d226e12cdab04b2899832a44ff7764736f6c634300081c0033df8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ba5760003560e01c806301ffc9a7146100bf578063248a9ca3146100e75780632f2ff15d1461010857806336568abe1461011d57806350d17b5e1461013057806375b238fc1461015b57806391d14854146101825780639dca003214610195578063a217fddf146101b6578063a32c2b99146101be578063b24ed308146101df578063d547741f14610206578063f95d71b114610219578063fe89c9701461022c575b600080fd5b6100d26100cd36600461098d565b610252565b60405190151581526020015b60405180910390f35b6100fa6100f53660046109b7565b610289565b6040519081526020016100de565b61011b6101163660046109e5565b61029e565b005b61011b61012b3660046109e5565b6102bf565b600154610143906001600160a01b031681565b6040516001600160a01b0390911681526020016100de565b6100fa7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b6100d26101903660046109e5565b610342565b6001546101a990600160a01b900460ff1681565b6040516100de9190610a37565b6100fa600081565b6101d16101cc366004610ada565b61036b565b6040516100de929190610c92565b6100fa7f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d981565b61011b6102143660046109e5565b6104f6565b61011b610227366004610cb5565b610512565b6100fa7ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c6481565b60006001600160e01b03198216637965db0b60e01b148061028357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60009081526020819052604090206001015490565b6102a782610289565b6102b08161055f565b6102ba838361056c565b505050565b6001600160a01b03811633146103345760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61033e82826105f0565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60006060600061037c868686610655565b905060008160008151811061039357610393610cd2565b01602001516001600160f81b0319166000036103d057507f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d96103f2565b507ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c645b600154604051634746fe8b60e11b81526000916001600160a01b03811691638e8dfd169161042f918691600160a01b900460ff1690600401610ce8565b602060405180830381865afa15801561044c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104709190610cfc565b90506000816001600160a01b031663ec723367856040518263ffffffff1660e01b81526004016104a09190610d19565b600060405180830381865afa1580156104bd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104e59190810190610d2c565b60019a909950975050505050505050565b6104ff82610289565b6105088161055f565b6102ba83836105f0565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261053c8161055f565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6105698133610787565b50565b6105768282610342565b61033e576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556105ac3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6105fa8282610342565b1561033e576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60408051600080825260208201909252606091805b85518110156106ef578486828151811061068657610686610cd2565b602002602001015160200151036106e757828682815181106106aa576106aa610cd2565b6020026020010151600001516040516020016106c7929190610da2565b604051602081830303815290604052925081806106e390610de7565b9250505b60010161066a565b5083600203610701576001935061070e565b8360030361070e57600093505b60006040518060600160405280602b8152602001610f37602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061076590869086908f9087908b9088908f90602001610e0c565b60408051601f19818403018152919052985050505050505050505b9392505050565b6107918282610342565b61033e5761079e816107e0565b6107a98360206107f2565b6040516020016107ba929190610e86565b60408051601f198184030181529082905262461bcd60e51b825261032b91600401610d19565b60606102836001600160a01b03831660145b60606000610801836002610ef5565b61080c906002610f0c565b6001600160401b0381111561082357610823610a45565b6040519080825280601f01601f19166020018201604052801561084d576020820181803683370190505b509050600360fc1b8160008151811061086857610868610cd2565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061089757610897610cd2565b60200101906001600160f81b031916908160001a90535060006108bb846002610ef5565b6108c6906001610f0c565b90505b600181111561093e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106108fa576108fa610cd2565b1a60f81b82828151811061091057610910610cd2565b60200101906001600160f81b031916908160001a90535060049490941c9361093781610f1f565b90506108c9565b5083156107805760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161032b565b60006020828403121561099f57600080fd5b81356001600160e01b03198116811461078057600080fd5b6000602082840312156109c957600080fd5b5035919050565b6001600160a01b038116811461056957600080fd5b600080604083850312156109f857600080fd5b823591506020830135610a0a816109d0565b809150509250929050565b60038110610a3357634e487b7160e01b600052602160045260246000fd5b9052565b602081016102838284610a15565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610a7d57610a7d610a45565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610aab57610aab610a45565b604052919050565b60006001600160401b03821115610acc57610acc610a45565b50601f01601f191660200190565b600080600060608486031215610aef57600080fd5b8335925060208401356001600160401b03811115610b0c57600080fd5b8401601f81018613610b1d57600080fd5b80356001600160401b03811115610b3657610b36610a45565b8060051b610b4660208201610a83565b91825260208184018101929081019089841115610b6257600080fd5b6020850192505b83831015610c2d5782356001600160401b03811115610b8757600080fd5b85016040818c03601f19011215610b9d57600080fd5b610ba5610a5b565b60208201356001600160401b03811115610bbe57600080fd5b82016020810190603f018d13610bd357600080fd5b8035610be6610be182610ab3565b610a83565b8181528e6020838501011115610bfb57600080fd5b816020840160208301376000602092820183015283526040939093013582840152508352928301929190910190610b69565b96999698505050506040949094013593505050565b60005b83811015610c5d578181015183820152602001610c45565b50506000910152565b60008151808452610c7e816020860160208601610c42565b601f01601f19169290920160200192915050565b8215158152604060208201526000610cad6040830184610c66565b949350505050565b600060208284031215610cc757600080fd5b8135610780816109d0565b634e487b7160e01b600052603260045260246000fd5b828152604081016107806020830184610a15565b600060208284031215610d0e57600080fd5b8151610780816109d0565b6020815260006107806020830184610c66565b600060208284031215610d3e57600080fd5b81516001600160401b03811115610d5457600080fd5b8201601f81018413610d6557600080fd5b8051610d73610be182610ab3565b818152856020838501011115610d8857600080fd5b610d99826020830160208601610c42565b95945050505050565b60008351610db4818460208801610c42565b835190830190610dc8818360208801610c42565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff821663ffffffff8103610e0357610e03610dd1565b60010192915050565b6001600160f81b0319881681526001600160e01b0319878116600183015260058201879052851660258201528351600090610e4e816029850160208901610c42565b6001600160e01b031985166029918401918201528351610e7581602d840160208801610c42565b01602d019998505050505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351610eb8816017850160208801610c42565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610ee9816028840160208801610c42565b01602801949350505050565b808202811582820484141761028357610283610dd1565b8082018082111561028357610283610dd1565b600081610f2e57610f2e610dd1565b50600019019056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa264697066735822122037243bc43e78ac34bb45bfe243450c281f61d226e12cdab04b2899832a44ff7764736f6c634300081c0033", + "bytecode": "0x608060405234801561001057600080fd5b506040516111ca3803806111ca83398101604081905261002f916101a4565b6100476000805160206111aa833981519152336100ad565b61005f6000805160206111aa833981519152806100bb565b600180546001600160a01b0384166001600160a01b03198216811783558392916001600160a81b03191617600160a01b8360028111156100a1576100a16101ee565b02179055505050610204565b6100b78282610106565b5050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166100b7576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556101603390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600080604083850312156101b757600080fd5b82516001600160a01b03811681146101ce57600080fd5b6020840151909250600381106101e357600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b610f97806102136000396000f3fe608060405234801561001057600080fd5b50600436106100ba5760003560e01c806301ffc9a7146100bf578063248a9ca3146100e75780632f2ff15d1461010857806336568abe1461011d57806350d17b5e1461013057806375b238fc1461015b57806391d14854146101825780639dca003214610195578063a217fddf146101b6578063a32c2b99146101be578063b24ed308146101df578063d547741f14610206578063f95d71b114610219578063fe89c9701461022c575b600080fd5b6100d26100cd36600461098d565b610252565b60405190151581526020015b60405180910390f35b6100fa6100f53660046109b7565b610289565b6040519081526020016100de565b61011b6101163660046109e5565b61029e565b005b61011b61012b3660046109e5565b6102bf565b600154610143906001600160a01b031681565b6040516001600160a01b0390911681526020016100de565b6100fa7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b6100d26101903660046109e5565b610342565b6001546101a990600160a01b900460ff1681565b6040516100de9190610a37565b6100fa600081565b6101d16101cc366004610ada565b61036b565b6040516100de929190610c92565b6100fa7f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d981565b61011b6102143660046109e5565b6104f6565b61011b610227366004610cb5565b610512565b6100fa7ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c6481565b60006001600160e01b03198216637965db0b60e01b148061028357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60009081526020819052604090206001015490565b6102a782610289565b6102b08161055f565b6102ba838361056c565b505050565b6001600160a01b03811633146103345760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61033e82826105f0565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60006060600061037c868686610655565b905060008160008151811061039357610393610cd2565b01602001516001600160f81b0319166000036103d057507f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d96103f2565b507ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c645b600154604051634746fe8b60e11b81526000916001600160a01b03811691638e8dfd169161042f918691600160a01b900460ff1690600401610ce8565b602060405180830381865afa15801561044c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104709190610cfc565b90506000816001600160a01b031663ec723367856040518263ffffffff1660e01b81526004016104a09190610d19565b600060405180830381865afa1580156104bd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104e59190810190610d2c565b60019a909950975050505050505050565b6104ff82610289565b6105088161055f565b6102ba83836105f0565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261053c8161055f565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6105698133610787565b50565b6105768282610342565b61033e576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556105ac3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6105fa8282610342565b1561033e576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60408051600080825260208201909252606091805b85518110156106ef578486828151811061068657610686610cd2565b602002602001015160200151036106e757828682815181106106aa576106aa610cd2565b6020026020010151600001516040516020016106c7929190610da2565b604051602081830303815290604052925081806106e390610de7565b9250505b60010161066a565b5083600203610701576001935061070e565b8360030361070e57600093505b60006040518060600160405280602b8152602001610f37602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061076590869086908f9087908b9088908f90602001610e0c565b60408051601f19818403018152919052985050505050505050505b9392505050565b6107918282610342565b61033e5761079e816107e0565b6107a98360206107f2565b6040516020016107ba929190610e86565b60408051601f198184030181529082905262461bcd60e51b825261032b91600401610d19565b60606102836001600160a01b03831660145b60606000610801836002610ef5565b61080c906002610f0c565b6001600160401b0381111561082357610823610a45565b6040519080825280601f01601f19166020018201604052801561084d576020820181803683370190505b509050600360fc1b8160008151811061086857610868610cd2565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061089757610897610cd2565b60200101906001600160f81b031916908160001a90535060006108bb846002610ef5565b6108c6906001610f0c565b90505b600181111561093e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106108fa576108fa610cd2565b1a60f81b82828151811061091057610910610cd2565b60200101906001600160f81b031916908160001a90535060049490941c9361093781610f1f565b90506108c9565b5083156107805760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161032b565b60006020828403121561099f57600080fd5b81356001600160e01b03198116811461078057600080fd5b6000602082840312156109c957600080fd5b5035919050565b6001600160a01b038116811461056957600080fd5b600080604083850312156109f857600080fd5b823591506020830135610a0a816109d0565b809150509250929050565b60038110610a3357634e487b7160e01b600052602160045260246000fd5b9052565b602081016102838284610a15565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610a7d57610a7d610a45565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610aab57610aab610a45565b604052919050565b60006001600160401b03821115610acc57610acc610a45565b50601f01601f191660200190565b600080600060608486031215610aef57600080fd5b8335925060208401356001600160401b03811115610b0c57600080fd5b8401601f81018613610b1d57600080fd5b80356001600160401b03811115610b3657610b36610a45565b8060051b610b4660208201610a83565b91825260208184018101929081019089841115610b6257600080fd5b6020850192505b83831015610c2d5782356001600160401b03811115610b8757600080fd5b85016040818c03601f19011215610b9d57600080fd5b610ba5610a5b565b60208201356001600160401b03811115610bbe57600080fd5b82016020810190603f018d13610bd357600080fd5b8035610be6610be182610ab3565b610a83565b8181528e6020838501011115610bfb57600080fd5b816020840160208301376000602092820183015283526040939093013582840152508352928301929190910190610b69565b96999698505050506040949094013593505050565b60005b83811015610c5d578181015183820152602001610c45565b50506000910152565b60008151808452610c7e816020860160208601610c42565b601f01601f19169290920160200192915050565b8215158152604060208201526000610cad6040830184610c66565b949350505050565b600060208284031215610cc757600080fd5b8135610780816109d0565b634e487b7160e01b600052603260045260246000fd5b828152604081016107806020830184610a15565b600060208284031215610d0e57600080fd5b8151610780816109d0565b6020815260006107806020830184610c66565b600060208284031215610d3e57600080fd5b81516001600160401b03811115610d5457600080fd5b8201601f81018413610d6557600080fd5b8051610d73610be182610ab3565b818152856020838501011115610d8857600080fd5b610d99826020830160208601610c42565b95945050505050565b60008351610db4818460208801610c42565b835190830190610dc8818360208801610c42565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff821663ffffffff8103610e0357610e03610dd1565b60010192915050565b6001600160f81b0319881681526001600160e01b0319878116600183015260058201879052851660258201528351600090610e4e816029850160208901610c42565b6001600160e01b031985166029918401918201528351610e7581602d840160208801610c42565b01602d019998505050505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351610eb8816017850160208801610c42565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610ee9816028840160208801610c42565b01602801949350505050565b808202811582820484141761028357610283610dd1565b8082018082111561028357610283610dd1565b600081610f2e57610f2e610dd1565b50600019019056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa2646970667358221220bdc8612bb25d7d879718d919f8d48a539a8f5aea688047d221856122dc78617064736f6c634300081c0033df8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ba5760003560e01c806301ffc9a7146100bf578063248a9ca3146100e75780632f2ff15d1461010857806336568abe1461011d57806350d17b5e1461013057806375b238fc1461015b57806391d14854146101825780639dca003214610195578063a217fddf146101b6578063a32c2b99146101be578063b24ed308146101df578063d547741f14610206578063f95d71b114610219578063fe89c9701461022c575b600080fd5b6100d26100cd36600461098d565b610252565b60405190151581526020015b60405180910390f35b6100fa6100f53660046109b7565b610289565b6040519081526020016100de565b61011b6101163660046109e5565b61029e565b005b61011b61012b3660046109e5565b6102bf565b600154610143906001600160a01b031681565b6040516001600160a01b0390911681526020016100de565b6100fa7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b6100d26101903660046109e5565b610342565b6001546101a990600160a01b900460ff1681565b6040516100de9190610a37565b6100fa600081565b6101d16101cc366004610ada565b61036b565b6040516100de929190610c92565b6100fa7f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d981565b61011b6102143660046109e5565b6104f6565b61011b610227366004610cb5565b610512565b6100fa7ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c6481565b60006001600160e01b03198216637965db0b60e01b148061028357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60009081526020819052604090206001015490565b6102a782610289565b6102b08161055f565b6102ba838361056c565b505050565b6001600160a01b03811633146103345760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61033e82826105f0565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60006060600061037c868686610655565b905060008160008151811061039357610393610cd2565b01602001516001600160f81b0319166000036103d057507f9a91862ef15434e2658e682752e743fa4975a117807df7f0eacab66e37e804d96103f2565b507ec348ef80e66d22f4440a90bf9643a03c82260d0dcca4286cf114cc97db0c645b600154604051634746fe8b60e11b81526000916001600160a01b03811691638e8dfd169161042f918691600160a01b900460ff1690600401610ce8565b602060405180830381865afa15801561044c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104709190610cfc565b90506000816001600160a01b031663ec723367856040518263ffffffff1660e01b81526004016104a09190610d19565b600060405180830381865afa1580156104bd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104e59190810190610d2c565b60019a909950975050505050505050565b6104ff82610289565b6105088161055f565b6102ba83836105f0565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261053c8161055f565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6105698133610787565b50565b6105768282610342565b61033e576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556105ac3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6105fa8282610342565b1561033e576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60408051600080825260208201909252606091805b85518110156106ef578486828151811061068657610686610cd2565b602002602001015160200151036106e757828682815181106106aa576106aa610cd2565b6020026020010151600001516040516020016106c7929190610da2565b604051602081830303815290604052925081806106e390610de7565b9250505b60010161066a565b5083600203610701576001935061070e565b8360030361070e57600093505b60006040518060600160405280602b8152602001610f37602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061076590869086908f9087908b9088908f90602001610e0c565b60408051601f19818403018152919052985050505050505050505b9392505050565b6107918282610342565b61033e5761079e816107e0565b6107a98360206107f2565b6040516020016107ba929190610e86565b60408051601f198184030181529082905262461bcd60e51b825261032b91600401610d19565b60606102836001600160a01b03831660145b60606000610801836002610ef5565b61080c906002610f0c565b6001600160401b0381111561082357610823610a45565b6040519080825280601f01601f19166020018201604052801561084d576020820181803683370190505b509050600360fc1b8160008151811061086857610868610cd2565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061089757610897610cd2565b60200101906001600160f81b031916908160001a90535060006108bb846002610ef5565b6108c6906001610f0c565b90505b600181111561093e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106108fa576108fa610cd2565b1a60f81b82828151811061091057610910610cd2565b60200101906001600160f81b031916908160001a90535060049490941c9361093781610f1f565b90506108c9565b5083156107805760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161032b565b60006020828403121561099f57600080fd5b81356001600160e01b03198116811461078057600080fd5b6000602082840312156109c957600080fd5b5035919050565b6001600160a01b038116811461056957600080fd5b600080604083850312156109f857600080fd5b823591506020830135610a0a816109d0565b809150509250929050565b60038110610a3357634e487b7160e01b600052602160045260246000fd5b9052565b602081016102838284610a15565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610a7d57610a7d610a45565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610aab57610aab610a45565b604052919050565b60006001600160401b03821115610acc57610acc610a45565b50601f01601f191660200190565b600080600060608486031215610aef57600080fd5b8335925060208401356001600160401b03811115610b0c57600080fd5b8401601f81018613610b1d57600080fd5b80356001600160401b03811115610b3657610b36610a45565b8060051b610b4660208201610a83565b91825260208184018101929081019089841115610b6257600080fd5b6020850192505b83831015610c2d5782356001600160401b03811115610b8757600080fd5b85016040818c03601f19011215610b9d57600080fd5b610ba5610a5b565b60208201356001600160401b03811115610bbe57600080fd5b82016020810190603f018d13610bd357600080fd5b8035610be6610be182610ab3565b610a83565b8181528e6020838501011115610bfb57600080fd5b816020840160208301376000602092820183015283526040939093013582840152508352928301929190910190610b69565b96999698505050506040949094013593505050565b60005b83811015610c5d578181015183820152602001610c45565b50506000910152565b60008151808452610c7e816020860160208601610c42565b601f01601f19169290920160200192915050565b8215158152604060208201526000610cad6040830184610c66565b949350505050565b600060208284031215610cc757600080fd5b8135610780816109d0565b634e487b7160e01b600052603260045260246000fd5b828152604081016107806020830184610a15565b600060208284031215610d0e57600080fd5b8151610780816109d0565b6020815260006107806020830184610c66565b600060208284031215610d3e57600080fd5b81516001600160401b03811115610d5457600080fd5b8201601f81018413610d6557600080fd5b8051610d73610be182610ab3565b818152856020838501011115610d8857600080fd5b610d99826020830160208601610c42565b95945050505050565b60008351610db4818460208801610c42565b835190830190610dc8818360208801610c42565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff821663ffffffff8103610e0357610e03610dd1565b60010192915050565b6001600160f81b0319881681526001600160e01b0319878116600183015260058201879052851660258201528351600090610e4e816029850160208901610c42565b6001600160e01b031985166029918401918201528351610e7581602d840160208801610c42565b01602d019998505050505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351610eb8816017850160208801610c42565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610ee9816028840160208801610c42565b01602801949350505050565b808202811582820484141761028357610283610dd1565b8082018082111561028357610283610dd1565b600081610f2e57610f2e610dd1565b50600019019056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa2646970667358221220bdc8612bb25d7d879718d919f8d48a539a8f5aea688047d221856122dc78617064736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/rust/lit-core/lit-blockchain/abis/BackupRecovery.json b/rust/lit-core/lit-blockchain/abis/BackupRecovery.json index 773b719c..da1f7d01 100644 --- a/rust/lit-core/lit-blockchain/abis/BackupRecovery.json +++ b/rust/lit-core/lit-blockchain/abis/BackupRecovery.json @@ -837,6 +837,11 @@ "internalType": "bytes", "name": "sessionId", "type": "bytes" + }, + { + "internalType": "string", + "name": "keySetId", + "type": "string" } ], "name": "registerRecoveryKeys", diff --git a/rust/lit-core/lit-blockchain/abis/ContractResolver.json b/rust/lit-core/lit-blockchain/abis/ContractResolver.json index e4bfde80..925faad3 100644 --- a/rust/lit-core/lit-blockchain/abis/ContractResolver.json +++ b/rust/lit-core/lit-blockchain/abis/ContractResolver.json @@ -392,6 +392,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "PUB_KEY_ROUTER_VIEWS_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "RATE_LIMIT_NFT_CONTRACT", @@ -684,8 +697,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5060405161146738038061146783398101604081905261002f916101e0565b610047600080516020611447833981519152336100e9565b61005f600080516020611447833981519152806100f7565b600180600083600281111561007657610076610208565b600281111561008757610087610208565b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece8015816040516100db919061021e565b60405180910390a150610246565b6100f38282610142565b5050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166100f3576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561019c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000602082840312156101f257600080fd5b81516003811061020157600080fd5b9392505050565b634e487b7160e01b600052602160045260246000fd5b602081016003831061024057634e487b7160e01b600052602160045260246000fd5b91905290565b6111f2806102556000396000f3fe608060405234801561001057600080fd5b50600436106101bc5760003560e01c80637cadf69f116100f55780637cadf69f146104175780637d4a03bd1461043e5780637d9d2880146104655780637f90209f1461048c57806385cb1191146104b35780638c1536df146104da5780638deb3893146105015780638e8dfd16146105145780639072f8381461052757806391d148541461054e578063977a807014610561578063a217fddf14610588578063ad1c8a8614610590578063cddcace5146105b7578063d547741f146105de578063da19ddfb146105f1578063df38069314610618578063f8ae93b41461063f57600080fd5b806301ffc9a7146101c157806311ee8ff7146101e957806316f76bbf1461021e5780631785f53c14610245578063219c266a1461025a578063248a9ca3146102815780632668f305146102945780632c0b8bf7146102bb5780632e4885e8146102e25780632f2ff15d1461030957806336568abe1461031c5780633ebf79851461032f5780634216e73a1461037b57806351ad0a80146103a25780635af27f79146103b557806370480275146103dc57806374bc8139146103ef57806375b238fc14610402575b600080fd5b6101d46101cf366004610eb1565b610666565b60405190151581526020015b60405180910390f35b6102107f58a0044e0ecd81025e398bf1815075d1234cbac3749614b0b33a404c2ee2babf81565b6040519081526020016101e0565b6102107ff14f431dadc82e7dbc5e379f71234e5735c9187e4327a7c6ac014d55d1b7727a81565b610258610253366004610ef7565b61069d565b005b6102107f4fd3e0487a0382fb027c77b1ae4c563672c9fb30a74879855f0c86c376cf96ea81565b61021061028f366004610f12565b61074e565b6102107fb1f79813bc7630a52ae948bc99781397e409d0dd3521953bf7d8d7a2db6147f781565b6102107fb7b4fde9944d3c13e9a78835431c33a5084d90a7f0c73def76d7886315fe87b081565b6102107fb931b2719aeb2a65a5035fa0a190bfdc4c8622ce8cbff7a3d1ab42531fb1a91881565b610258610317366004610f2b565b610763565b61025861032a366004610f2b565b610784565b61036361033d366004610f66565b60026020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b0390911681526020016101e0565b6102107f4c41ae454beb6bbbe9be50accc957a3b1536e48b835a86919af981b5244db75581565b6102586103b0366004610f89565b6107fe565b6102107fa2c73732de657ad0f36e0ddbb2710f4b13e8dde46421386bb92d1e179dae4d4d81565b6102586103ea366004610ef7565b610982565b6102586103fd366004610fc5565b6109b2565b61021060008051602061119d83398151915281565b6102107f74845de37cfabd357633214b47fa91ccd19b05b7c5a08ac22c187f811fb62bca81565b6102107f9f35ef3e0c2652a8bb8747d92f407fcd39a7768dacc7f16581c7a71f103e556281565b6102107fc26faedaeeda2fb94a66d786aa89c4a18bb790fa009d9da94a541d92185ca91681565b6102107fc6674f98ba35c01c130e08195dd26c70466037473a068c5aaa470a783d99c16c81565b6102107fae79a935737012d066e7183032692e521ffe1ade2beda267e23e02b1d6e9118781565b6102107faa06d108dbd7bf976b16b7bf5adb29d2d0ef2c385ca8b9d833cc802f33942d7281565b61025861050f366004610fc5565b610a6e565b610363610522366004610f66565b610b12565b6102107f54953c23068b8fc4c0736301b50f10027d6b469327de1fd42841a5072b1bcebe81565b6101d461055c366004610f2b565b610b68565b6102107f27d764ea2a4a3865434bbf4a391110149644be31448f3479fd15b4438875576581565b610210600081565b6102107f3a68dbfd8bbb64015c42bc131c388dea7965e28c1004d09b39f59500c3a763ec81565b6102107f0f27b9e46b89c5c742e28094dcefe5e946c3b98f0fbed87d9fcf5b10ba9684ec81565b6102586105ec366004610f2b565b610b91565b6102107f080909c18c958ce5a2d36481697824e477319323d03154ceba3b78f28a61887b81565b6102107fb4bf999b68d8085dbbf7a0ec2f5a2d660873935bdf1ed08eb421ac6dcbc0036281565b6102107fdd5b9b8a5e8e01f2962ed7e983d58fe32e1f66aa88dd7ab30770fa9b77da724381565b60006001600160e01b03198216637965db0b60e01b148061069757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008051602061119d8339815191526106b581610bad565b336001600160a01b038316036107325760405162461bcd60e51b815260206004820152603760248201527f43616e6e6f742072656d6f76652073656c662061732061646d696e2e202048616044820152763b32903a3432903732bb9030b236b4b71032379034ba1760491b60648201526084015b60405180910390fd5b61074a60008051602061119d83398151915283610bba565b5050565b60009081526020819052604090206001015490565b61076c8261074e565b61077581610bad565b61077f8383610c1f565b505050565b6001600160a01b03811633146107f45760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610729565b61074a8282610bba565b61081660008051602061119d83398151915233610b68565b610833576040516364487c2560e11b815260040160405180910390fd5b6001600083600281111561084957610849610fe0565b600281111561085a5761085a610fe0565b815260208101919091526040016000205460ff1615156001146108d75760405162461bcd60e51b815260206004820152602f60248201527f5468652070726f766964656420456e76206973206e6f742076616c696420666f60448201526e1c881d1a1a5cc818dbdb9d1c9858dd608a1b6064820152608401610729565b806002600085815260200190815260200160002060008460028111156108ff576108ff610fe0565b600281111561091057610910610fe0565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f33f014890f109229bbcf8dd47204c153a2c0ff1c572a61de220d10336530f53d83838360405161097593929190611018565b60405180910390a1505050565b60008051602061119d83398151915261099a81610bad565b61074a60008051602061119d83398151915283610c1f565b6109ca60008051602061119d83398151915233610b68565b6109e7576040516364487c2560e11b815260040160405180910390fd5b60018060008360028111156109fe576109fe610fe0565b6002811115610a0f57610a0f610fe0565b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece801581604051610a639190611045565b60405180910390a150565b610a8660008051602061119d83398151915233610b68565b610aa3576040516364487c2560e11b815260040160405180910390fd5b60016000826002811115610ab957610ab9610fe0565b6002811115610aca57610aca610fe0565b815260208101919091526040908101600020805460ff19169055517f3f178f17dae6caf8ca09c4857502baf7744e8597de42d6596476fe9e06b8ad4790610a63908390611045565b600082815260026020819052604082209082908490811115610b3657610b36610fe0565b6002811115610b4757610b47610fe0565b81526020810191909152604001600020546001600160a01b03169392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610b9a8261074e565b610ba381610bad565b61077f8383610bba565b610bb78133610ca3565b50565b610bc48282610b68565b1561074a576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610c298282610b68565b61074a576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610c5f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610cad8282610b68565b61074a57610cba81610cfc565b610cc5836020610d0e565b604051602001610cd6929190611077565b60408051601f198184030181529082905262461bcd60e51b8252610729916004016110e6565b60606106976001600160a01b03831660145b60606000610d1d83600261112f565b610d28906002611146565b67ffffffffffffffff811115610d4057610d40611159565b6040519080825280601f01601f191660200182016040528015610d6a576020820181803683370190505b509050600360fc1b81600081518110610d8557610d8561116f565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610db457610db461116f565b60200101906001600160f81b031916908160001a9053506000610dd884600261112f565b610de3906001611146565b90505b6001811115610e5b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610e1757610e1761116f565b1a60f81b828281518110610e2d57610e2d61116f565b60200101906001600160f81b031916908160001a90535060049490941c93610e5481611185565b9050610de6565b508315610eaa5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610729565b9392505050565b600060208284031215610ec357600080fd5b81356001600160e01b031981168114610eaa57600080fd5b80356001600160a01b0381168114610ef257600080fd5b919050565b600060208284031215610f0957600080fd5b610eaa82610edb565b600060208284031215610f2457600080fd5b5035919050565b60008060408385031215610f3e57600080fd5b82359150610f4e60208401610edb565b90509250929050565b803560038110610ef257600080fd5b60008060408385031215610f7957600080fd5b82359150610f4e60208401610f57565b600080600060608486031215610f9e57600080fd5b83359250610fae60208501610f57565b9150610fbc60408501610edb565b90509250925092565b600060208284031215610fd757600080fd5b610eaa82610f57565b634e487b7160e01b600052602160045260246000fd5b6003811061101457634e487b7160e01b600052602160045260246000fd5b9052565b8381526060810161102c6020830185610ff6565b6001600160a01b03929092166040919091015292915050565b602081016106978284610ff6565b60005b8381101561106e578181015183820152602001611056565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8152600083516110a9816017850160208801611053565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516110da816028840160208801611053565b01602801949350505050565b6020815260008251806020840152611105816040850160208701611053565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761069757610697611119565b8082018082111561069757610697611119565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008161119457611194611119565b50600019019056fedf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a2646970667358221220bcfb5aa3251ddf33a8736c9689bd99cea1df5baa0fac387c556913725825c97264736f6c634300081c0033df8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101bc5760003560e01c80637cadf69f116100f55780637cadf69f146104175780637d4a03bd1461043e5780637d9d2880146104655780637f90209f1461048c57806385cb1191146104b35780638c1536df146104da5780638deb3893146105015780638e8dfd16146105145780639072f8381461052757806391d148541461054e578063977a807014610561578063a217fddf14610588578063ad1c8a8614610590578063cddcace5146105b7578063d547741f146105de578063da19ddfb146105f1578063df38069314610618578063f8ae93b41461063f57600080fd5b806301ffc9a7146101c157806311ee8ff7146101e957806316f76bbf1461021e5780631785f53c14610245578063219c266a1461025a578063248a9ca3146102815780632668f305146102945780632c0b8bf7146102bb5780632e4885e8146102e25780632f2ff15d1461030957806336568abe1461031c5780633ebf79851461032f5780634216e73a1461037b57806351ad0a80146103a25780635af27f79146103b557806370480275146103dc57806374bc8139146103ef57806375b238fc14610402575b600080fd5b6101d46101cf366004610eb1565b610666565b60405190151581526020015b60405180910390f35b6102107f58a0044e0ecd81025e398bf1815075d1234cbac3749614b0b33a404c2ee2babf81565b6040519081526020016101e0565b6102107ff14f431dadc82e7dbc5e379f71234e5735c9187e4327a7c6ac014d55d1b7727a81565b610258610253366004610ef7565b61069d565b005b6102107f4fd3e0487a0382fb027c77b1ae4c563672c9fb30a74879855f0c86c376cf96ea81565b61021061028f366004610f12565b61074e565b6102107fb1f79813bc7630a52ae948bc99781397e409d0dd3521953bf7d8d7a2db6147f781565b6102107fb7b4fde9944d3c13e9a78835431c33a5084d90a7f0c73def76d7886315fe87b081565b6102107fb931b2719aeb2a65a5035fa0a190bfdc4c8622ce8cbff7a3d1ab42531fb1a91881565b610258610317366004610f2b565b610763565b61025861032a366004610f2b565b610784565b61036361033d366004610f66565b60026020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b0390911681526020016101e0565b6102107f4c41ae454beb6bbbe9be50accc957a3b1536e48b835a86919af981b5244db75581565b6102586103b0366004610f89565b6107fe565b6102107fa2c73732de657ad0f36e0ddbb2710f4b13e8dde46421386bb92d1e179dae4d4d81565b6102586103ea366004610ef7565b610982565b6102586103fd366004610fc5565b6109b2565b61021060008051602061119d83398151915281565b6102107f74845de37cfabd357633214b47fa91ccd19b05b7c5a08ac22c187f811fb62bca81565b6102107f9f35ef3e0c2652a8bb8747d92f407fcd39a7768dacc7f16581c7a71f103e556281565b6102107fc26faedaeeda2fb94a66d786aa89c4a18bb790fa009d9da94a541d92185ca91681565b6102107fc6674f98ba35c01c130e08195dd26c70466037473a068c5aaa470a783d99c16c81565b6102107fae79a935737012d066e7183032692e521ffe1ade2beda267e23e02b1d6e9118781565b6102107faa06d108dbd7bf976b16b7bf5adb29d2d0ef2c385ca8b9d833cc802f33942d7281565b61025861050f366004610fc5565b610a6e565b610363610522366004610f66565b610b12565b6102107f54953c23068b8fc4c0736301b50f10027d6b469327de1fd42841a5072b1bcebe81565b6101d461055c366004610f2b565b610b68565b6102107f27d764ea2a4a3865434bbf4a391110149644be31448f3479fd15b4438875576581565b610210600081565b6102107f3a68dbfd8bbb64015c42bc131c388dea7965e28c1004d09b39f59500c3a763ec81565b6102107f0f27b9e46b89c5c742e28094dcefe5e946c3b98f0fbed87d9fcf5b10ba9684ec81565b6102586105ec366004610f2b565b610b91565b6102107f080909c18c958ce5a2d36481697824e477319323d03154ceba3b78f28a61887b81565b6102107fb4bf999b68d8085dbbf7a0ec2f5a2d660873935bdf1ed08eb421ac6dcbc0036281565b6102107fdd5b9b8a5e8e01f2962ed7e983d58fe32e1f66aa88dd7ab30770fa9b77da724381565b60006001600160e01b03198216637965db0b60e01b148061069757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008051602061119d8339815191526106b581610bad565b336001600160a01b038316036107325760405162461bcd60e51b815260206004820152603760248201527f43616e6e6f742072656d6f76652073656c662061732061646d696e2e202048616044820152763b32903a3432903732bb9030b236b4b71032379034ba1760491b60648201526084015b60405180910390fd5b61074a60008051602061119d83398151915283610bba565b5050565b60009081526020819052604090206001015490565b61076c8261074e565b61077581610bad565b61077f8383610c1f565b505050565b6001600160a01b03811633146107f45760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610729565b61074a8282610bba565b61081660008051602061119d83398151915233610b68565b610833576040516364487c2560e11b815260040160405180910390fd5b6001600083600281111561084957610849610fe0565b600281111561085a5761085a610fe0565b815260208101919091526040016000205460ff1615156001146108d75760405162461bcd60e51b815260206004820152602f60248201527f5468652070726f766964656420456e76206973206e6f742076616c696420666f60448201526e1c881d1a1a5cc818dbdb9d1c9858dd608a1b6064820152608401610729565b806002600085815260200190815260200160002060008460028111156108ff576108ff610fe0565b600281111561091057610910610fe0565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f33f014890f109229bbcf8dd47204c153a2c0ff1c572a61de220d10336530f53d83838360405161097593929190611018565b60405180910390a1505050565b60008051602061119d83398151915261099a81610bad565b61074a60008051602061119d83398151915283610c1f565b6109ca60008051602061119d83398151915233610b68565b6109e7576040516364487c2560e11b815260040160405180910390fd5b60018060008360028111156109fe576109fe610fe0565b6002811115610a0f57610a0f610fe0565b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece801581604051610a639190611045565b60405180910390a150565b610a8660008051602061119d83398151915233610b68565b610aa3576040516364487c2560e11b815260040160405180910390fd5b60016000826002811115610ab957610ab9610fe0565b6002811115610aca57610aca610fe0565b815260208101919091526040908101600020805460ff19169055517f3f178f17dae6caf8ca09c4857502baf7744e8597de42d6596476fe9e06b8ad4790610a63908390611045565b600082815260026020819052604082209082908490811115610b3657610b36610fe0565b6002811115610b4757610b47610fe0565b81526020810191909152604001600020546001600160a01b03169392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610b9a8261074e565b610ba381610bad565b61077f8383610bba565b610bb78133610ca3565b50565b610bc48282610b68565b1561074a576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610c298282610b68565b61074a576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610c5f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610cad8282610b68565b61074a57610cba81610cfc565b610cc5836020610d0e565b604051602001610cd6929190611077565b60408051601f198184030181529082905262461bcd60e51b8252610729916004016110e6565b60606106976001600160a01b03831660145b60606000610d1d83600261112f565b610d28906002611146565b67ffffffffffffffff811115610d4057610d40611159565b6040519080825280601f01601f191660200182016040528015610d6a576020820181803683370190505b509050600360fc1b81600081518110610d8557610d8561116f565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610db457610db461116f565b60200101906001600160f81b031916908160001a9053506000610dd884600261112f565b610de3906001611146565b90505b6001811115610e5b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610e1757610e1761116f565b1a60f81b828281518110610e2d57610e2d61116f565b60200101906001600160f81b031916908160001a90535060049490941c93610e5481611185565b9050610de6565b508315610eaa5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610729565b9392505050565b600060208284031215610ec357600080fd5b81356001600160e01b031981168114610eaa57600080fd5b80356001600160a01b0381168114610ef257600080fd5b919050565b600060208284031215610f0957600080fd5b610eaa82610edb565b600060208284031215610f2457600080fd5b5035919050565b60008060408385031215610f3e57600080fd5b82359150610f4e60208401610edb565b90509250929050565b803560038110610ef257600080fd5b60008060408385031215610f7957600080fd5b82359150610f4e60208401610f57565b600080600060608486031215610f9e57600080fd5b83359250610fae60208501610f57565b9150610fbc60408501610edb565b90509250925092565b600060208284031215610fd757600080fd5b610eaa82610f57565b634e487b7160e01b600052602160045260246000fd5b6003811061101457634e487b7160e01b600052602160045260246000fd5b9052565b8381526060810161102c6020830185610ff6565b6001600160a01b03929092166040919091015292915050565b602081016106978284610ff6565b60005b8381101561106e578181015183820152602001611056565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8152600083516110a9816017850160208801611053565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516110da816028840160208801611053565b01602801949350505050565b6020815260008251806020840152611105816040850160208701611053565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761069757610697611119565b8082018082111561069757610697611119565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008161119457611194611119565b50600019019056fedf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a2646970667358221220bcfb5aa3251ddf33a8736c9689bd99cea1df5baa0fac387c556913725825c97264736f6c634300081c0033", + "bytecode": "0x608060405234801561001057600080fd5b5060405161149938038061149983398101604081905261002f916101e0565b610047600080516020611479833981519152336100e9565b61005f600080516020611479833981519152806100f7565b600180600083600281111561007657610076610208565b600281111561008757610087610208565b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece8015816040516100db919061021e565b60405180910390a150610246565b6100f38282610142565b5050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166100f3576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561019c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000602082840312156101f257600080fd5b81516003811061020157600080fd5b9392505050565b634e487b7160e01b600052602160045260246000fd5b602081016003831061024057634e487b7160e01b600052602160045260246000fd5b91905290565b611224806102556000396000f3fe608060405234801561001057600080fd5b50600436106101c75760003560e01c80637cadf69f116101005780637cadf69f146104225780637d4a03bd146104495780637d9d2880146104705780637f90209f1461049757806381d49578146104be57806385cb1191146104e55780638c1536df1461050c5780638deb3893146105335780638e8dfd16146105465780639072f8381461055957806391d1485414610580578063977a807014610593578063a217fddf146105ba578063ad1c8a86146105c2578063cddcace5146105e9578063d547741f14610610578063da19ddfb14610623578063df3806931461064a578063f8ae93b41461067157600080fd5b806301ffc9a7146101cc57806311ee8ff7146101f457806316f76bbf146102295780631785f53c14610250578063219c266a14610265578063248a9ca31461028c5780632668f3051461029f5780632c0b8bf7146102c65780632e4885e8146102ed5780632f2ff15d1461031457806336568abe146103275780633ebf79851461033a5780634216e73a1461038657806351ad0a80146103ad5780635af27f79146103c057806370480275146103e757806374bc8139146103fa57806375b238fc1461040d575b600080fd5b6101df6101da366004610ee3565b610698565b60405190151581526020015b60405180910390f35b61021b7f58a0044e0ecd81025e398bf1815075d1234cbac3749614b0b33a404c2ee2babf81565b6040519081526020016101eb565b61021b7ff14f431dadc82e7dbc5e379f71234e5735c9187e4327a7c6ac014d55d1b7727a81565b61026361025e366004610f29565b6106cf565b005b61021b7f4fd3e0487a0382fb027c77b1ae4c563672c9fb30a74879855f0c86c376cf96ea81565b61021b61029a366004610f44565b610780565b61021b7fb1f79813bc7630a52ae948bc99781397e409d0dd3521953bf7d8d7a2db6147f781565b61021b7fb7b4fde9944d3c13e9a78835431c33a5084d90a7f0c73def76d7886315fe87b081565b61021b7fb931b2719aeb2a65a5035fa0a190bfdc4c8622ce8cbff7a3d1ab42531fb1a91881565b610263610322366004610f5d565b610795565b610263610335366004610f5d565b6107b6565b61036e610348366004610f98565b60026020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b0390911681526020016101eb565b61021b7f4c41ae454beb6bbbe9be50accc957a3b1536e48b835a86919af981b5244db75581565b6102636103bb366004610fbb565b610830565b61021b7fa2c73732de657ad0f36e0ddbb2710f4b13e8dde46421386bb92d1e179dae4d4d81565b6102636103f5366004610f29565b6109b4565b610263610408366004610ff7565b6109e4565b61021b6000805160206111cf83398151915281565b61021b7f74845de37cfabd357633214b47fa91ccd19b05b7c5a08ac22c187f811fb62bca81565b61021b7f9f35ef3e0c2652a8bb8747d92f407fcd39a7768dacc7f16581c7a71f103e556281565b61021b7fc26faedaeeda2fb94a66d786aa89c4a18bb790fa009d9da94a541d92185ca91681565b61021b7fc6674f98ba35c01c130e08195dd26c70466037473a068c5aaa470a783d99c16c81565b61021b7f57496de430028f322c592b0f735110eb34f1ae8184a94bc51d40b0847b54469b81565b61021b7fae79a935737012d066e7183032692e521ffe1ade2beda267e23e02b1d6e9118781565b61021b7faa06d108dbd7bf976b16b7bf5adb29d2d0ef2c385ca8b9d833cc802f33942d7281565b610263610541366004610ff7565b610aa0565b61036e610554366004610f98565b610b44565b61021b7f54953c23068b8fc4c0736301b50f10027d6b469327de1fd42841a5072b1bcebe81565b6101df61058e366004610f5d565b610b9a565b61021b7f27d764ea2a4a3865434bbf4a391110149644be31448f3479fd15b4438875576581565b61021b600081565b61021b7f3a68dbfd8bbb64015c42bc131c388dea7965e28c1004d09b39f59500c3a763ec81565b61021b7f0f27b9e46b89c5c742e28094dcefe5e946c3b98f0fbed87d9fcf5b10ba9684ec81565b61026361061e366004610f5d565b610bc3565b61021b7f080909c18c958ce5a2d36481697824e477319323d03154ceba3b78f28a61887b81565b61021b7fb4bf999b68d8085dbbf7a0ec2f5a2d660873935bdf1ed08eb421ac6dcbc0036281565b61021b7fdd5b9b8a5e8e01f2962ed7e983d58fe32e1f66aa88dd7ab30770fa9b77da724381565b60006001600160e01b03198216637965db0b60e01b14806106c957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000805160206111cf8339815191526106e781610bdf565b336001600160a01b038316036107645760405162461bcd60e51b815260206004820152603760248201527f43616e6e6f742072656d6f76652073656c662061732061646d696e2e202048616044820152763b32903a3432903732bb9030b236b4b71032379034ba1760491b60648201526084015b60405180910390fd5b61077c6000805160206111cf83398151915283610bec565b5050565b60009081526020819052604090206001015490565b61079e82610780565b6107a781610bdf565b6107b18383610c51565b505050565b6001600160a01b03811633146108265760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161075b565b61077c8282610bec565b6108486000805160206111cf83398151915233610b9a565b610865576040516364487c2560e11b815260040160405180910390fd5b6001600083600281111561087b5761087b611012565b600281111561088c5761088c611012565b815260208101919091526040016000205460ff1615156001146109095760405162461bcd60e51b815260206004820152602f60248201527f5468652070726f766964656420456e76206973206e6f742076616c696420666f60448201526e1c881d1a1a5cc818dbdb9d1c9858dd608a1b606482015260840161075b565b8060026000858152602001908152602001600020600084600281111561093157610931611012565b600281111561094257610942611012565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f33f014890f109229bbcf8dd47204c153a2c0ff1c572a61de220d10336530f53d8383836040516109a79392919061104a565b60405180910390a1505050565b6000805160206111cf8339815191526109cc81610bdf565b61077c6000805160206111cf83398151915283610c51565b6109fc6000805160206111cf83398151915233610b9a565b610a19576040516364487c2560e11b815260040160405180910390fd5b6001806000836002811115610a3057610a30611012565b6002811115610a4157610a41611012565b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece801581604051610a959190611077565b60405180910390a150565b610ab86000805160206111cf83398151915233610b9a565b610ad5576040516364487c2560e11b815260040160405180910390fd5b60016000826002811115610aeb57610aeb611012565b6002811115610afc57610afc611012565b815260208101919091526040908101600020805460ff19169055517f3f178f17dae6caf8ca09c4857502baf7744e8597de42d6596476fe9e06b8ad4790610a95908390611077565b600082815260026020819052604082209082908490811115610b6857610b68611012565b6002811115610b7957610b79611012565b81526020810191909152604001600020546001600160a01b03169392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610bcc82610780565b610bd581610bdf565b6107b18383610bec565b610be98133610cd5565b50565b610bf68282610b9a565b1561077c576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610c5b8282610b9a565b61077c576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610c913390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610cdf8282610b9a565b61077c57610cec81610d2e565b610cf7836020610d40565b604051602001610d089291906110a9565b60408051601f198184030181529082905262461bcd60e51b825261075b91600401611118565b60606106c96001600160a01b03831660145b60606000610d4f836002611161565b610d5a906002611178565b67ffffffffffffffff811115610d7257610d7261118b565b6040519080825280601f01601f191660200182016040528015610d9c576020820181803683370190505b509050600360fc1b81600081518110610db757610db76111a1565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610de657610de66111a1565b60200101906001600160f81b031916908160001a9053506000610e0a846002611161565b610e15906001611178565b90505b6001811115610e8d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610e4957610e496111a1565b1a60f81b828281518110610e5f57610e5f6111a1565b60200101906001600160f81b031916908160001a90535060049490941c93610e86816111b7565b9050610e18565b508315610edc5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161075b565b9392505050565b600060208284031215610ef557600080fd5b81356001600160e01b031981168114610edc57600080fd5b80356001600160a01b0381168114610f2457600080fd5b919050565b600060208284031215610f3b57600080fd5b610edc82610f0d565b600060208284031215610f5657600080fd5b5035919050565b60008060408385031215610f7057600080fd5b82359150610f8060208401610f0d565b90509250929050565b803560038110610f2457600080fd5b60008060408385031215610fab57600080fd5b82359150610f8060208401610f89565b600080600060608486031215610fd057600080fd5b83359250610fe060208501610f89565b9150610fee60408501610f0d565b90509250925092565b60006020828403121561100957600080fd5b610edc82610f89565b634e487b7160e01b600052602160045260246000fd5b6003811061104657634e487b7160e01b600052602160045260246000fd5b9052565b8381526060810161105e6020830185611028565b6001600160a01b03929092166040919091015292915050565b602081016106c98284611028565b60005b838110156110a0578181015183820152602001611088565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8152600083516110db816017850160208801611085565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161110c816028840160208801611085565b01602801949350505050565b6020815260008251806020840152611137816040850160208701611085565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106c9576106c961114b565b808201808211156106c9576106c961114b565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816111c6576111c661114b565b50600019019056fedf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a264697066735822122065276870aecc95d0026a39a8a08dc1b9a726496c4d88b6456f2ac640543c468664736f6c634300081c0033df8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c75760003560e01c80637cadf69f116101005780637cadf69f146104225780637d4a03bd146104495780637d9d2880146104705780637f90209f1461049757806381d49578146104be57806385cb1191146104e55780638c1536df1461050c5780638deb3893146105335780638e8dfd16146105465780639072f8381461055957806391d1485414610580578063977a807014610593578063a217fddf146105ba578063ad1c8a86146105c2578063cddcace5146105e9578063d547741f14610610578063da19ddfb14610623578063df3806931461064a578063f8ae93b41461067157600080fd5b806301ffc9a7146101cc57806311ee8ff7146101f457806316f76bbf146102295780631785f53c14610250578063219c266a14610265578063248a9ca31461028c5780632668f3051461029f5780632c0b8bf7146102c65780632e4885e8146102ed5780632f2ff15d1461031457806336568abe146103275780633ebf79851461033a5780634216e73a1461038657806351ad0a80146103ad5780635af27f79146103c057806370480275146103e757806374bc8139146103fa57806375b238fc1461040d575b600080fd5b6101df6101da366004610ee3565b610698565b60405190151581526020015b60405180910390f35b61021b7f58a0044e0ecd81025e398bf1815075d1234cbac3749614b0b33a404c2ee2babf81565b6040519081526020016101eb565b61021b7ff14f431dadc82e7dbc5e379f71234e5735c9187e4327a7c6ac014d55d1b7727a81565b61026361025e366004610f29565b6106cf565b005b61021b7f4fd3e0487a0382fb027c77b1ae4c563672c9fb30a74879855f0c86c376cf96ea81565b61021b61029a366004610f44565b610780565b61021b7fb1f79813bc7630a52ae948bc99781397e409d0dd3521953bf7d8d7a2db6147f781565b61021b7fb7b4fde9944d3c13e9a78835431c33a5084d90a7f0c73def76d7886315fe87b081565b61021b7fb931b2719aeb2a65a5035fa0a190bfdc4c8622ce8cbff7a3d1ab42531fb1a91881565b610263610322366004610f5d565b610795565b610263610335366004610f5d565b6107b6565b61036e610348366004610f98565b60026020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b0390911681526020016101eb565b61021b7f4c41ae454beb6bbbe9be50accc957a3b1536e48b835a86919af981b5244db75581565b6102636103bb366004610fbb565b610830565b61021b7fa2c73732de657ad0f36e0ddbb2710f4b13e8dde46421386bb92d1e179dae4d4d81565b6102636103f5366004610f29565b6109b4565b610263610408366004610ff7565b6109e4565b61021b6000805160206111cf83398151915281565b61021b7f74845de37cfabd357633214b47fa91ccd19b05b7c5a08ac22c187f811fb62bca81565b61021b7f9f35ef3e0c2652a8bb8747d92f407fcd39a7768dacc7f16581c7a71f103e556281565b61021b7fc26faedaeeda2fb94a66d786aa89c4a18bb790fa009d9da94a541d92185ca91681565b61021b7fc6674f98ba35c01c130e08195dd26c70466037473a068c5aaa470a783d99c16c81565b61021b7f57496de430028f322c592b0f735110eb34f1ae8184a94bc51d40b0847b54469b81565b61021b7fae79a935737012d066e7183032692e521ffe1ade2beda267e23e02b1d6e9118781565b61021b7faa06d108dbd7bf976b16b7bf5adb29d2d0ef2c385ca8b9d833cc802f33942d7281565b610263610541366004610ff7565b610aa0565b61036e610554366004610f98565b610b44565b61021b7f54953c23068b8fc4c0736301b50f10027d6b469327de1fd42841a5072b1bcebe81565b6101df61058e366004610f5d565b610b9a565b61021b7f27d764ea2a4a3865434bbf4a391110149644be31448f3479fd15b4438875576581565b61021b600081565b61021b7f3a68dbfd8bbb64015c42bc131c388dea7965e28c1004d09b39f59500c3a763ec81565b61021b7f0f27b9e46b89c5c742e28094dcefe5e946c3b98f0fbed87d9fcf5b10ba9684ec81565b61026361061e366004610f5d565b610bc3565b61021b7f080909c18c958ce5a2d36481697824e477319323d03154ceba3b78f28a61887b81565b61021b7fb4bf999b68d8085dbbf7a0ec2f5a2d660873935bdf1ed08eb421ac6dcbc0036281565b61021b7fdd5b9b8a5e8e01f2962ed7e983d58fe32e1f66aa88dd7ab30770fa9b77da724381565b60006001600160e01b03198216637965db0b60e01b14806106c957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000805160206111cf8339815191526106e781610bdf565b336001600160a01b038316036107645760405162461bcd60e51b815260206004820152603760248201527f43616e6e6f742072656d6f76652073656c662061732061646d696e2e202048616044820152763b32903a3432903732bb9030b236b4b71032379034ba1760491b60648201526084015b60405180910390fd5b61077c6000805160206111cf83398151915283610bec565b5050565b60009081526020819052604090206001015490565b61079e82610780565b6107a781610bdf565b6107b18383610c51565b505050565b6001600160a01b03811633146108265760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161075b565b61077c8282610bec565b6108486000805160206111cf83398151915233610b9a565b610865576040516364487c2560e11b815260040160405180910390fd5b6001600083600281111561087b5761087b611012565b600281111561088c5761088c611012565b815260208101919091526040016000205460ff1615156001146109095760405162461bcd60e51b815260206004820152602f60248201527f5468652070726f766964656420456e76206973206e6f742076616c696420666f60448201526e1c881d1a1a5cc818dbdb9d1c9858dd608a1b606482015260840161075b565b8060026000858152602001908152602001600020600084600281111561093157610931611012565b600281111561094257610942611012565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f33f014890f109229bbcf8dd47204c153a2c0ff1c572a61de220d10336530f53d8383836040516109a79392919061104a565b60405180910390a1505050565b6000805160206111cf8339815191526109cc81610bdf565b61077c6000805160206111cf83398151915283610c51565b6109fc6000805160206111cf83398151915233610b9a565b610a19576040516364487c2560e11b815260040160405180910390fd5b6001806000836002811115610a3057610a30611012565b6002811115610a4157610a41611012565b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece801581604051610a959190611077565b60405180910390a150565b610ab86000805160206111cf83398151915233610b9a565b610ad5576040516364487c2560e11b815260040160405180910390fd5b60016000826002811115610aeb57610aeb611012565b6002811115610afc57610afc611012565b815260208101919091526040908101600020805460ff19169055517f3f178f17dae6caf8ca09c4857502baf7744e8597de42d6596476fe9e06b8ad4790610a95908390611077565b600082815260026020819052604082209082908490811115610b6857610b68611012565b6002811115610b7957610b79611012565b81526020810191909152604001600020546001600160a01b03169392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610bcc82610780565b610bd581610bdf565b6107b18383610bec565b610be98133610cd5565b50565b610bf68282610b9a565b1561077c576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610c5b8282610b9a565b61077c576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610c913390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610cdf8282610b9a565b61077c57610cec81610d2e565b610cf7836020610d40565b604051602001610d089291906110a9565b60408051601f198184030181529082905262461bcd60e51b825261075b91600401611118565b60606106c96001600160a01b03831660145b60606000610d4f836002611161565b610d5a906002611178565b67ffffffffffffffff811115610d7257610d7261118b565b6040519080825280601f01601f191660200182016040528015610d9c576020820181803683370190505b509050600360fc1b81600081518110610db757610db76111a1565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610de657610de66111a1565b60200101906001600160f81b031916908160001a9053506000610e0a846002611161565b610e15906001611178565b90505b6001811115610e8d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610e4957610e496111a1565b1a60f81b828281518110610e5f57610e5f6111a1565b60200101906001600160f81b031916908160001a90535060049490941c93610e86816111b7565b9050610e18565b508315610edc5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161075b565b9392505050565b600060208284031215610ef557600080fd5b81356001600160e01b031981168114610edc57600080fd5b80356001600160a01b0381168114610f2457600080fd5b919050565b600060208284031215610f3b57600080fd5b610edc82610f0d565b600060208284031215610f5657600080fd5b5035919050565b60008060408385031215610f7057600080fd5b82359150610f8060208401610f0d565b90509250929050565b803560038110610f2457600080fd5b60008060408385031215610fab57600080fd5b82359150610f8060208401610f89565b600080600060608486031215610fd057600080fd5b83359250610fe060208501610f89565b9150610fee60408501610f0d565b90509250925092565b60006020828403121561100957600080fd5b610edc82610f89565b634e487b7160e01b600052602160045260246000fd5b6003811061104657634e487b7160e01b600052602160045260246000fd5b9052565b8381526060810161105e6020830185611028565b6001600160a01b03929092166040919091015292915050565b602081016106c98284611028565b60005b838110156110a0578181015183820152602001611088565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8152600083516110db816017850160208801611085565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161110c816028840160208801611085565b01602801949350505050565b6020815260008251806020840152611137816040850160208701611085565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106c9576106c961114b565b808201808211156106c9576106c961114b565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816111c6576111c661114b565b50600019019056fedf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a264697066735822122065276870aecc95d0026a39a8a08dc1b9a726496c4d88b6456f2ac640543c468664736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/rust/lit-core/lit-blockchain/abis/KeyDeriver.json b/rust/lit-core/lit-blockchain/abis/KeyDeriver.json index ce2864be..54ba6738 100644 --- a/rust/lit-core/lit-blockchain/abis/KeyDeriver.json +++ b/rust/lit-core/lit-blockchain/abis/KeyDeriver.json @@ -68,8 +68,8 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600f57600080fd5b506105ee8061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806362e4c4641461003b578063a32c2b9914610060575b600080fd5b61004360f581565b6040516001600160a01b0390911681526020015b60405180910390f35b61007361006e36600461029e565b610081565b604051610057929190610443565b600060606000610092868686610100565b905060008060f56001600160a01b0316836040516100b0919061047f565b600060405180830381855afa9150503d80600081146100eb576040519150601f19603f3d011682016040523d82523d6000602084013e6100f0565b606091505b5090999098509650505050505050565b60408051600080825260208201909252606091805b855181101561019a57848682815181106101315761013161049b565b6020026020010151602001510361019257828682815181106101555761015561049b565b6020026020010151600001516040516020016101729291906104b1565b6040516020818303038152906040529250818061018e906104e0565b9250505b600101610115565b50836002036101ac57600193506101b9565b836003036101b957600093505b60006040518060600160405280602b815260200161058e602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061021090869086908f9087908b9088908f90602001610513565b60408051808303601f190181529190529c9b505050505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561026857610268610230565b60405290565b604051601f8201601f191681016001600160401b038111828210171561029657610296610230565b604052919050565b6000806000606084860312156102b357600080fd5b8335925060208401356001600160401b038111156102d057600080fd5b8401601f810186136102e157600080fd5b80356001600160401b038111156102fa576102fa610230565b8060051b61030a6020820161026e565b9182526020818401810192908101908984111561032657600080fd5b6020850192505b8383101561040a5782356001600160401b0381111561034b57600080fd5b85016040818c03601f1901121561036157600080fd5b610369610246565b60208201356001600160401b0381111561038257600080fd5b82016020810190603f018d1361039757600080fd5b80356001600160401b038111156103b0576103b0610230565b6103c3601f8201601f191660200161026e565b8181528e60208385010111156103d857600080fd5b81602084016020830137600060209282018301528352604093909301358284015250835292830192919091019061032d565b96999698505050506040949094013593505050565b60005b8381101561043a578181015183820152602001610422565b50506000910152565b8215158152604060208201526000825180604084015261046a81606085016020870161041f565b601f01601f1916919091016060019392505050565b6000825161049181846020870161041f565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b600083516104c381846020880161041f565b8351908301906104d781836020880161041f565b01949350505050565b600063ffffffff821663ffffffff810361050a57634e487b7160e01b600052601160045260246000fd5b60010192915050565b6001600160f81b0319881681526001600160e01b031987811660018301526005820187905285166025820152835160009061055581602985016020890161041f565b6001600160e01b03198516602991840191820152835161057c81602d84016020880161041f565b01602d01999850505050505050505056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa2646970667358221220b3f5d6acd5a7371344cacab05e607079ebf476b46d8b170419612f80e7a8ac9564736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806362e4c4641461003b578063a32c2b9914610060575b600080fd5b61004360f581565b6040516001600160a01b0390911681526020015b60405180910390f35b61007361006e36600461029e565b610081565b604051610057929190610443565b600060606000610092868686610100565b905060008060f56001600160a01b0316836040516100b0919061047f565b600060405180830381855afa9150503d80600081146100eb576040519150601f19603f3d011682016040523d82523d6000602084013e6100f0565b606091505b5090999098509650505050505050565b60408051600080825260208201909252606091805b855181101561019a57848682815181106101315761013161049b565b6020026020010151602001510361019257828682815181106101555761015561049b565b6020026020010151600001516040516020016101729291906104b1565b6040516020818303038152906040529250818061018e906104e0565b9250505b600101610115565b50836002036101ac57600193506101b9565b836003036101b957600093505b60006040518060600160405280602b815260200161058e602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061021090869086908f9087908b9088908f90602001610513565b60408051808303601f190181529190529c9b505050505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561026857610268610230565b60405290565b604051601f8201601f191681016001600160401b038111828210171561029657610296610230565b604052919050565b6000806000606084860312156102b357600080fd5b8335925060208401356001600160401b038111156102d057600080fd5b8401601f810186136102e157600080fd5b80356001600160401b038111156102fa576102fa610230565b8060051b61030a6020820161026e565b9182526020818401810192908101908984111561032657600080fd5b6020850192505b8383101561040a5782356001600160401b0381111561034b57600080fd5b85016040818c03601f1901121561036157600080fd5b610369610246565b60208201356001600160401b0381111561038257600080fd5b82016020810190603f018d1361039757600080fd5b80356001600160401b038111156103b0576103b0610230565b6103c3601f8201601f191660200161026e565b8181528e60208385010111156103d857600080fd5b81602084016020830137600060209282018301528352604093909301358284015250835292830192919091019061032d565b96999698505050506040949094013593505050565b60005b8381101561043a578181015183820152602001610422565b50506000910152565b8215158152604060208201526000825180604084015261046a81606085016020870161041f565b601f01601f1916919091016060019392505050565b6000825161049181846020870161041f565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b600083516104c381846020880161041f565b8351908301906104d781836020880161041f565b01949350505050565b600063ffffffff821663ffffffff810361050a57634e487b7160e01b600052601160045260246000fd5b60010192915050565b6001600160f81b0319881681526001600160e01b031987811660018301526005820187905285166025820152835160009061055581602985016020890161041f565b6001600160e01b03198516602991840191820152835161057c81602d84016020880161041f565b01602d01999850505050505050505056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa2646970667358221220b3f5d6acd5a7371344cacab05e607079ebf476b46d8b170419612f80e7a8ac9564736f6c634300081c0033", + "bytecode": "0x6080604052348015600f57600080fd5b506105ee8061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806362e4c4641461003b578063a32c2b9914610060575b600080fd5b61004360f581565b6040516001600160a01b0390911681526020015b60405180910390f35b61007361006e36600461029e565b610081565b604051610057929190610443565b600060606000610092868686610100565b905060008060f56001600160a01b0316836040516100b0919061047f565b600060405180830381855afa9150503d80600081146100eb576040519150601f19603f3d011682016040523d82523d6000602084013e6100f0565b606091505b5090999098509650505050505050565b60408051600080825260208201909252606091805b855181101561019a57848682815181106101315761013161049b565b6020026020010151602001510361019257828682815181106101555761015561049b565b6020026020010151600001516040516020016101729291906104b1565b6040516020818303038152906040529250818061018e906104e0565b9250505b600101610115565b50836002036101ac57600193506101b9565b836003036101b957600093505b60006040518060600160405280602b815260200161058e602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061021090869086908f9087908b9088908f90602001610513565b60408051808303601f190181529190529c9b505050505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561026857610268610230565b60405290565b604051601f8201601f191681016001600160401b038111828210171561029657610296610230565b604052919050565b6000806000606084860312156102b357600080fd5b8335925060208401356001600160401b038111156102d057600080fd5b8401601f810186136102e157600080fd5b80356001600160401b038111156102fa576102fa610230565b8060051b61030a6020820161026e565b9182526020818401810192908101908984111561032657600080fd5b6020850192505b8383101561040a5782356001600160401b0381111561034b57600080fd5b85016040818c03601f1901121561036157600080fd5b610369610246565b60208201356001600160401b0381111561038257600080fd5b82016020810190603f018d1361039757600080fd5b80356001600160401b038111156103b0576103b0610230565b6103c3601f8201601f191660200161026e565b8181528e60208385010111156103d857600080fd5b81602084016020830137600060209282018301528352604093909301358284015250835292830192919091019061032d565b96999698505050506040949094013593505050565b60005b8381101561043a578181015183820152602001610422565b50506000910152565b8215158152604060208201526000825180604084015261046a81606085016020870161041f565b601f01601f1916919091016060019392505050565b6000825161049181846020870161041f565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b600083516104c381846020880161041f565b8351908301906104d781836020880161041f565b01949350505050565b600063ffffffff821663ffffffff810361050a57634e487b7160e01b600052601160045260246000fd5b60010192915050565b6001600160f81b0319881681526001600160e01b031987811660018301526005820187905285166025820152835160009061055581602985016020890161041f565b6001600160e01b03198516602991840191820152835161057c81602d84016020880161041f565b01602d01999850505050505050505056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa26469706673582212205d2e87924405c75a37cb3199109dc5847775ce28137c5e1ca405720cfa3bea3d64736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806362e4c4641461003b578063a32c2b9914610060575b600080fd5b61004360f581565b6040516001600160a01b0390911681526020015b60405180910390f35b61007361006e36600461029e565b610081565b604051610057929190610443565b600060606000610092868686610100565b905060008060f56001600160a01b0316836040516100b0919061047f565b600060405180830381855afa9150503d80600081146100eb576040519150601f19603f3d011682016040523d82523d6000602084013e6100f0565b606091505b5090999098509650505050505050565b60408051600080825260208201909252606091805b855181101561019a57848682815181106101315761013161049b565b6020026020010151602001510361019257828682815181106101555761015561049b565b6020026020010151600001516040516020016101729291906104b1565b6040516020818303038152906040529250818061018e906104e0565b9250505b600101610115565b50836002036101ac57600193506101b9565b836003036101b957600093505b60006040518060600160405280602b815260200161058e602b9139805160405191925060f887901b91600160e51b9160e090811b919086901b9060009061021090869086908f9087908b9088908f90602001610513565b60408051808303601f190181529190529c9b505050505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561026857610268610230565b60405290565b604051601f8201601f191681016001600160401b038111828210171561029657610296610230565b604052919050565b6000806000606084860312156102b357600080fd5b8335925060208401356001600160401b038111156102d057600080fd5b8401601f810186136102e157600080fd5b80356001600160401b038111156102fa576102fa610230565b8060051b61030a6020820161026e565b9182526020818401810192908101908984111561032657600080fd5b6020850192505b8383101561040a5782356001600160401b0381111561034b57600080fd5b85016040818c03601f1901121561036157600080fd5b610369610246565b60208201356001600160401b0381111561038257600080fd5b82016020810190603f018d1361039757600080fd5b80356001600160401b038111156103b0576103b0610230565b6103c3601f8201601f191660200161026e565b8181528e60208385010111156103d857600080fd5b81602084016020830137600060209282018301528352604093909301358284015250835292830192919091019061032d565b96999698505050506040949094013593505050565b60005b8381101561043a578181015183820152602001610422565b50506000910152565b8215158152604060208201526000825180604084015261046a81606085016020870161041f565b601f01601f1916919091016060019392505050565b6000825161049181846020870161041f565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b600083516104c381846020880161041f565b8351908301906104d781836020880161041f565b01949350505050565b600063ffffffff821663ffffffff810361050a57634e487b7160e01b600052601160045260246000fd5b60010192915050565b6001600160f81b0319881681526001600160e01b031987811660018301526005820187905285166025820152835160009061055581602985016020890161041f565b6001600160e01b03198516602991840191820152835161057c81602d84016020880161041f565b01602d01999850505050505050505056fe4c49545f48445f4b45595f49445f4b3235365f584d443a5348412d3235365f535357555f524f5f4e554c5fa26469706673582212205d2e87924405c75a37cb3199109dc5847775ce28137c5e1ca405720cfa3bea3d64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/rust/lit-core/lit-blockchain/abis/PKPHelper.json b/rust/lit-core/lit-blockchain/abis/PKPHelper.json index 69d8a2ca..3f6870d7 100644 --- a/rust/lit-core/lit-blockchain/abis/PKPHelper.json +++ b/rust/lit-core/lit-blockchain/abis/PKPHelper.json @@ -1007,8 +1007,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50604051613a76380380613a7683398101604081905261002f916100d5565b61003833610085565b600280546001600160a01b0384166001600160a01b03198216811783558392916001600160a81b03191617600160a01b83838111156100795761007961011f565b02179055505050610135565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080604083850312156100e857600080fd5b82516001600160a01b03811681146100ff57600080fd5b60208401519092506003811061011457600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b613932806101446000396000f3fe60806040526004361061014c5760003560e01c806373cc4111116100bc57806373cc4111146102f6578063778fe5721461030b578063782e2ea51461031e5780638da5cb5b1461033e57806391d148541461035357806391ee4fd5146103735780639dca003214610386578063a217fddf146103b4578063caead0c7146103c9578063d547741f146103de578063db0bf933146103fe578063e4f11df614610411578063f2fde38b14610424578063f95d71b11461044457600080fd5b806301ffc9a7146101515780630e9ed68b1461018657806313af411b146101a8578063150b7a02146101c9578063202f724f14610202578063248a9ca3146102155780632b553551146102355780632f2ff15d146102575780633276558c1461027757806336568abe1461028c5780635043026c146102ac57806350d17b5e146102c1578063715018a6146102e1575b600080fd5b34801561015d57600080fd5b5061017161016c366004612598565b610464565b60405190151581526020015b60405180910390f35b34801561019257600080fd5b5061019b61049b565b60405161017d91906125c2565b6101bb6101b6366004612b84565b610586565b60405190815260200161017d565b3480156101d557600080fd5b506101e96101e4366004612c32565b610603565b6040516001600160e01b0319909116815260200161017d565b6101bb610210366004612b84565b6106a7565b34801561022157600080fd5b506101bb610230366004612cd1565b6106ba565b34801561024157600080fd5b50610255610250366004612cd1565b6106d0565b005b34801561026357600080fd5b50610255610272366004612cea565b6108ab565b34801561028357600080fd5b5061019b6108cc565b34801561029857600080fd5b506102556102a7366004612cea565b61091e565b3480156102b857600080fd5b5061019b61099c565b3480156102cd57600080fd5b5060025461019b906001600160a01b031681565b3480156102ed57600080fd5b506102556109ee565b34801561030257600080fd5b5061019b610a02565b6101bb610319366004612d3a565b610a54565b34801561032a57600080fd5b50610255610339366004612fb8565b611066565b34801561034a57600080fd5b5061019b611289565b34801561035f57600080fd5b5061017161036e366004612cea565b611298565b6101bb610381366004612ff4565b6112c3565b34801561039257600080fd5b506002546103a790600160a01b900460ff1681565b60405161017d91906130f0565b3480156103c057600080fd5b506101bb600081565b3480156103d557600080fd5b5061019b611965565b3480156103ea57600080fd5b506102556103f9366004612cea565b6119b7565b6101bb61040c3660046130fe565b6119d3565b6101bb61041f36600461323b565b611fdd565b34801561043057600080fd5b5061025561043f36600461334d565b612130565b34801561045057600080fd5b5061025561045f36600461334d565b6121a9565b60006001600160e01b03198216637965db0b60e01b148061049557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002546040805163da19ddfb60e01b815290516000926001600160a01b031691638e8dfd1691839163da19ddfb9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610511919061336a565b60025460405160e084901b6001600160e01b03191681526105409291600160a01b900460ff1690600401613383565b602060405180830381865afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190613397565b905090565b6000806040518060a00160405280856000015181526020016040518060400160405280600c81526020016b6e6167612d6b65797365743160a01b815250815260200185602001518152602001856040015181526020016105e461049b565b6001600160a01b0316905290506105fb81846112c3565b949350505050565b600061060d611965565b6001600160a01b0316336001600160a01b0316146106955760405162461bcd60e51b815260206004820152603a60248201527f504b5048656c7065723a206f6e6c792061636365707473207472616e736665726044820152791cc8199c9bdb481d1a19481412d41391950818dbdb9d1c9858dd60321b60648201526084015b60405180910390fd5b50630a85bd0160e11b95945050505050565b60006106b38383610586565b9392505050565b6000908152600160208190526040909120015490565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa158015610722573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610746919061336a565b60025460405160e084901b6001600160e01b03191681526107759291600160a01b900460ff1690600401613383565b602060405180830381865afa158015610792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b69190613397565b6001600160a01b0316336001600160a01b0316146107e65760405162461bcd60e51b815260040161068c906133b4565b60006107f061099c565b60405163b63a767760e01b8152600481018490529091506001600160a01b0382169063b63a767790602401600060405180830381600087803b15801561083557600080fd5b505af1158015610849573d6000803e3d6000fd5b50506040516328cd10c760e11b8152600481018590526001600160a01b038416925063519a218e9150602401600060405180830381600087803b15801561088f57600080fd5b505af11580156108a3573d6000803e3d6000fd5b505050505050565b6108b4826106ba565b6108bd81612207565b6108c78383612211565b505050565b6002546040805163120e5f0760e31b815290516000926001600160a01b031691638e8dfd16918391639072f8389160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6001600160a01b038116331461098e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161068c565b610998828261227c565b5050565b600254604080516316f76bbf60e01b815290516000926001600160a01b031691638e8dfd169183916316f76bbf9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6109f66122e3565b610a006000612342565b565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b600080610a5f611965565b83516020850151604051633ff8069760e11b81526001600160a01b039390931692637ff00d2e923492610a9492600401613484565b60206040518083038185885af1158015610ab2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ad7919061336a565b905082606001515183604001515114610b025760405162461bcd60e51b815260040161068c9061349d565b8260a001515183608001515114610b2b5760405162461bcd60e51b815260040161068c906134f3565b8260e00151518360c001515114610b545760405162461bcd60e51b815260040161068c90613548565b826101000151518360c001515114610b7e5760405162461bcd60e51b815260040161068c90613591565b826101200151518360c001515114610ba85760405162461bcd60e51b815260040161068c906135dc565b60408301515115610c745760005b836040015151811015610c7257610bcb6108cc565b6001600160a01b0316638a4315788386604001518481518110610bf057610bf0613627565b602002602001015187606001518581518110610c0e57610c0e613627565b60200260200101516040518463ffffffff1660e01b8152600401610c3493929190613679565b600060405180830381600087803b158015610c4e57600080fd5b505af1158015610c62573d6000803e3d6000fd5b505060019092019150610bb69050565b505b60808301515115610d405760005b836080015151811015610d3e57610c976108cc565b6001600160a01b0316631663c1218386608001518481518110610cbc57610cbc613627565b60200260200101518760a001518581518110610cda57610cda613627565b60200260200101516040518463ffffffff1660e01b8152600401610d00939291906136ae565b600060405180830381600087803b158015610d1a57600080fd5b505af1158015610d2e573d6000803e3d6000fd5b505060019092019150610c829050565b505b60c08301515115610e625760005b8360c0015151811015610e6057610d636108cc565b6001600160a01b0316639dd4349b8360405180606001604052808860c001518681518110610d9357610d93613627565b602002602001015181526020018860e001518681518110610db657610db6613627565b602002602001015181526020018861010001518681518110610dda57610dda613627565b60200260200101518152508761012001518581518110610dfc57610dfc613627565b60200260200101516040518463ffffffff1660e01b8152600401610e22939291906136e1565b600060405180830381600087803b158015610e3c57600080fd5b505af1158015610e50573d6000803e3d6000fd5b505060019092019150610d4e9050565b505b6000610e6c6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401610e9991815260200190565b602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190613397565b905083610140015115610f7c57610eef6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015610f2a578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401610f49939291906136ae565b600060405180830381600087803b158015610f6357600080fd5b505af1158015610f77573d6000803e3d6000fd5b505050505b83610160015115610ff557610f8f611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401610fbe9392919061373f565b600060405180830381600087803b158015610fd857600080fd5b505af1158015610fec573d6000803e3d6000fd5b5050505061105f565b610ffd611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b815260040161102c9392919061373f565b600060405180830381600087803b15801561104657600080fd5b505af115801561105a573d6000803e3d6000fd5b505050505b5092915050565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa1580156110b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dc919061336a565b60025460405160e084901b6001600160e01b031916815261110b9291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c9190613397565b6001600160a01b0316336001600160a01b03161461117c5760405162461bcd60e51b815260040161068c906133b4565b600061118661099c565b8251909150156108c757806001600160a01b031663855eec2284846000815181106111b3576111b3613627565b60200260200101516040518363ffffffff1660e01b81526004016111d8929190613484565b600060405180830381600087803b1580156111f257600080fd5b505af1158015611206573d6000803e3d6000fd5b50505050806001600160a01b0316639000fee1848460018151811061122d5761122d613627565b60200260200101516040518363ffffffff1660e01b8152600401611252929190613484565b600060405180830381600087803b15801561126c57600080fd5b505af1158015611280573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b805182516000911461133d5760405162461bcd60e51b815260206004820152603e60248201527f504b5048656c7065723a20436c61696d206b65792074797065206d757374206d60448201527f617463682041757468204d6574686f642064617461206b657920747970650000606482015260840161068c565b60016000611349611965565b6001600160a01b03166371aa9acf3484886000015189602001518a604001518b606001518c608001516040518863ffffffff1660e01b815260040161139396959493929190613763565b60206040518083038185885af11580156113b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113d6919061336a565b9050836040015151846020015151146114015760405162461bcd60e51b815260040161068c9061349d565b8360800151518460600151511461142a5760405162461bcd60e51b815260040161068c906134f3565b8360c00151518460a0015151146114535760405162461bcd60e51b815260040161068c90613548565b8360e00151518460a00151511461147c5760405162461bcd60e51b815260040161068c90613591565b836101000151518460a0015151146114a65760405162461bcd60e51b815260040161068c906135dc565b602084015151156115725760005b846020015151811015611570576114c96108cc565b6001600160a01b0316638a43157883876020015184815181106114ee576114ee613627565b60200260200101518860400151858151811061150c5761150c613627565b60200260200101516040518463ffffffff1660e01b815260040161153293929190613679565b600060405180830381600087803b15801561154c57600080fd5b505af1158015611560573d6000803e3d6000fd5b5050600190920191506114b49050565b505b6060840151511561163e5760005b84606001515181101561163c576115956108cc565b6001600160a01b0316631663c12183876060015184815181106115ba576115ba613627565b6020026020010151886080015185815181106115d8576115d8613627565b60200260200101516040518463ffffffff1660e01b81526004016115fe939291906136ae565b600060405180830381600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b5050600190920191506115809050565b505b60a0840151511561175f5760005b8460a001515181101561175d576116616108cc565b6001600160a01b0316639dd4349b8360405180606001604052808960a00151868151811061169157611691613627565b602002602001015181526020018960c0015186815181106116b4576116b4613627565b602002602001015181526020018960e0015186815181106116d7576116d7613627565b602002602001015181525088610100015185815181106116f9576116f9613627565b60200260200101516040518463ffffffff1660e01b815260040161171f939291906136e1565b600060405180830381600087803b15801561173957600080fd5b505af115801561174d573d6000803e3d6000fd5b50506001909201915061164c9050565b505b60006117696108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b815260040161179691815260200190565b602060405180830381865afa1580156117b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d79190613397565b905084610120015115611879576117ec6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611827578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611846939291906136ae565b600060405180830381600087803b15801561186057600080fd5b505af1158015611874573d6000803e3d6000fd5b505050505b846101400151156118f25761188c611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b81526004016118bb9392919061373f565b600060405180830381600087803b1580156118d557600080fd5b505af11580156118e9573d6000803e3d6000fd5b5050505061195c565b6118fa611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b81526004016119299392919061373f565b600060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050505b50949350505050565b60025460408051632c0b8bf760e01b815290516000926001600160a01b031691638e8dfd16918391632c0b8bf79160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6119c0826106ba565b6119c981612207565b6108c7838361227c565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a49919061336a565b60025460405160e084901b6001600160e01b0319168152611a789291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab99190613397565b6001600160a01b0316336001600160a01b031614611ae95760405162461bcd60e51b815260040161068c906133b4565b6000611af3611965565b6001600160a01b0316637ff00d2e348d8d6040518463ffffffff1660e01b8152600401611b21929190613484565b60206040518083038185885af1158015611b3f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b64919061336a565b90508751895114611b875760405162461bcd60e51b815260040161068c90613548565b8651895114611ba85760405162461bcd60e51b815260040161068c90613591565b8551895114611bc95760405162461bcd60e51b815260040161068c906135dc565b885115611cd15760005b8951811015611ccf57611be46108cc565b6001600160a01b0316639dd4349b8360405180606001604052808e8681518110611c1057611c10613627565b602002602001015181526020018d8681518110611c2f57611c2f613627565b602002602001015181526020018c8681518110611c4e57611c4e613627565b60200260200101518152508a8581518110611c6b57611c6b613627565b60200260200101516040518463ffffffff1660e01b8152600401611c91939291906136e1565b600060405180830381600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b505060019092019150611bd39050565b505b6000611cdb6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401611d0891815260200190565b602060405180830381865afa158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190613397565b90508415611de657611d596108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611d94578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611db3939291906136ae565b600060405180830381600087803b158015611dcd57600080fd5b505af1158015611de1573d6000803e3d6000fd5b505050505b8315611e5a57611df4611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401611e239392919061373f565b600060405180830381600087803b158015611e3d57600080fd5b505af1158015611e51573d6000803e3d6000fd5b50505050611ec4565b611e62611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b8152600401611e919392919061373f565b600060405180830381600087803b158015611eab57600080fd5b505af1158015611ebf573d6000803e3d6000fd5b505050505b855115611fce57611ed361099c565b6001600160a01b031663855eec228388600081518110611ef557611ef5613627565b60200260200101516040518363ffffffff1660e01b8152600401611f1a929190613484565b600060405180830381600087803b158015611f3457600080fd5b505af1158015611f48573d6000803e3d6000fd5b50505050611f5461099c565b6001600160a01b0316639000fee18388600181518110611f7657611f76613627565b60200260200101516040518363ffffffff1660e01b8152600401611f9b929190613484565b600060405180830381600087803b158015611fb557600080fd5b505af1158015611fc9573d6000803e3d6000fd5b505050505b509a9950505050505050505050565b6000806040518061018001604052808b81526020018a815260200160006001600160401b03811115612011576120116125d6565b60405190808252806020026020018201604052801561204457816020015b606081526020019060019003908161202f5790505b508152602001600060405190808252806020026020018201604052801561207f57816020015b606081526020019060019003908161206a5790505b50815260200160006040519080825280602002602001820160405280156120b0578160200160208202803683370190505b50815260200160006040519080825280602002602001820160405280156120eb57816020015b60608152602001906001900390816120d65790505b5081526020018981526020018881526020018781526020018681526020018515158152602001841515815250905061212281610a54565b9a9950505050505050505050565b6121386122e3565b6001600160a01b03811661219d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068c565b6121a681612342565b50565b6121b16122e3565b600280546001600160a01b0319166001600160a01b0383161790556040517f2760073c7cd8cac531d7f643becbfbb74d8b8156443eacf879622532dbbb3cd5906121fc9083906125c2565b60405180910390a150565b6121a68133612392565b61221b8282611298565b6109985760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6122868282611298565b156109985760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b336122ec611289565b6001600160a01b031614610a005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161068c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61239c8282611298565b610998576123a9816123eb565b6123b48360206123fd565b6040516020016123c5929190613803565b60408051601f198184030181529082905262461bcd60e51b825261068c91600401613872565b60606104956001600160a01b03831660145b6060600061240c83600261389b565b6124179060026138b2565b6001600160401b0381111561242e5761242e6125d6565b6040519080825280601f01601f191660200182016040528015612458576020820181803683370190505b509050600360fc1b8160008151811061247357612473613627565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106124a2576124a2613627565b60200101906001600160f81b031916908160001a90535060006124c684600261389b565b6124d19060016138b2565b90505b6001811115612549576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061250557612505613627565b1a60f81b82828151811061251b5761251b613627565b60200101906001600160f81b031916908160001a90535060049490941c93612542816138c5565b90506124d4565b5083156106b35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161068c565b6000602082840312156125aa57600080fd5b81356001600160e01b0319811681146106b357600080fd5b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561260e5761260e6125d6565b60405290565b60405161016081016001600160401b038111828210171561260e5761260e6125d6565b60405161018081016001600160401b038111828210171561260e5761260e6125d6565b60405160a081016001600160401b038111828210171561260e5761260e6125d6565b604051601f8201601f191681016001600160401b03811182821017156126a4576126a46125d6565b604052919050565b60006001600160401b038211156126c5576126c56125d6565b5060051b60200190565b600082601f8301126126e057600080fd5b81356126f36126ee826126ac565b61267c565b8082825260208201915060206060840286010192508583111561271557600080fd5b602085015b83811015612771576060818803121561273257600080fd5b61273a6125ec565b8135815260208083013590820152604082013560ff8116811461275c57600080fd5b6040820152835260209092019160600161271a565b5095945050505050565b6000806001600160401b03841115612795576127956125d6565b50601f8301601f19166020016127aa8161267c565b9150508281528383830111156127bf57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126127e757600080fd5b81356127f56126ee826126ac565b8082825260208201915060208360051b86010192508583111561281757600080fd5b602085015b838110156127715780356001600160401b0381111561283a57600080fd5b8601603f8101881361284b57600080fd5b61285d8860208301356040840161277b565b8452506020928301920161281c565b600082601f83011261287d57600080fd5b813561288b6126ee826126ac565b8082825260208201915060208360051b8601019250858311156128ad57600080fd5b602085015b838110156127715780358352602092830192016128b2565b600082601f8301126128db57600080fd5b81356128e96126ee826126ac565b8082825260208201915060208360051b86010192508583111561290b57600080fd5b602085015b838110156127715780356001600160401b0381111561292e57600080fd5b61293d886020838a010161286c565b84525060209283019201612910565b6001600160a01b03811681146121a657600080fd5b600082601f83011261297257600080fd5b81356129806126ee826126ac565b8082825260208201915060208360051b8601019250858311156129a257600080fd5b602085015b838110156127715780356129ba8161294c565b8352602092830192016129a7565b803580151581146129d857600080fd5b919050565b600061016082840312156129f057600080fd5b6129f8612614565b82358152905060208201356001600160401b03811115612a1757600080fd5b612a23848285016127d6565b60208301525060408201356001600160401b03811115612a4257600080fd5b612a4e848285016128ca565b60408301525060608201356001600160401b03811115612a6d57600080fd5b612a7984828501612961565b60608301525060808201356001600160401b03811115612a9857600080fd5b612aa4848285016128ca565b60808301525060a08201356001600160401b03811115612ac357600080fd5b612acf8482850161286c565b60a08301525060c08201356001600160401b03811115612aee57600080fd5b612afa848285016127d6565b60c08301525060e08201356001600160401b03811115612b1957600080fd5b612b25848285016127d6565b60e0830152506101008201356001600160401b03811115612b4557600080fd5b612b51848285016128ca565b61010083015250612b6561012083016129c8565b610120820152612b7861014083016129c8565b61014082015292915050565b60008060408385031215612b9757600080fd5b82356001600160401b03811115612bad57600080fd5b830160608186031215612bbf57600080fd5b612bc76125ec565b813581526020808301359082015260408201356001600160401b03811115612bee57600080fd5b612bfa878285016126cf565b60408301525092505060208301356001600160401b03811115612c1c57600080fd5b612c28858286016129dd565b9150509250929050565b600080600080600060808688031215612c4a57600080fd5b8535612c558161294c565b94506020860135612c658161294c565b93506040860135925060608601356001600160401b03811115612c8757600080fd5b8601601f81018813612c9857600080fd5b80356001600160401b03811115612cae57600080fd5b886020828401011115612cc057600080fd5b959894975092955050506020019190565b600060208284031215612ce357600080fd5b5035919050565b60008060408385031215612cfd57600080fd5b823591506020830135612d0f8161294c565b809150509250929050565b600082601f830112612d2b57600080fd5b6106b38383356020850161277b565b600060208284031215612d4c57600080fd5b81356001600160401b03811115612d6257600080fd5b82016101808185031215612d7557600080fd5b612d7d612637565b8135815260208201356001600160401b03811115612d9a57600080fd5b612da686828501612d1a565b60208301525060408201356001600160401b03811115612dc557600080fd5b612dd1868285016127d6565b60408301525060608201356001600160401b03811115612df057600080fd5b612dfc868285016128ca565b60608301525060808201356001600160401b03811115612e1b57600080fd5b612e2786828501612961565b60808301525060a08201356001600160401b03811115612e4657600080fd5b612e52868285016128ca565b60a08301525060c08201356001600160401b03811115612e7157600080fd5b612e7d8682850161286c565b60c08301525060e08201356001600160401b03811115612e9c57600080fd5b612ea8868285016127d6565b60e0830152506101008201356001600160401b03811115612ec857600080fd5b612ed4868285016127d6565b610100830152506101208201356001600160401b03811115612ef557600080fd5b612f01868285016128ca565b61012083015250612f1561014083016129c8565b610140820152612f2861016083016129c8565b610160820152949350505050565b600082601f830112612f4757600080fd5b8135612f556126ee826126ac565b8082825260208201915060208360051b860101925085831115612f7757600080fd5b602085015b838110156127715780356001600160401b03811115612f9a57600080fd5b612fa9886020838a0101612d1a565b84525060209283019201612f7c565b60008060408385031215612fcb57600080fd5b8235915060208301356001600160401b03811115612fe857600080fd5b612c2885828601612f36565b6000806040838503121561300757600080fd5b82356001600160401b0381111561301d57600080fd5b830160a0818603121561302f57600080fd5b61303761265a565b8135815260208201356001600160401b0381111561305457600080fd5b61306087828501612d1a565b6020830152506040828101359082015260608201356001600160401b0381111561308957600080fd5b613095878285016126cf565b606083015250608082013591506130ab8261294c565b6080810191909152915060208301356001600160401b03811115612c1c57600080fd5b600381106130ec57634e487b7160e01b600052602160045260246000fd5b9052565b6020810161049582846130ce565b60008060008060008060008060006101208a8c03121561311d57600080fd5b8935985060208a01356001600160401b0381111561313a57600080fd5b6131468c828d01612d1a565b98505060408a01356001600160401b0381111561316257600080fd5b61316e8c828d0161286c565b97505060608a01356001600160401b0381111561318a57600080fd5b6131968c828d016127d6565b96505060808a01356001600160401b038111156131b257600080fd5b6131be8c828d016127d6565b95505060a08a01356001600160401b038111156131da57600080fd5b6131e68c828d016128ca565b94505060c08a01356001600160401b0381111561320257600080fd5b61320e8c828d01612f36565b93505061321d60e08b016129c8565b915061322c6101008b016129c8565b90509295985092959850929598565b600080600080600080600080610100898b03121561325857600080fd5b8835975060208901356001600160401b0381111561327557600080fd5b6132818b828c01612d1a565b97505060408901356001600160401b0381111561329d57600080fd5b6132a98b828c0161286c565b96505060608901356001600160401b038111156132c557600080fd5b6132d18b828c016127d6565b95505060808901356001600160401b038111156132ed57600080fd5b6132f98b828c016127d6565b94505060a08901356001600160401b0381111561331557600080fd5b6133218b828c016128ca565b93505061333060c08a016129c8565b915061333e60e08a016129c8565b90509295985092959890939650565b60006020828403121561335f57600080fd5b81356106b38161294c565b60006020828403121561337c57600080fd5b5051919050565b828152604081016106b360208301846130ce565b6000602082840312156133a957600080fd5b81516106b38161294c565b6020808252605a908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f6060820152796d61696e2077616c6c6574732c2077686f2061726520796f753f60301b608082015260a00190565b60005b8381101561344f578181015183820152602001613437565b50506000910152565b60008151808452613470816020860160208601613434565b601f01601f19169290920160200192915050565b8281526040602082015260006105fb6040830184613458565b60208082526036908201527f504b5048656c7065723a20697066732063696420616e642073636f70652061726040820152750e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d60531b606082015260800190565b60208082526035908201527f504b5048656c7065723a206164647265737320616e642073636f7065206172726040820152740c2f240d8cadccee8d0e640daeae6e840dac2e8c6d605b1b606082015260800190565b6020808252603b908201526000805160206138dd83398151915260408201527a0d2c840c2e4e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d602b1b606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f7075626b6579206172726179206c656e67746873206d757374206d6174636800606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f73636f706573206172726179206c656e67746873206d757374206d6174636800606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020840193506020830160005b8281101561366f578151865260209586019590910190600101613651565b5093949350505050565b8381526060602082015260006136926060830185613458565b82810360408401526136a4818561363d565b9695505050505050565b8381526001600160a01b03831660208201526060604082018190526000906136d89083018461363d565b95945050505050565b8381526060602082015282516060820152600060208401516060608084015261370d60c0840182613458565b90506040850151605f198483030160a085015261372a8282613458565b91505082810360408401526136a4818561363d565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015260c06040820152600061378260c0830187613458565b6060830186905282810360808401528451808252602080870192019060005b818110156137de578351805184526020810151602085015260ff6040820151166040850152506060830192506020840193506001810190506137a1565b50506001600160a01b03851660a085015291506137f89050565b979650505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351613835816017850160208801613434565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613866816028840160208801613434565b01602801949350505050565b6020815260006106b36020830184613458565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761049557610495613885565b8082018082111561049557610495613885565b6000816138d4576138d4613885565b50600019019056fe504b5048656c7065723a2061757468206d6574686f64207479706520616e6420a264697066735822122038295780a313e895b6dcea68e900a66f083bf36d7a4524b63cf8bf23e49d630d64736f6c634300081c0033", - "deployedBytecode": "0x60806040526004361061014c5760003560e01c806373cc4111116100bc57806373cc4111146102f6578063778fe5721461030b578063782e2ea51461031e5780638da5cb5b1461033e57806391d148541461035357806391ee4fd5146103735780639dca003214610386578063a217fddf146103b4578063caead0c7146103c9578063d547741f146103de578063db0bf933146103fe578063e4f11df614610411578063f2fde38b14610424578063f95d71b11461044457600080fd5b806301ffc9a7146101515780630e9ed68b1461018657806313af411b146101a8578063150b7a02146101c9578063202f724f14610202578063248a9ca3146102155780632b553551146102355780632f2ff15d146102575780633276558c1461027757806336568abe1461028c5780635043026c146102ac57806350d17b5e146102c1578063715018a6146102e1575b600080fd5b34801561015d57600080fd5b5061017161016c366004612598565b610464565b60405190151581526020015b60405180910390f35b34801561019257600080fd5b5061019b61049b565b60405161017d91906125c2565b6101bb6101b6366004612b84565b610586565b60405190815260200161017d565b3480156101d557600080fd5b506101e96101e4366004612c32565b610603565b6040516001600160e01b0319909116815260200161017d565b6101bb610210366004612b84565b6106a7565b34801561022157600080fd5b506101bb610230366004612cd1565b6106ba565b34801561024157600080fd5b50610255610250366004612cd1565b6106d0565b005b34801561026357600080fd5b50610255610272366004612cea565b6108ab565b34801561028357600080fd5b5061019b6108cc565b34801561029857600080fd5b506102556102a7366004612cea565b61091e565b3480156102b857600080fd5b5061019b61099c565b3480156102cd57600080fd5b5060025461019b906001600160a01b031681565b3480156102ed57600080fd5b506102556109ee565b34801561030257600080fd5b5061019b610a02565b6101bb610319366004612d3a565b610a54565b34801561032a57600080fd5b50610255610339366004612fb8565b611066565b34801561034a57600080fd5b5061019b611289565b34801561035f57600080fd5b5061017161036e366004612cea565b611298565b6101bb610381366004612ff4565b6112c3565b34801561039257600080fd5b506002546103a790600160a01b900460ff1681565b60405161017d91906130f0565b3480156103c057600080fd5b506101bb600081565b3480156103d557600080fd5b5061019b611965565b3480156103ea57600080fd5b506102556103f9366004612cea565b6119b7565b6101bb61040c3660046130fe565b6119d3565b6101bb61041f36600461323b565b611fdd565b34801561043057600080fd5b5061025561043f36600461334d565b612130565b34801561045057600080fd5b5061025561045f36600461334d565b6121a9565b60006001600160e01b03198216637965db0b60e01b148061049557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002546040805163da19ddfb60e01b815290516000926001600160a01b031691638e8dfd1691839163da19ddfb9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610511919061336a565b60025460405160e084901b6001600160e01b03191681526105409291600160a01b900460ff1690600401613383565b602060405180830381865afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190613397565b905090565b6000806040518060a00160405280856000015181526020016040518060400160405280600c81526020016b6e6167612d6b65797365743160a01b815250815260200185602001518152602001856040015181526020016105e461049b565b6001600160a01b0316905290506105fb81846112c3565b949350505050565b600061060d611965565b6001600160a01b0316336001600160a01b0316146106955760405162461bcd60e51b815260206004820152603a60248201527f504b5048656c7065723a206f6e6c792061636365707473207472616e736665726044820152791cc8199c9bdb481d1a19481412d41391950818dbdb9d1c9858dd60321b60648201526084015b60405180910390fd5b50630a85bd0160e11b95945050505050565b60006106b38383610586565b9392505050565b6000908152600160208190526040909120015490565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa158015610722573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610746919061336a565b60025460405160e084901b6001600160e01b03191681526107759291600160a01b900460ff1690600401613383565b602060405180830381865afa158015610792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b69190613397565b6001600160a01b0316336001600160a01b0316146107e65760405162461bcd60e51b815260040161068c906133b4565b60006107f061099c565b60405163b63a767760e01b8152600481018490529091506001600160a01b0382169063b63a767790602401600060405180830381600087803b15801561083557600080fd5b505af1158015610849573d6000803e3d6000fd5b50506040516328cd10c760e11b8152600481018590526001600160a01b038416925063519a218e9150602401600060405180830381600087803b15801561088f57600080fd5b505af11580156108a3573d6000803e3d6000fd5b505050505050565b6108b4826106ba565b6108bd81612207565b6108c78383612211565b505050565b6002546040805163120e5f0760e31b815290516000926001600160a01b031691638e8dfd16918391639072f8389160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6001600160a01b038116331461098e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161068c565b610998828261227c565b5050565b600254604080516316f76bbf60e01b815290516000926001600160a01b031691638e8dfd169183916316f76bbf9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6109f66122e3565b610a006000612342565b565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b600080610a5f611965565b83516020850151604051633ff8069760e11b81526001600160a01b039390931692637ff00d2e923492610a9492600401613484565b60206040518083038185885af1158015610ab2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ad7919061336a565b905082606001515183604001515114610b025760405162461bcd60e51b815260040161068c9061349d565b8260a001515183608001515114610b2b5760405162461bcd60e51b815260040161068c906134f3565b8260e00151518360c001515114610b545760405162461bcd60e51b815260040161068c90613548565b826101000151518360c001515114610b7e5760405162461bcd60e51b815260040161068c90613591565b826101200151518360c001515114610ba85760405162461bcd60e51b815260040161068c906135dc565b60408301515115610c745760005b836040015151811015610c7257610bcb6108cc565b6001600160a01b0316638a4315788386604001518481518110610bf057610bf0613627565b602002602001015187606001518581518110610c0e57610c0e613627565b60200260200101516040518463ffffffff1660e01b8152600401610c3493929190613679565b600060405180830381600087803b158015610c4e57600080fd5b505af1158015610c62573d6000803e3d6000fd5b505060019092019150610bb69050565b505b60808301515115610d405760005b836080015151811015610d3e57610c976108cc565b6001600160a01b0316631663c1218386608001518481518110610cbc57610cbc613627565b60200260200101518760a001518581518110610cda57610cda613627565b60200260200101516040518463ffffffff1660e01b8152600401610d00939291906136ae565b600060405180830381600087803b158015610d1a57600080fd5b505af1158015610d2e573d6000803e3d6000fd5b505060019092019150610c829050565b505b60c08301515115610e625760005b8360c0015151811015610e6057610d636108cc565b6001600160a01b0316639dd4349b8360405180606001604052808860c001518681518110610d9357610d93613627565b602002602001015181526020018860e001518681518110610db657610db6613627565b602002602001015181526020018861010001518681518110610dda57610dda613627565b60200260200101518152508761012001518581518110610dfc57610dfc613627565b60200260200101516040518463ffffffff1660e01b8152600401610e22939291906136e1565b600060405180830381600087803b158015610e3c57600080fd5b505af1158015610e50573d6000803e3d6000fd5b505060019092019150610d4e9050565b505b6000610e6c6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401610e9991815260200190565b602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190613397565b905083610140015115610f7c57610eef6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015610f2a578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401610f49939291906136ae565b600060405180830381600087803b158015610f6357600080fd5b505af1158015610f77573d6000803e3d6000fd5b505050505b83610160015115610ff557610f8f611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401610fbe9392919061373f565b600060405180830381600087803b158015610fd857600080fd5b505af1158015610fec573d6000803e3d6000fd5b5050505061105f565b610ffd611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b815260040161102c9392919061373f565b600060405180830381600087803b15801561104657600080fd5b505af115801561105a573d6000803e3d6000fd5b505050505b5092915050565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa1580156110b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dc919061336a565b60025460405160e084901b6001600160e01b031916815261110b9291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c9190613397565b6001600160a01b0316336001600160a01b03161461117c5760405162461bcd60e51b815260040161068c906133b4565b600061118661099c565b8251909150156108c757806001600160a01b031663855eec2284846000815181106111b3576111b3613627565b60200260200101516040518363ffffffff1660e01b81526004016111d8929190613484565b600060405180830381600087803b1580156111f257600080fd5b505af1158015611206573d6000803e3d6000fd5b50505050806001600160a01b0316639000fee1848460018151811061122d5761122d613627565b60200260200101516040518363ffffffff1660e01b8152600401611252929190613484565b600060405180830381600087803b15801561126c57600080fd5b505af1158015611280573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b805182516000911461133d5760405162461bcd60e51b815260206004820152603e60248201527f504b5048656c7065723a20436c61696d206b65792074797065206d757374206d60448201527f617463682041757468204d6574686f642064617461206b657920747970650000606482015260840161068c565b60016000611349611965565b6001600160a01b03166371aa9acf3484886000015189602001518a604001518b606001518c608001516040518863ffffffff1660e01b815260040161139396959493929190613763565b60206040518083038185885af11580156113b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113d6919061336a565b9050836040015151846020015151146114015760405162461bcd60e51b815260040161068c9061349d565b8360800151518460600151511461142a5760405162461bcd60e51b815260040161068c906134f3565b8360c00151518460a0015151146114535760405162461bcd60e51b815260040161068c90613548565b8360e00151518460a00151511461147c5760405162461bcd60e51b815260040161068c90613591565b836101000151518460a0015151146114a65760405162461bcd60e51b815260040161068c906135dc565b602084015151156115725760005b846020015151811015611570576114c96108cc565b6001600160a01b0316638a43157883876020015184815181106114ee576114ee613627565b60200260200101518860400151858151811061150c5761150c613627565b60200260200101516040518463ffffffff1660e01b815260040161153293929190613679565b600060405180830381600087803b15801561154c57600080fd5b505af1158015611560573d6000803e3d6000fd5b5050600190920191506114b49050565b505b6060840151511561163e5760005b84606001515181101561163c576115956108cc565b6001600160a01b0316631663c12183876060015184815181106115ba576115ba613627565b6020026020010151886080015185815181106115d8576115d8613627565b60200260200101516040518463ffffffff1660e01b81526004016115fe939291906136ae565b600060405180830381600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b5050600190920191506115809050565b505b60a0840151511561175f5760005b8460a001515181101561175d576116616108cc565b6001600160a01b0316639dd4349b8360405180606001604052808960a00151868151811061169157611691613627565b602002602001015181526020018960c0015186815181106116b4576116b4613627565b602002602001015181526020018960e0015186815181106116d7576116d7613627565b602002602001015181525088610100015185815181106116f9576116f9613627565b60200260200101516040518463ffffffff1660e01b815260040161171f939291906136e1565b600060405180830381600087803b15801561173957600080fd5b505af115801561174d573d6000803e3d6000fd5b50506001909201915061164c9050565b505b60006117696108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b815260040161179691815260200190565b602060405180830381865afa1580156117b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d79190613397565b905084610120015115611879576117ec6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611827578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611846939291906136ae565b600060405180830381600087803b15801561186057600080fd5b505af1158015611874573d6000803e3d6000fd5b505050505b846101400151156118f25761188c611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b81526004016118bb9392919061373f565b600060405180830381600087803b1580156118d557600080fd5b505af11580156118e9573d6000803e3d6000fd5b5050505061195c565b6118fa611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b81526004016119299392919061373f565b600060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050505b50949350505050565b60025460408051632c0b8bf760e01b815290516000926001600160a01b031691638e8dfd16918391632c0b8bf79160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6119c0826106ba565b6119c981612207565b6108c7838361227c565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a49919061336a565b60025460405160e084901b6001600160e01b0319168152611a789291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab99190613397565b6001600160a01b0316336001600160a01b031614611ae95760405162461bcd60e51b815260040161068c906133b4565b6000611af3611965565b6001600160a01b0316637ff00d2e348d8d6040518463ffffffff1660e01b8152600401611b21929190613484565b60206040518083038185885af1158015611b3f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b64919061336a565b90508751895114611b875760405162461bcd60e51b815260040161068c90613548565b8651895114611ba85760405162461bcd60e51b815260040161068c90613591565b8551895114611bc95760405162461bcd60e51b815260040161068c906135dc565b885115611cd15760005b8951811015611ccf57611be46108cc565b6001600160a01b0316639dd4349b8360405180606001604052808e8681518110611c1057611c10613627565b602002602001015181526020018d8681518110611c2f57611c2f613627565b602002602001015181526020018c8681518110611c4e57611c4e613627565b60200260200101518152508a8581518110611c6b57611c6b613627565b60200260200101516040518463ffffffff1660e01b8152600401611c91939291906136e1565b600060405180830381600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b505060019092019150611bd39050565b505b6000611cdb6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401611d0891815260200190565b602060405180830381865afa158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190613397565b90508415611de657611d596108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611d94578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611db3939291906136ae565b600060405180830381600087803b158015611dcd57600080fd5b505af1158015611de1573d6000803e3d6000fd5b505050505b8315611e5a57611df4611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401611e239392919061373f565b600060405180830381600087803b158015611e3d57600080fd5b505af1158015611e51573d6000803e3d6000fd5b50505050611ec4565b611e62611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b8152600401611e919392919061373f565b600060405180830381600087803b158015611eab57600080fd5b505af1158015611ebf573d6000803e3d6000fd5b505050505b855115611fce57611ed361099c565b6001600160a01b031663855eec228388600081518110611ef557611ef5613627565b60200260200101516040518363ffffffff1660e01b8152600401611f1a929190613484565b600060405180830381600087803b158015611f3457600080fd5b505af1158015611f48573d6000803e3d6000fd5b50505050611f5461099c565b6001600160a01b0316639000fee18388600181518110611f7657611f76613627565b60200260200101516040518363ffffffff1660e01b8152600401611f9b929190613484565b600060405180830381600087803b158015611fb557600080fd5b505af1158015611fc9573d6000803e3d6000fd5b505050505b509a9950505050505050505050565b6000806040518061018001604052808b81526020018a815260200160006001600160401b03811115612011576120116125d6565b60405190808252806020026020018201604052801561204457816020015b606081526020019060019003908161202f5790505b508152602001600060405190808252806020026020018201604052801561207f57816020015b606081526020019060019003908161206a5790505b50815260200160006040519080825280602002602001820160405280156120b0578160200160208202803683370190505b50815260200160006040519080825280602002602001820160405280156120eb57816020015b60608152602001906001900390816120d65790505b5081526020018981526020018881526020018781526020018681526020018515158152602001841515815250905061212281610a54565b9a9950505050505050505050565b6121386122e3565b6001600160a01b03811661219d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068c565b6121a681612342565b50565b6121b16122e3565b600280546001600160a01b0319166001600160a01b0383161790556040517f2760073c7cd8cac531d7f643becbfbb74d8b8156443eacf879622532dbbb3cd5906121fc9083906125c2565b60405180910390a150565b6121a68133612392565b61221b8282611298565b6109985760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6122868282611298565b156109985760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b336122ec611289565b6001600160a01b031614610a005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161068c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61239c8282611298565b610998576123a9816123eb565b6123b48360206123fd565b6040516020016123c5929190613803565b60408051601f198184030181529082905262461bcd60e51b825261068c91600401613872565b60606104956001600160a01b03831660145b6060600061240c83600261389b565b6124179060026138b2565b6001600160401b0381111561242e5761242e6125d6565b6040519080825280601f01601f191660200182016040528015612458576020820181803683370190505b509050600360fc1b8160008151811061247357612473613627565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106124a2576124a2613627565b60200101906001600160f81b031916908160001a90535060006124c684600261389b565b6124d19060016138b2565b90505b6001811115612549576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061250557612505613627565b1a60f81b82828151811061251b5761251b613627565b60200101906001600160f81b031916908160001a90535060049490941c93612542816138c5565b90506124d4565b5083156106b35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161068c565b6000602082840312156125aa57600080fd5b81356001600160e01b0319811681146106b357600080fd5b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561260e5761260e6125d6565b60405290565b60405161016081016001600160401b038111828210171561260e5761260e6125d6565b60405161018081016001600160401b038111828210171561260e5761260e6125d6565b60405160a081016001600160401b038111828210171561260e5761260e6125d6565b604051601f8201601f191681016001600160401b03811182821017156126a4576126a46125d6565b604052919050565b60006001600160401b038211156126c5576126c56125d6565b5060051b60200190565b600082601f8301126126e057600080fd5b81356126f36126ee826126ac565b61267c565b8082825260208201915060206060840286010192508583111561271557600080fd5b602085015b83811015612771576060818803121561273257600080fd5b61273a6125ec565b8135815260208083013590820152604082013560ff8116811461275c57600080fd5b6040820152835260209092019160600161271a565b5095945050505050565b6000806001600160401b03841115612795576127956125d6565b50601f8301601f19166020016127aa8161267c565b9150508281528383830111156127bf57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126127e757600080fd5b81356127f56126ee826126ac565b8082825260208201915060208360051b86010192508583111561281757600080fd5b602085015b838110156127715780356001600160401b0381111561283a57600080fd5b8601603f8101881361284b57600080fd5b61285d8860208301356040840161277b565b8452506020928301920161281c565b600082601f83011261287d57600080fd5b813561288b6126ee826126ac565b8082825260208201915060208360051b8601019250858311156128ad57600080fd5b602085015b838110156127715780358352602092830192016128b2565b600082601f8301126128db57600080fd5b81356128e96126ee826126ac565b8082825260208201915060208360051b86010192508583111561290b57600080fd5b602085015b838110156127715780356001600160401b0381111561292e57600080fd5b61293d886020838a010161286c565b84525060209283019201612910565b6001600160a01b03811681146121a657600080fd5b600082601f83011261297257600080fd5b81356129806126ee826126ac565b8082825260208201915060208360051b8601019250858311156129a257600080fd5b602085015b838110156127715780356129ba8161294c565b8352602092830192016129a7565b803580151581146129d857600080fd5b919050565b600061016082840312156129f057600080fd5b6129f8612614565b82358152905060208201356001600160401b03811115612a1757600080fd5b612a23848285016127d6565b60208301525060408201356001600160401b03811115612a4257600080fd5b612a4e848285016128ca565b60408301525060608201356001600160401b03811115612a6d57600080fd5b612a7984828501612961565b60608301525060808201356001600160401b03811115612a9857600080fd5b612aa4848285016128ca565b60808301525060a08201356001600160401b03811115612ac357600080fd5b612acf8482850161286c565b60a08301525060c08201356001600160401b03811115612aee57600080fd5b612afa848285016127d6565b60c08301525060e08201356001600160401b03811115612b1957600080fd5b612b25848285016127d6565b60e0830152506101008201356001600160401b03811115612b4557600080fd5b612b51848285016128ca565b61010083015250612b6561012083016129c8565b610120820152612b7861014083016129c8565b61014082015292915050565b60008060408385031215612b9757600080fd5b82356001600160401b03811115612bad57600080fd5b830160608186031215612bbf57600080fd5b612bc76125ec565b813581526020808301359082015260408201356001600160401b03811115612bee57600080fd5b612bfa878285016126cf565b60408301525092505060208301356001600160401b03811115612c1c57600080fd5b612c28858286016129dd565b9150509250929050565b600080600080600060808688031215612c4a57600080fd5b8535612c558161294c565b94506020860135612c658161294c565b93506040860135925060608601356001600160401b03811115612c8757600080fd5b8601601f81018813612c9857600080fd5b80356001600160401b03811115612cae57600080fd5b886020828401011115612cc057600080fd5b959894975092955050506020019190565b600060208284031215612ce357600080fd5b5035919050565b60008060408385031215612cfd57600080fd5b823591506020830135612d0f8161294c565b809150509250929050565b600082601f830112612d2b57600080fd5b6106b38383356020850161277b565b600060208284031215612d4c57600080fd5b81356001600160401b03811115612d6257600080fd5b82016101808185031215612d7557600080fd5b612d7d612637565b8135815260208201356001600160401b03811115612d9a57600080fd5b612da686828501612d1a565b60208301525060408201356001600160401b03811115612dc557600080fd5b612dd1868285016127d6565b60408301525060608201356001600160401b03811115612df057600080fd5b612dfc868285016128ca565b60608301525060808201356001600160401b03811115612e1b57600080fd5b612e2786828501612961565b60808301525060a08201356001600160401b03811115612e4657600080fd5b612e52868285016128ca565b60a08301525060c08201356001600160401b03811115612e7157600080fd5b612e7d8682850161286c565b60c08301525060e08201356001600160401b03811115612e9c57600080fd5b612ea8868285016127d6565b60e0830152506101008201356001600160401b03811115612ec857600080fd5b612ed4868285016127d6565b610100830152506101208201356001600160401b03811115612ef557600080fd5b612f01868285016128ca565b61012083015250612f1561014083016129c8565b610140820152612f2861016083016129c8565b610160820152949350505050565b600082601f830112612f4757600080fd5b8135612f556126ee826126ac565b8082825260208201915060208360051b860101925085831115612f7757600080fd5b602085015b838110156127715780356001600160401b03811115612f9a57600080fd5b612fa9886020838a0101612d1a565b84525060209283019201612f7c565b60008060408385031215612fcb57600080fd5b8235915060208301356001600160401b03811115612fe857600080fd5b612c2885828601612f36565b6000806040838503121561300757600080fd5b82356001600160401b0381111561301d57600080fd5b830160a0818603121561302f57600080fd5b61303761265a565b8135815260208201356001600160401b0381111561305457600080fd5b61306087828501612d1a565b6020830152506040828101359082015260608201356001600160401b0381111561308957600080fd5b613095878285016126cf565b606083015250608082013591506130ab8261294c565b6080810191909152915060208301356001600160401b03811115612c1c57600080fd5b600381106130ec57634e487b7160e01b600052602160045260246000fd5b9052565b6020810161049582846130ce565b60008060008060008060008060006101208a8c03121561311d57600080fd5b8935985060208a01356001600160401b0381111561313a57600080fd5b6131468c828d01612d1a565b98505060408a01356001600160401b0381111561316257600080fd5b61316e8c828d0161286c565b97505060608a01356001600160401b0381111561318a57600080fd5b6131968c828d016127d6565b96505060808a01356001600160401b038111156131b257600080fd5b6131be8c828d016127d6565b95505060a08a01356001600160401b038111156131da57600080fd5b6131e68c828d016128ca565b94505060c08a01356001600160401b0381111561320257600080fd5b61320e8c828d01612f36565b93505061321d60e08b016129c8565b915061322c6101008b016129c8565b90509295985092959850929598565b600080600080600080600080610100898b03121561325857600080fd5b8835975060208901356001600160401b0381111561327557600080fd5b6132818b828c01612d1a565b97505060408901356001600160401b0381111561329d57600080fd5b6132a98b828c0161286c565b96505060608901356001600160401b038111156132c557600080fd5b6132d18b828c016127d6565b95505060808901356001600160401b038111156132ed57600080fd5b6132f98b828c016127d6565b94505060a08901356001600160401b0381111561331557600080fd5b6133218b828c016128ca565b93505061333060c08a016129c8565b915061333e60e08a016129c8565b90509295985092959890939650565b60006020828403121561335f57600080fd5b81356106b38161294c565b60006020828403121561337c57600080fd5b5051919050565b828152604081016106b360208301846130ce565b6000602082840312156133a957600080fd5b81516106b38161294c565b6020808252605a908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f6060820152796d61696e2077616c6c6574732c2077686f2061726520796f753f60301b608082015260a00190565b60005b8381101561344f578181015183820152602001613437565b50506000910152565b60008151808452613470816020860160208601613434565b601f01601f19169290920160200192915050565b8281526040602082015260006105fb6040830184613458565b60208082526036908201527f504b5048656c7065723a20697066732063696420616e642073636f70652061726040820152750e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d60531b606082015260800190565b60208082526035908201527f504b5048656c7065723a206164647265737320616e642073636f7065206172726040820152740c2f240d8cadccee8d0e640daeae6e840dac2e8c6d605b1b606082015260800190565b6020808252603b908201526000805160206138dd83398151915260408201527a0d2c840c2e4e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d602b1b606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f7075626b6579206172726179206c656e67746873206d757374206d6174636800606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f73636f706573206172726179206c656e67746873206d757374206d6174636800606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020840193506020830160005b8281101561366f578151865260209586019590910190600101613651565b5093949350505050565b8381526060602082015260006136926060830185613458565b82810360408401526136a4818561363d565b9695505050505050565b8381526001600160a01b03831660208201526060604082018190526000906136d89083018461363d565b95945050505050565b8381526060602082015282516060820152600060208401516060608084015261370d60c0840182613458565b90506040850151605f198483030160a085015261372a8282613458565b91505082810360408401526136a4818561363d565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015260c06040820152600061378260c0830187613458565b6060830186905282810360808401528451808252602080870192019060005b818110156137de578351805184526020810151602085015260ff6040820151166040850152506060830192506020840193506001810190506137a1565b50506001600160a01b03851660a085015291506137f89050565b979650505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351613835816017850160208801613434565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613866816028840160208801613434565b01602801949350505050565b6020815260006106b36020830184613458565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761049557610495613885565b8082018082111561049557610495613885565b6000816138d4576138d4613885565b50600019019056fe504b5048656c7065723a2061757468206d6574686f64207479706520616e6420a264697066735822122038295780a313e895b6dcea68e900a66f083bf36d7a4524b63cf8bf23e49d630d64736f6c634300081c0033", + "bytecode": "0x608060405234801561001057600080fd5b50604051613a76380380613a7683398101604081905261002f916100d5565b61003833610085565b600280546001600160a01b0384166001600160a01b03198216811783558392916001600160a81b03191617600160a01b83838111156100795761007961011f565b02179055505050610135565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080604083850312156100e857600080fd5b82516001600160a01b03811681146100ff57600080fd5b60208401519092506003811061011457600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b613932806101446000396000f3fe60806040526004361061014c5760003560e01c806373cc4111116100bc57806373cc4111146102f6578063778fe5721461030b578063782e2ea51461031e5780638da5cb5b1461033e57806391d148541461035357806391ee4fd5146103735780639dca003214610386578063a217fddf146103b4578063caead0c7146103c9578063d547741f146103de578063db0bf933146103fe578063e4f11df614610411578063f2fde38b14610424578063f95d71b11461044457600080fd5b806301ffc9a7146101515780630e9ed68b1461018657806313af411b146101a8578063150b7a02146101c9578063202f724f14610202578063248a9ca3146102155780632b553551146102355780632f2ff15d146102575780633276558c1461027757806336568abe1461028c5780635043026c146102ac57806350d17b5e146102c1578063715018a6146102e1575b600080fd5b34801561015d57600080fd5b5061017161016c366004612598565b610464565b60405190151581526020015b60405180910390f35b34801561019257600080fd5b5061019b61049b565b60405161017d91906125c2565b6101bb6101b6366004612b84565b610586565b60405190815260200161017d565b3480156101d557600080fd5b506101e96101e4366004612c32565b610603565b6040516001600160e01b0319909116815260200161017d565b6101bb610210366004612b84565b6106a7565b34801561022157600080fd5b506101bb610230366004612cd1565b6106ba565b34801561024157600080fd5b50610255610250366004612cd1565b6106d0565b005b34801561026357600080fd5b50610255610272366004612cea565b6108ab565b34801561028357600080fd5b5061019b6108cc565b34801561029857600080fd5b506102556102a7366004612cea565b61091e565b3480156102b857600080fd5b5061019b61099c565b3480156102cd57600080fd5b5060025461019b906001600160a01b031681565b3480156102ed57600080fd5b506102556109ee565b34801561030257600080fd5b5061019b610a02565b6101bb610319366004612d3a565b610a54565b34801561032a57600080fd5b50610255610339366004612fb8565b611066565b34801561034a57600080fd5b5061019b611289565b34801561035f57600080fd5b5061017161036e366004612cea565b611298565b6101bb610381366004612ff4565b6112c3565b34801561039257600080fd5b506002546103a790600160a01b900460ff1681565b60405161017d91906130f0565b3480156103c057600080fd5b506101bb600081565b3480156103d557600080fd5b5061019b611965565b3480156103ea57600080fd5b506102556103f9366004612cea565b6119b7565b6101bb61040c3660046130fe565b6119d3565b6101bb61041f36600461323b565b611fdd565b34801561043057600080fd5b5061025561043f36600461334d565b612130565b34801561045057600080fd5b5061025561045f36600461334d565b6121a9565b60006001600160e01b03198216637965db0b60e01b148061049557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002546040805163da19ddfb60e01b815290516000926001600160a01b031691638e8dfd1691839163da19ddfb9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610511919061336a565b60025460405160e084901b6001600160e01b03191681526105409291600160a01b900460ff1690600401613383565b602060405180830381865afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190613397565b905090565b6000806040518060a00160405280856000015181526020016040518060400160405280600c81526020016b6e6167612d6b65797365743160a01b815250815260200185602001518152602001856040015181526020016105e461049b565b6001600160a01b0316905290506105fb81846112c3565b949350505050565b600061060d611965565b6001600160a01b0316336001600160a01b0316146106955760405162461bcd60e51b815260206004820152603a60248201527f504b5048656c7065723a206f6e6c792061636365707473207472616e736665726044820152791cc8199c9bdb481d1a19481412d41391950818dbdb9d1c9858dd60321b60648201526084015b60405180910390fd5b50630a85bd0160e11b95945050505050565b60006106b38383610586565b9392505050565b6000908152600160208190526040909120015490565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa158015610722573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610746919061336a565b60025460405160e084901b6001600160e01b03191681526107759291600160a01b900460ff1690600401613383565b602060405180830381865afa158015610792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b69190613397565b6001600160a01b0316336001600160a01b0316146107e65760405162461bcd60e51b815260040161068c906133b4565b60006107f061099c565b60405163b63a767760e01b8152600481018490529091506001600160a01b0382169063b63a767790602401600060405180830381600087803b15801561083557600080fd5b505af1158015610849573d6000803e3d6000fd5b50506040516328cd10c760e11b8152600481018590526001600160a01b038416925063519a218e9150602401600060405180830381600087803b15801561088f57600080fd5b505af11580156108a3573d6000803e3d6000fd5b505050505050565b6108b4826106ba565b6108bd81612207565b6108c78383612211565b505050565b6002546040805163120e5f0760e31b815290516000926001600160a01b031691638e8dfd16918391639072f8389160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6001600160a01b038116331461098e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161068c565b610998828261227c565b5050565b600254604080516316f76bbf60e01b815290516000926001600160a01b031691638e8dfd169183916316f76bbf9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6109f66122e3565b610a006000612342565b565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b600080610a5f611965565b83516020850151604051633ff8069760e11b81526001600160a01b039390931692637ff00d2e923492610a9492600401613484565b60206040518083038185885af1158015610ab2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ad7919061336a565b905082606001515183604001515114610b025760405162461bcd60e51b815260040161068c9061349d565b8260a001515183608001515114610b2b5760405162461bcd60e51b815260040161068c906134f3565b8260e00151518360c001515114610b545760405162461bcd60e51b815260040161068c90613548565b826101000151518360c001515114610b7e5760405162461bcd60e51b815260040161068c90613591565b826101200151518360c001515114610ba85760405162461bcd60e51b815260040161068c906135dc565b60408301515115610c745760005b836040015151811015610c7257610bcb6108cc565b6001600160a01b0316638a4315788386604001518481518110610bf057610bf0613627565b602002602001015187606001518581518110610c0e57610c0e613627565b60200260200101516040518463ffffffff1660e01b8152600401610c3493929190613679565b600060405180830381600087803b158015610c4e57600080fd5b505af1158015610c62573d6000803e3d6000fd5b505060019092019150610bb69050565b505b60808301515115610d405760005b836080015151811015610d3e57610c976108cc565b6001600160a01b0316631663c1218386608001518481518110610cbc57610cbc613627565b60200260200101518760a001518581518110610cda57610cda613627565b60200260200101516040518463ffffffff1660e01b8152600401610d00939291906136ae565b600060405180830381600087803b158015610d1a57600080fd5b505af1158015610d2e573d6000803e3d6000fd5b505060019092019150610c829050565b505b60c08301515115610e625760005b8360c0015151811015610e6057610d636108cc565b6001600160a01b0316639dd4349b8360405180606001604052808860c001518681518110610d9357610d93613627565b602002602001015181526020018860e001518681518110610db657610db6613627565b602002602001015181526020018861010001518681518110610dda57610dda613627565b60200260200101518152508761012001518581518110610dfc57610dfc613627565b60200260200101516040518463ffffffff1660e01b8152600401610e22939291906136e1565b600060405180830381600087803b158015610e3c57600080fd5b505af1158015610e50573d6000803e3d6000fd5b505060019092019150610d4e9050565b505b6000610e6c6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401610e9991815260200190565b602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190613397565b905083610140015115610f7c57610eef6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015610f2a578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401610f49939291906136ae565b600060405180830381600087803b158015610f6357600080fd5b505af1158015610f77573d6000803e3d6000fd5b505050505b83610160015115610ff557610f8f611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401610fbe9392919061373f565b600060405180830381600087803b158015610fd857600080fd5b505af1158015610fec573d6000803e3d6000fd5b5050505061105f565b610ffd611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b815260040161102c9392919061373f565b600060405180830381600087803b15801561104657600080fd5b505af115801561105a573d6000803e3d6000fd5b505050505b5092915050565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa1580156110b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dc919061336a565b60025460405160e084901b6001600160e01b031916815261110b9291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c9190613397565b6001600160a01b0316336001600160a01b03161461117c5760405162461bcd60e51b815260040161068c906133b4565b600061118661099c565b8251909150156108c757806001600160a01b031663855eec2284846000815181106111b3576111b3613627565b60200260200101516040518363ffffffff1660e01b81526004016111d8929190613484565b600060405180830381600087803b1580156111f257600080fd5b505af1158015611206573d6000803e3d6000fd5b50505050806001600160a01b0316639000fee1848460018151811061122d5761122d613627565b60200260200101516040518363ffffffff1660e01b8152600401611252929190613484565b600060405180830381600087803b15801561126c57600080fd5b505af1158015611280573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b805182516000911461133d5760405162461bcd60e51b815260206004820152603e60248201527f504b5048656c7065723a20436c61696d206b65792074797065206d757374206d60448201527f617463682041757468204d6574686f642064617461206b657920747970650000606482015260840161068c565b60016000611349611965565b6001600160a01b03166371aa9acf3484886000015189602001518a604001518b606001518c608001516040518863ffffffff1660e01b815260040161139396959493929190613763565b60206040518083038185885af11580156113b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113d6919061336a565b9050836040015151846020015151146114015760405162461bcd60e51b815260040161068c9061349d565b8360800151518460600151511461142a5760405162461bcd60e51b815260040161068c906134f3565b8360c00151518460a0015151146114535760405162461bcd60e51b815260040161068c90613548565b8360e00151518460a00151511461147c5760405162461bcd60e51b815260040161068c90613591565b836101000151518460a0015151146114a65760405162461bcd60e51b815260040161068c906135dc565b602084015151156115725760005b846020015151811015611570576114c96108cc565b6001600160a01b0316638a43157883876020015184815181106114ee576114ee613627565b60200260200101518860400151858151811061150c5761150c613627565b60200260200101516040518463ffffffff1660e01b815260040161153293929190613679565b600060405180830381600087803b15801561154c57600080fd5b505af1158015611560573d6000803e3d6000fd5b5050600190920191506114b49050565b505b6060840151511561163e5760005b84606001515181101561163c576115956108cc565b6001600160a01b0316631663c12183876060015184815181106115ba576115ba613627565b6020026020010151886080015185815181106115d8576115d8613627565b60200260200101516040518463ffffffff1660e01b81526004016115fe939291906136ae565b600060405180830381600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b5050600190920191506115809050565b505b60a0840151511561175f5760005b8460a001515181101561175d576116616108cc565b6001600160a01b0316639dd4349b8360405180606001604052808960a00151868151811061169157611691613627565b602002602001015181526020018960c0015186815181106116b4576116b4613627565b602002602001015181526020018960e0015186815181106116d7576116d7613627565b602002602001015181525088610100015185815181106116f9576116f9613627565b60200260200101516040518463ffffffff1660e01b815260040161171f939291906136e1565b600060405180830381600087803b15801561173957600080fd5b505af115801561174d573d6000803e3d6000fd5b50506001909201915061164c9050565b505b60006117696108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b815260040161179691815260200190565b602060405180830381865afa1580156117b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d79190613397565b905084610120015115611879576117ec6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611827578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611846939291906136ae565b600060405180830381600087803b15801561186057600080fd5b505af1158015611874573d6000803e3d6000fd5b505050505b846101400151156118f25761188c611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b81526004016118bb9392919061373f565b600060405180830381600087803b1580156118d557600080fd5b505af11580156118e9573d6000803e3d6000fd5b5050505061195c565b6118fa611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b81526004016119299392919061373f565b600060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050505b50949350505050565b60025460408051632c0b8bf760e01b815290516000926001600160a01b031691638e8dfd16918391632c0b8bf79160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6119c0826106ba565b6119c981612207565b6108c7838361227c565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a49919061336a565b60025460405160e084901b6001600160e01b0319168152611a789291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab99190613397565b6001600160a01b0316336001600160a01b031614611ae95760405162461bcd60e51b815260040161068c906133b4565b6000611af3611965565b6001600160a01b0316637ff00d2e348d8d6040518463ffffffff1660e01b8152600401611b21929190613484565b60206040518083038185885af1158015611b3f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b64919061336a565b90508751895114611b875760405162461bcd60e51b815260040161068c90613548565b8651895114611ba85760405162461bcd60e51b815260040161068c90613591565b8551895114611bc95760405162461bcd60e51b815260040161068c906135dc565b885115611cd15760005b8951811015611ccf57611be46108cc565b6001600160a01b0316639dd4349b8360405180606001604052808e8681518110611c1057611c10613627565b602002602001015181526020018d8681518110611c2f57611c2f613627565b602002602001015181526020018c8681518110611c4e57611c4e613627565b60200260200101518152508a8581518110611c6b57611c6b613627565b60200260200101516040518463ffffffff1660e01b8152600401611c91939291906136e1565b600060405180830381600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b505060019092019150611bd39050565b505b6000611cdb6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401611d0891815260200190565b602060405180830381865afa158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190613397565b90508415611de657611d596108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611d94578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611db3939291906136ae565b600060405180830381600087803b158015611dcd57600080fd5b505af1158015611de1573d6000803e3d6000fd5b505050505b8315611e5a57611df4611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401611e239392919061373f565b600060405180830381600087803b158015611e3d57600080fd5b505af1158015611e51573d6000803e3d6000fd5b50505050611ec4565b611e62611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b8152600401611e919392919061373f565b600060405180830381600087803b158015611eab57600080fd5b505af1158015611ebf573d6000803e3d6000fd5b505050505b855115611fce57611ed361099c565b6001600160a01b031663855eec228388600081518110611ef557611ef5613627565b60200260200101516040518363ffffffff1660e01b8152600401611f1a929190613484565b600060405180830381600087803b158015611f3457600080fd5b505af1158015611f48573d6000803e3d6000fd5b50505050611f5461099c565b6001600160a01b0316639000fee18388600181518110611f7657611f76613627565b60200260200101516040518363ffffffff1660e01b8152600401611f9b929190613484565b600060405180830381600087803b158015611fb557600080fd5b505af1158015611fc9573d6000803e3d6000fd5b505050505b509a9950505050505050505050565b6000806040518061018001604052808b81526020018a815260200160006001600160401b03811115612011576120116125d6565b60405190808252806020026020018201604052801561204457816020015b606081526020019060019003908161202f5790505b508152602001600060405190808252806020026020018201604052801561207f57816020015b606081526020019060019003908161206a5790505b50815260200160006040519080825280602002602001820160405280156120b0578160200160208202803683370190505b50815260200160006040519080825280602002602001820160405280156120eb57816020015b60608152602001906001900390816120d65790505b5081526020018981526020018881526020018781526020018681526020018515158152602001841515815250905061212281610a54565b9a9950505050505050505050565b6121386122e3565b6001600160a01b03811661219d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068c565b6121a681612342565b50565b6121b16122e3565b600280546001600160a01b0319166001600160a01b0383161790556040517f2760073c7cd8cac531d7f643becbfbb74d8b8156443eacf879622532dbbb3cd5906121fc9083906125c2565b60405180910390a150565b6121a68133612392565b61221b8282611298565b6109985760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6122868282611298565b156109985760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b336122ec611289565b6001600160a01b031614610a005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161068c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61239c8282611298565b610998576123a9816123eb565b6123b48360206123fd565b6040516020016123c5929190613803565b60408051601f198184030181529082905262461bcd60e51b825261068c91600401613872565b60606104956001600160a01b03831660145b6060600061240c83600261389b565b6124179060026138b2565b6001600160401b0381111561242e5761242e6125d6565b6040519080825280601f01601f191660200182016040528015612458576020820181803683370190505b509050600360fc1b8160008151811061247357612473613627565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106124a2576124a2613627565b60200101906001600160f81b031916908160001a90535060006124c684600261389b565b6124d19060016138b2565b90505b6001811115612549576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061250557612505613627565b1a60f81b82828151811061251b5761251b613627565b60200101906001600160f81b031916908160001a90535060049490941c93612542816138c5565b90506124d4565b5083156106b35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161068c565b6000602082840312156125aa57600080fd5b81356001600160e01b0319811681146106b357600080fd5b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561260e5761260e6125d6565b60405290565b60405161016081016001600160401b038111828210171561260e5761260e6125d6565b60405161018081016001600160401b038111828210171561260e5761260e6125d6565b60405160a081016001600160401b038111828210171561260e5761260e6125d6565b604051601f8201601f191681016001600160401b03811182821017156126a4576126a46125d6565b604052919050565b60006001600160401b038211156126c5576126c56125d6565b5060051b60200190565b600082601f8301126126e057600080fd5b81356126f36126ee826126ac565b61267c565b8082825260208201915060206060840286010192508583111561271557600080fd5b602085015b83811015612771576060818803121561273257600080fd5b61273a6125ec565b8135815260208083013590820152604082013560ff8116811461275c57600080fd5b6040820152835260209092019160600161271a565b5095945050505050565b6000806001600160401b03841115612795576127956125d6565b50601f8301601f19166020016127aa8161267c565b9150508281528383830111156127bf57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126127e757600080fd5b81356127f56126ee826126ac565b8082825260208201915060208360051b86010192508583111561281757600080fd5b602085015b838110156127715780356001600160401b0381111561283a57600080fd5b8601603f8101881361284b57600080fd5b61285d8860208301356040840161277b565b8452506020928301920161281c565b600082601f83011261287d57600080fd5b813561288b6126ee826126ac565b8082825260208201915060208360051b8601019250858311156128ad57600080fd5b602085015b838110156127715780358352602092830192016128b2565b600082601f8301126128db57600080fd5b81356128e96126ee826126ac565b8082825260208201915060208360051b86010192508583111561290b57600080fd5b602085015b838110156127715780356001600160401b0381111561292e57600080fd5b61293d886020838a010161286c565b84525060209283019201612910565b6001600160a01b03811681146121a657600080fd5b600082601f83011261297257600080fd5b81356129806126ee826126ac565b8082825260208201915060208360051b8601019250858311156129a257600080fd5b602085015b838110156127715780356129ba8161294c565b8352602092830192016129a7565b803580151581146129d857600080fd5b919050565b600061016082840312156129f057600080fd5b6129f8612614565b82358152905060208201356001600160401b03811115612a1757600080fd5b612a23848285016127d6565b60208301525060408201356001600160401b03811115612a4257600080fd5b612a4e848285016128ca565b60408301525060608201356001600160401b03811115612a6d57600080fd5b612a7984828501612961565b60608301525060808201356001600160401b03811115612a9857600080fd5b612aa4848285016128ca565b60808301525060a08201356001600160401b03811115612ac357600080fd5b612acf8482850161286c565b60a08301525060c08201356001600160401b03811115612aee57600080fd5b612afa848285016127d6565b60c08301525060e08201356001600160401b03811115612b1957600080fd5b612b25848285016127d6565b60e0830152506101008201356001600160401b03811115612b4557600080fd5b612b51848285016128ca565b61010083015250612b6561012083016129c8565b610120820152612b7861014083016129c8565b61014082015292915050565b60008060408385031215612b9757600080fd5b82356001600160401b03811115612bad57600080fd5b830160608186031215612bbf57600080fd5b612bc76125ec565b813581526020808301359082015260408201356001600160401b03811115612bee57600080fd5b612bfa878285016126cf565b60408301525092505060208301356001600160401b03811115612c1c57600080fd5b612c28858286016129dd565b9150509250929050565b600080600080600060808688031215612c4a57600080fd5b8535612c558161294c565b94506020860135612c658161294c565b93506040860135925060608601356001600160401b03811115612c8757600080fd5b8601601f81018813612c9857600080fd5b80356001600160401b03811115612cae57600080fd5b886020828401011115612cc057600080fd5b959894975092955050506020019190565b600060208284031215612ce357600080fd5b5035919050565b60008060408385031215612cfd57600080fd5b823591506020830135612d0f8161294c565b809150509250929050565b600082601f830112612d2b57600080fd5b6106b38383356020850161277b565b600060208284031215612d4c57600080fd5b81356001600160401b03811115612d6257600080fd5b82016101808185031215612d7557600080fd5b612d7d612637565b8135815260208201356001600160401b03811115612d9a57600080fd5b612da686828501612d1a565b60208301525060408201356001600160401b03811115612dc557600080fd5b612dd1868285016127d6565b60408301525060608201356001600160401b03811115612df057600080fd5b612dfc868285016128ca565b60608301525060808201356001600160401b03811115612e1b57600080fd5b612e2786828501612961565b60808301525060a08201356001600160401b03811115612e4657600080fd5b612e52868285016128ca565b60a08301525060c08201356001600160401b03811115612e7157600080fd5b612e7d8682850161286c565b60c08301525060e08201356001600160401b03811115612e9c57600080fd5b612ea8868285016127d6565b60e0830152506101008201356001600160401b03811115612ec857600080fd5b612ed4868285016127d6565b610100830152506101208201356001600160401b03811115612ef557600080fd5b612f01868285016128ca565b61012083015250612f1561014083016129c8565b610140820152612f2861016083016129c8565b610160820152949350505050565b600082601f830112612f4757600080fd5b8135612f556126ee826126ac565b8082825260208201915060208360051b860101925085831115612f7757600080fd5b602085015b838110156127715780356001600160401b03811115612f9a57600080fd5b612fa9886020838a0101612d1a565b84525060209283019201612f7c565b60008060408385031215612fcb57600080fd5b8235915060208301356001600160401b03811115612fe857600080fd5b612c2885828601612f36565b6000806040838503121561300757600080fd5b82356001600160401b0381111561301d57600080fd5b830160a0818603121561302f57600080fd5b61303761265a565b8135815260208201356001600160401b0381111561305457600080fd5b61306087828501612d1a565b6020830152506040828101359082015260608201356001600160401b0381111561308957600080fd5b613095878285016126cf565b606083015250608082013591506130ab8261294c565b6080810191909152915060208301356001600160401b03811115612c1c57600080fd5b600381106130ec57634e487b7160e01b600052602160045260246000fd5b9052565b6020810161049582846130ce565b60008060008060008060008060006101208a8c03121561311d57600080fd5b8935985060208a01356001600160401b0381111561313a57600080fd5b6131468c828d01612d1a565b98505060408a01356001600160401b0381111561316257600080fd5b61316e8c828d0161286c565b97505060608a01356001600160401b0381111561318a57600080fd5b6131968c828d016127d6565b96505060808a01356001600160401b038111156131b257600080fd5b6131be8c828d016127d6565b95505060a08a01356001600160401b038111156131da57600080fd5b6131e68c828d016128ca565b94505060c08a01356001600160401b0381111561320257600080fd5b61320e8c828d01612f36565b93505061321d60e08b016129c8565b915061322c6101008b016129c8565b90509295985092959850929598565b600080600080600080600080610100898b03121561325857600080fd5b8835975060208901356001600160401b0381111561327557600080fd5b6132818b828c01612d1a565b97505060408901356001600160401b0381111561329d57600080fd5b6132a98b828c0161286c565b96505060608901356001600160401b038111156132c557600080fd5b6132d18b828c016127d6565b95505060808901356001600160401b038111156132ed57600080fd5b6132f98b828c016127d6565b94505060a08901356001600160401b0381111561331557600080fd5b6133218b828c016128ca565b93505061333060c08a016129c8565b915061333e60e08a016129c8565b90509295985092959890939650565b60006020828403121561335f57600080fd5b81356106b38161294c565b60006020828403121561337c57600080fd5b5051919050565b828152604081016106b360208301846130ce565b6000602082840312156133a957600080fd5b81516106b38161294c565b6020808252605a908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f6060820152796d61696e2077616c6c6574732c2077686f2061726520796f753f60301b608082015260a00190565b60005b8381101561344f578181015183820152602001613437565b50506000910152565b60008151808452613470816020860160208601613434565b601f01601f19169290920160200192915050565b8281526040602082015260006105fb6040830184613458565b60208082526036908201527f504b5048656c7065723a20697066732063696420616e642073636f70652061726040820152750e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d60531b606082015260800190565b60208082526035908201527f504b5048656c7065723a206164647265737320616e642073636f7065206172726040820152740c2f240d8cadccee8d0e640daeae6e840dac2e8c6d605b1b606082015260800190565b6020808252603b908201526000805160206138dd83398151915260408201527a0d2c840c2e4e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d602b1b606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f7075626b6579206172726179206c656e67746873206d757374206d6174636800606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f73636f706573206172726179206c656e67746873206d757374206d6174636800606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020840193506020830160005b8281101561366f578151865260209586019590910190600101613651565b5093949350505050565b8381526060602082015260006136926060830185613458565b82810360408401526136a4818561363d565b9695505050505050565b8381526001600160a01b03831660208201526060604082018190526000906136d89083018461363d565b95945050505050565b8381526060602082015282516060820152600060208401516060608084015261370d60c0840182613458565b90506040850151605f198483030160a085015261372a8282613458565b91505082810360408401526136a4818561363d565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015260c06040820152600061378260c0830187613458565b6060830186905282810360808401528451808252602080870192019060005b818110156137de578351805184526020810151602085015260ff6040820151166040850152506060830192506020840193506001810190506137a1565b50506001600160a01b03851660a085015291506137f89050565b979650505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351613835816017850160208801613434565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613866816028840160208801613434565b01602801949350505050565b6020815260006106b36020830184613458565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761049557610495613885565b8082018082111561049557610495613885565b6000816138d4576138d4613885565b50600019019056fe504b5048656c7065723a2061757468206d6574686f64207479706520616e6420a26469706673582212206ed3a9765d6e7b1d8f7560e6b2760172ce6cf0f560518a132fc0cd9f1a58b8f864736f6c634300081c0033", + "deployedBytecode": "0x60806040526004361061014c5760003560e01c806373cc4111116100bc57806373cc4111146102f6578063778fe5721461030b578063782e2ea51461031e5780638da5cb5b1461033e57806391d148541461035357806391ee4fd5146103735780639dca003214610386578063a217fddf146103b4578063caead0c7146103c9578063d547741f146103de578063db0bf933146103fe578063e4f11df614610411578063f2fde38b14610424578063f95d71b11461044457600080fd5b806301ffc9a7146101515780630e9ed68b1461018657806313af411b146101a8578063150b7a02146101c9578063202f724f14610202578063248a9ca3146102155780632b553551146102355780632f2ff15d146102575780633276558c1461027757806336568abe1461028c5780635043026c146102ac57806350d17b5e146102c1578063715018a6146102e1575b600080fd5b34801561015d57600080fd5b5061017161016c366004612598565b610464565b60405190151581526020015b60405180910390f35b34801561019257600080fd5b5061019b61049b565b60405161017d91906125c2565b6101bb6101b6366004612b84565b610586565b60405190815260200161017d565b3480156101d557600080fd5b506101e96101e4366004612c32565b610603565b6040516001600160e01b0319909116815260200161017d565b6101bb610210366004612b84565b6106a7565b34801561022157600080fd5b506101bb610230366004612cd1565b6106ba565b34801561024157600080fd5b50610255610250366004612cd1565b6106d0565b005b34801561026357600080fd5b50610255610272366004612cea565b6108ab565b34801561028357600080fd5b5061019b6108cc565b34801561029857600080fd5b506102556102a7366004612cea565b61091e565b3480156102b857600080fd5b5061019b61099c565b3480156102cd57600080fd5b5060025461019b906001600160a01b031681565b3480156102ed57600080fd5b506102556109ee565b34801561030257600080fd5b5061019b610a02565b6101bb610319366004612d3a565b610a54565b34801561032a57600080fd5b50610255610339366004612fb8565b611066565b34801561034a57600080fd5b5061019b611289565b34801561035f57600080fd5b5061017161036e366004612cea565b611298565b6101bb610381366004612ff4565b6112c3565b34801561039257600080fd5b506002546103a790600160a01b900460ff1681565b60405161017d91906130f0565b3480156103c057600080fd5b506101bb600081565b3480156103d557600080fd5b5061019b611965565b3480156103ea57600080fd5b506102556103f9366004612cea565b6119b7565b6101bb61040c3660046130fe565b6119d3565b6101bb61041f36600461323b565b611fdd565b34801561043057600080fd5b5061025561043f36600461334d565b612130565b34801561045057600080fd5b5061025561045f36600461334d565b6121a9565b60006001600160e01b03198216637965db0b60e01b148061049557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002546040805163da19ddfb60e01b815290516000926001600160a01b031691638e8dfd1691839163da19ddfb9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610511919061336a565b60025460405160e084901b6001600160e01b03191681526105409291600160a01b900460ff1690600401613383565b602060405180830381865afa15801561055d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105819190613397565b905090565b6000806040518060a00160405280856000015181526020016040518060400160405280600c81526020016b6e6167612d6b65797365743160a01b815250815260200185602001518152602001856040015181526020016105e461049b565b6001600160a01b0316905290506105fb81846112c3565b949350505050565b600061060d611965565b6001600160a01b0316336001600160a01b0316146106955760405162461bcd60e51b815260206004820152603a60248201527f504b5048656c7065723a206f6e6c792061636365707473207472616e736665726044820152791cc8199c9bdb481d1a19481412d41391950818dbdb9d1c9858dd60321b60648201526084015b60405180910390fd5b50630a85bd0160e11b95945050505050565b60006106b38383610586565b9392505050565b6000908152600160208190526040909120015490565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa158015610722573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610746919061336a565b60025460405160e084901b6001600160e01b03191681526107759291600160a01b900460ff1690600401613383565b602060405180830381865afa158015610792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b69190613397565b6001600160a01b0316336001600160a01b0316146107e65760405162461bcd60e51b815260040161068c906133b4565b60006107f061099c565b60405163b63a767760e01b8152600481018490529091506001600160a01b0382169063b63a767790602401600060405180830381600087803b15801561083557600080fd5b505af1158015610849573d6000803e3d6000fd5b50506040516328cd10c760e11b8152600481018590526001600160a01b038416925063519a218e9150602401600060405180830381600087803b15801561088f57600080fd5b505af11580156108a3573d6000803e3d6000fd5b505050505050565b6108b4826106ba565b6108bd81612207565b6108c78383612211565b505050565b6002546040805163120e5f0760e31b815290516000926001600160a01b031691638e8dfd16918391639072f8389160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6001600160a01b038116331461098e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161068c565b610998828261227c565b5050565b600254604080516316f76bbf60e01b815290516000926001600160a01b031691638e8dfd169183916316f76bbf9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6109f66122e3565b610a006000612342565b565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b600080610a5f611965565b83516020850151604051633ff8069760e11b81526001600160a01b039390931692637ff00d2e923492610a9492600401613484565b60206040518083038185885af1158015610ab2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ad7919061336a565b905082606001515183604001515114610b025760405162461bcd60e51b815260040161068c9061349d565b8260a001515183608001515114610b2b5760405162461bcd60e51b815260040161068c906134f3565b8260e00151518360c001515114610b545760405162461bcd60e51b815260040161068c90613548565b826101000151518360c001515114610b7e5760405162461bcd60e51b815260040161068c90613591565b826101200151518360c001515114610ba85760405162461bcd60e51b815260040161068c906135dc565b60408301515115610c745760005b836040015151811015610c7257610bcb6108cc565b6001600160a01b0316638a4315788386604001518481518110610bf057610bf0613627565b602002602001015187606001518581518110610c0e57610c0e613627565b60200260200101516040518463ffffffff1660e01b8152600401610c3493929190613679565b600060405180830381600087803b158015610c4e57600080fd5b505af1158015610c62573d6000803e3d6000fd5b505060019092019150610bb69050565b505b60808301515115610d405760005b836080015151811015610d3e57610c976108cc565b6001600160a01b0316631663c1218386608001518481518110610cbc57610cbc613627565b60200260200101518760a001518581518110610cda57610cda613627565b60200260200101516040518463ffffffff1660e01b8152600401610d00939291906136ae565b600060405180830381600087803b158015610d1a57600080fd5b505af1158015610d2e573d6000803e3d6000fd5b505060019092019150610c829050565b505b60c08301515115610e625760005b8360c0015151811015610e6057610d636108cc565b6001600160a01b0316639dd4349b8360405180606001604052808860c001518681518110610d9357610d93613627565b602002602001015181526020018860e001518681518110610db657610db6613627565b602002602001015181526020018861010001518681518110610dda57610dda613627565b60200260200101518152508761012001518581518110610dfc57610dfc613627565b60200260200101516040518463ffffffff1660e01b8152600401610e22939291906136e1565b600060405180830381600087803b158015610e3c57600080fd5b505af1158015610e50573d6000803e3d6000fd5b505060019092019150610d4e9050565b505b6000610e6c6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401610e9991815260200190565b602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190613397565b905083610140015115610f7c57610eef6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015610f2a578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401610f49939291906136ae565b600060405180830381600087803b158015610f6357600080fd5b505af1158015610f77573d6000803e3d6000fd5b505050505b83610160015115610ff557610f8f611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401610fbe9392919061373f565b600060405180830381600087803b158015610fd857600080fd5b505af1158015610fec573d6000803e3d6000fd5b5050505061105f565b610ffd611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b815260040161102c9392919061373f565b600060405180830381600087803b15801561104657600080fd5b505af115801561105a573d6000803e3d6000fd5b505050505b5092915050565b6002546040805163210b739d60e11b815290516001600160a01b0390921691638e8dfd16918391634216e73a916004808201926020929091908290030181865afa1580156110b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dc919061336a565b60025460405160e084901b6001600160e01b031916815261110b9291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c9190613397565b6001600160a01b0316336001600160a01b03161461117c5760405162461bcd60e51b815260040161068c906133b4565b600061118661099c565b8251909150156108c757806001600160a01b031663855eec2284846000815181106111b3576111b3613627565b60200260200101516040518363ffffffff1660e01b81526004016111d8929190613484565b600060405180830381600087803b1580156111f257600080fd5b505af1158015611206573d6000803e3d6000fd5b50505050806001600160a01b0316639000fee1848460018151811061122d5761122d613627565b60200260200101516040518363ffffffff1660e01b8152600401611252929190613484565b600060405180830381600087803b15801561126c57600080fd5b505af1158015611280573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031690565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b805182516000911461133d5760405162461bcd60e51b815260206004820152603e60248201527f504b5048656c7065723a20436c61696d206b65792074797065206d757374206d60448201527f617463682041757468204d6574686f642064617461206b657920747970650000606482015260840161068c565b60016000611349611965565b6001600160a01b03166371aa9acf3484886000015189602001518a604001518b606001518c608001516040518863ffffffff1660e01b815260040161139396959493929190613763565b60206040518083038185885af11580156113b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113d6919061336a565b9050836040015151846020015151146114015760405162461bcd60e51b815260040161068c9061349d565b8360800151518460600151511461142a5760405162461bcd60e51b815260040161068c906134f3565b8360c00151518460a0015151146114535760405162461bcd60e51b815260040161068c90613548565b8360e00151518460a00151511461147c5760405162461bcd60e51b815260040161068c90613591565b836101000151518460a0015151146114a65760405162461bcd60e51b815260040161068c906135dc565b602084015151156115725760005b846020015151811015611570576114c96108cc565b6001600160a01b0316638a43157883876020015184815181106114ee576114ee613627565b60200260200101518860400151858151811061150c5761150c613627565b60200260200101516040518463ffffffff1660e01b815260040161153293929190613679565b600060405180830381600087803b15801561154c57600080fd5b505af1158015611560573d6000803e3d6000fd5b5050600190920191506114b49050565b505b6060840151511561163e5760005b84606001515181101561163c576115956108cc565b6001600160a01b0316631663c12183876060015184815181106115ba576115ba613627565b6020026020010151886080015185815181106115d8576115d8613627565b60200260200101516040518463ffffffff1660e01b81526004016115fe939291906136ae565b600060405180830381600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b5050600190920191506115809050565b505b60a0840151511561175f5760005b8460a001515181101561175d576116616108cc565b6001600160a01b0316639dd4349b8360405180606001604052808960a00151868151811061169157611691613627565b602002602001015181526020018960c0015186815181106116b4576116b4613627565b602002602001015181526020018960e0015186815181106116d7576116d7613627565b602002602001015181525088610100015185815181106116f9576116f9613627565b60200260200101516040518463ffffffff1660e01b815260040161171f939291906136e1565b600060405180830381600087803b15801561173957600080fd5b505af115801561174d573d6000803e3d6000fd5b50506001909201915061164c9050565b505b60006117696108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b815260040161179691815260200190565b602060405180830381865afa1580156117b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d79190613397565b905084610120015115611879576117ec6108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611827578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611846939291906136ae565b600060405180830381600087803b15801561186057600080fd5b505af1158015611874573d6000803e3d6000fd5b505050505b846101400151156118f25761188c611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b81526004016118bb9392919061373f565b600060405180830381600087803b1580156118d557600080fd5b505af11580156118e9573d6000803e3d6000fd5b5050505061195c565b6118fa611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b81526004016119299392919061373f565b600060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050505b50949350505050565b60025460408051632c0b8bf760e01b815290516000926001600160a01b031691638e8dfd16918391632c0b8bf79160048083019260209291908290030181865afa1580156104ed573d6000803e3d6000fd5b6119c0826106ba565b6119c981612207565b6108c7838361227c565b6002546040805163210b739d60e11b815290516000926001600160a01b031691638e8dfd16918391634216e73a9160048083019260209291908290030181865afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a49919061336a565b60025460405160e084901b6001600160e01b0319168152611a789291600160a01b900460ff1690600401613383565b602060405180830381865afa158015611a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab99190613397565b6001600160a01b0316336001600160a01b031614611ae95760405162461bcd60e51b815260040161068c906133b4565b6000611af3611965565b6001600160a01b0316637ff00d2e348d8d6040518463ffffffff1660e01b8152600401611b21929190613484565b60206040518083038185885af1158015611b3f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b64919061336a565b90508751895114611b875760405162461bcd60e51b815260040161068c90613548565b8651895114611ba85760405162461bcd60e51b815260040161068c90613591565b8551895114611bc95760405162461bcd60e51b815260040161068c906135dc565b885115611cd15760005b8951811015611ccf57611be46108cc565b6001600160a01b0316639dd4349b8360405180606001604052808e8681518110611c1057611c10613627565b602002602001015181526020018d8681518110611c2f57611c2f613627565b602002602001015181526020018c8681518110611c4e57611c4e613627565b60200260200101518152508a8581518110611c6b57611c6b613627565b60200260200101516040518463ffffffff1660e01b8152600401611c91939291906136e1565b600060405180830381600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b505060019092019150611bd39050565b505b6000611cdb6108cc565b6001600160a01b031663bd4986a0836040518263ffffffff1660e01b8152600401611d0891815260200190565b602060405180830381865afa158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190613397565b90508415611de657611d596108cc565b6001600160a01b0316631663c12183836000604051908082528060200260200182016040528015611d94578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401611db3939291906136ae565b600060405180830381600087803b158015611dcd57600080fd5b505af1158015611de1573d6000803e3d6000fd5b505050505b8315611e5a57611df4611965565b6001600160a01b03166342842e0e3083856040518463ffffffff1660e01b8152600401611e239392919061373f565b600060405180830381600087803b158015611e3d57600080fd5b505af1158015611e51573d6000803e3d6000fd5b50505050611ec4565b611e62611965565b6001600160a01b03166342842e0e3033856040518463ffffffff1660e01b8152600401611e919392919061373f565b600060405180830381600087803b158015611eab57600080fd5b505af1158015611ebf573d6000803e3d6000fd5b505050505b855115611fce57611ed361099c565b6001600160a01b031663855eec228388600081518110611ef557611ef5613627565b60200260200101516040518363ffffffff1660e01b8152600401611f1a929190613484565b600060405180830381600087803b158015611f3457600080fd5b505af1158015611f48573d6000803e3d6000fd5b50505050611f5461099c565b6001600160a01b0316639000fee18388600181518110611f7657611f76613627565b60200260200101516040518363ffffffff1660e01b8152600401611f9b929190613484565b600060405180830381600087803b158015611fb557600080fd5b505af1158015611fc9573d6000803e3d6000fd5b505050505b509a9950505050505050505050565b6000806040518061018001604052808b81526020018a815260200160006001600160401b03811115612011576120116125d6565b60405190808252806020026020018201604052801561204457816020015b606081526020019060019003908161202f5790505b508152602001600060405190808252806020026020018201604052801561207f57816020015b606081526020019060019003908161206a5790505b50815260200160006040519080825280602002602001820160405280156120b0578160200160208202803683370190505b50815260200160006040519080825280602002602001820160405280156120eb57816020015b60608152602001906001900390816120d65790505b5081526020018981526020018881526020018781526020018681526020018515158152602001841515815250905061212281610a54565b9a9950505050505050505050565b6121386122e3565b6001600160a01b03811661219d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068c565b6121a681612342565b50565b6121b16122e3565b600280546001600160a01b0319166001600160a01b0383161790556040517f2760073c7cd8cac531d7f643becbfbb74d8b8156443eacf879622532dbbb3cd5906121fc9083906125c2565b60405180910390a150565b6121a68133612392565b61221b8282611298565b6109985760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6122868282611298565b156109985760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b336122ec611289565b6001600160a01b031614610a005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161068c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61239c8282611298565b610998576123a9816123eb565b6123b48360206123fd565b6040516020016123c5929190613803565b60408051601f198184030181529082905262461bcd60e51b825261068c91600401613872565b60606104956001600160a01b03831660145b6060600061240c83600261389b565b6124179060026138b2565b6001600160401b0381111561242e5761242e6125d6565b6040519080825280601f01601f191660200182016040528015612458576020820181803683370190505b509050600360fc1b8160008151811061247357612473613627565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106124a2576124a2613627565b60200101906001600160f81b031916908160001a90535060006124c684600261389b565b6124d19060016138b2565b90505b6001811115612549576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061250557612505613627565b1a60f81b82828151811061251b5761251b613627565b60200101906001600160f81b031916908160001a90535060049490941c93612542816138c5565b90506124d4565b5083156106b35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161068c565b6000602082840312156125aa57600080fd5b81356001600160e01b0319811681146106b357600080fd5b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561260e5761260e6125d6565b60405290565b60405161016081016001600160401b038111828210171561260e5761260e6125d6565b60405161018081016001600160401b038111828210171561260e5761260e6125d6565b60405160a081016001600160401b038111828210171561260e5761260e6125d6565b604051601f8201601f191681016001600160401b03811182821017156126a4576126a46125d6565b604052919050565b60006001600160401b038211156126c5576126c56125d6565b5060051b60200190565b600082601f8301126126e057600080fd5b81356126f36126ee826126ac565b61267c565b8082825260208201915060206060840286010192508583111561271557600080fd5b602085015b83811015612771576060818803121561273257600080fd5b61273a6125ec565b8135815260208083013590820152604082013560ff8116811461275c57600080fd5b6040820152835260209092019160600161271a565b5095945050505050565b6000806001600160401b03841115612795576127956125d6565b50601f8301601f19166020016127aa8161267c565b9150508281528383830111156127bf57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126127e757600080fd5b81356127f56126ee826126ac565b8082825260208201915060208360051b86010192508583111561281757600080fd5b602085015b838110156127715780356001600160401b0381111561283a57600080fd5b8601603f8101881361284b57600080fd5b61285d8860208301356040840161277b565b8452506020928301920161281c565b600082601f83011261287d57600080fd5b813561288b6126ee826126ac565b8082825260208201915060208360051b8601019250858311156128ad57600080fd5b602085015b838110156127715780358352602092830192016128b2565b600082601f8301126128db57600080fd5b81356128e96126ee826126ac565b8082825260208201915060208360051b86010192508583111561290b57600080fd5b602085015b838110156127715780356001600160401b0381111561292e57600080fd5b61293d886020838a010161286c565b84525060209283019201612910565b6001600160a01b03811681146121a657600080fd5b600082601f83011261297257600080fd5b81356129806126ee826126ac565b8082825260208201915060208360051b8601019250858311156129a257600080fd5b602085015b838110156127715780356129ba8161294c565b8352602092830192016129a7565b803580151581146129d857600080fd5b919050565b600061016082840312156129f057600080fd5b6129f8612614565b82358152905060208201356001600160401b03811115612a1757600080fd5b612a23848285016127d6565b60208301525060408201356001600160401b03811115612a4257600080fd5b612a4e848285016128ca565b60408301525060608201356001600160401b03811115612a6d57600080fd5b612a7984828501612961565b60608301525060808201356001600160401b03811115612a9857600080fd5b612aa4848285016128ca565b60808301525060a08201356001600160401b03811115612ac357600080fd5b612acf8482850161286c565b60a08301525060c08201356001600160401b03811115612aee57600080fd5b612afa848285016127d6565b60c08301525060e08201356001600160401b03811115612b1957600080fd5b612b25848285016127d6565b60e0830152506101008201356001600160401b03811115612b4557600080fd5b612b51848285016128ca565b61010083015250612b6561012083016129c8565b610120820152612b7861014083016129c8565b61014082015292915050565b60008060408385031215612b9757600080fd5b82356001600160401b03811115612bad57600080fd5b830160608186031215612bbf57600080fd5b612bc76125ec565b813581526020808301359082015260408201356001600160401b03811115612bee57600080fd5b612bfa878285016126cf565b60408301525092505060208301356001600160401b03811115612c1c57600080fd5b612c28858286016129dd565b9150509250929050565b600080600080600060808688031215612c4a57600080fd5b8535612c558161294c565b94506020860135612c658161294c565b93506040860135925060608601356001600160401b03811115612c8757600080fd5b8601601f81018813612c9857600080fd5b80356001600160401b03811115612cae57600080fd5b886020828401011115612cc057600080fd5b959894975092955050506020019190565b600060208284031215612ce357600080fd5b5035919050565b60008060408385031215612cfd57600080fd5b823591506020830135612d0f8161294c565b809150509250929050565b600082601f830112612d2b57600080fd5b6106b38383356020850161277b565b600060208284031215612d4c57600080fd5b81356001600160401b03811115612d6257600080fd5b82016101808185031215612d7557600080fd5b612d7d612637565b8135815260208201356001600160401b03811115612d9a57600080fd5b612da686828501612d1a565b60208301525060408201356001600160401b03811115612dc557600080fd5b612dd1868285016127d6565b60408301525060608201356001600160401b03811115612df057600080fd5b612dfc868285016128ca565b60608301525060808201356001600160401b03811115612e1b57600080fd5b612e2786828501612961565b60808301525060a08201356001600160401b03811115612e4657600080fd5b612e52868285016128ca565b60a08301525060c08201356001600160401b03811115612e7157600080fd5b612e7d8682850161286c565b60c08301525060e08201356001600160401b03811115612e9c57600080fd5b612ea8868285016127d6565b60e0830152506101008201356001600160401b03811115612ec857600080fd5b612ed4868285016127d6565b610100830152506101208201356001600160401b03811115612ef557600080fd5b612f01868285016128ca565b61012083015250612f1561014083016129c8565b610140820152612f2861016083016129c8565b610160820152949350505050565b600082601f830112612f4757600080fd5b8135612f556126ee826126ac565b8082825260208201915060208360051b860101925085831115612f7757600080fd5b602085015b838110156127715780356001600160401b03811115612f9a57600080fd5b612fa9886020838a0101612d1a565b84525060209283019201612f7c565b60008060408385031215612fcb57600080fd5b8235915060208301356001600160401b03811115612fe857600080fd5b612c2885828601612f36565b6000806040838503121561300757600080fd5b82356001600160401b0381111561301d57600080fd5b830160a0818603121561302f57600080fd5b61303761265a565b8135815260208201356001600160401b0381111561305457600080fd5b61306087828501612d1a565b6020830152506040828101359082015260608201356001600160401b0381111561308957600080fd5b613095878285016126cf565b606083015250608082013591506130ab8261294c565b6080810191909152915060208301356001600160401b03811115612c1c57600080fd5b600381106130ec57634e487b7160e01b600052602160045260246000fd5b9052565b6020810161049582846130ce565b60008060008060008060008060006101208a8c03121561311d57600080fd5b8935985060208a01356001600160401b0381111561313a57600080fd5b6131468c828d01612d1a565b98505060408a01356001600160401b0381111561316257600080fd5b61316e8c828d0161286c565b97505060608a01356001600160401b0381111561318a57600080fd5b6131968c828d016127d6565b96505060808a01356001600160401b038111156131b257600080fd5b6131be8c828d016127d6565b95505060a08a01356001600160401b038111156131da57600080fd5b6131e68c828d016128ca565b94505060c08a01356001600160401b0381111561320257600080fd5b61320e8c828d01612f36565b93505061321d60e08b016129c8565b915061322c6101008b016129c8565b90509295985092959850929598565b600080600080600080600080610100898b03121561325857600080fd5b8835975060208901356001600160401b0381111561327557600080fd5b6132818b828c01612d1a565b97505060408901356001600160401b0381111561329d57600080fd5b6132a98b828c0161286c565b96505060608901356001600160401b038111156132c557600080fd5b6132d18b828c016127d6565b95505060808901356001600160401b038111156132ed57600080fd5b6132f98b828c016127d6565b94505060a08901356001600160401b0381111561331557600080fd5b6133218b828c016128ca565b93505061333060c08a016129c8565b915061333e60e08a016129c8565b90509295985092959890939650565b60006020828403121561335f57600080fd5b81356106b38161294c565b60006020828403121561337c57600080fd5b5051919050565b828152604081016106b360208301846130ce565b6000602082840312156133a957600080fd5b81516106b38161294c565b6020808252605a908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f6060820152796d61696e2077616c6c6574732c2077686f2061726520796f753f60301b608082015260a00190565b60005b8381101561344f578181015183820152602001613437565b50506000910152565b60008151808452613470816020860160208601613434565b601f01601f19169290920160200192915050565b8281526040602082015260006105fb6040830184613458565b60208082526036908201527f504b5048656c7065723a20697066732063696420616e642073636f70652061726040820152750e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d60531b606082015260800190565b60208082526035908201527f504b5048656c7065723a206164647265737320616e642073636f7065206172726040820152740c2f240d8cadccee8d0e640daeae6e840dac2e8c6d605b1b606082015260800190565b6020808252603b908201526000805160206138dd83398151915260408201527a0d2c840c2e4e4c2f240d8cadccee8d0e640daeae6e840dac2e8c6d602b1b606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f7075626b6579206172726179206c656e67746873206d757374206d6174636800606082015260800190565b6020808252603f908201526000805160206138dd83398151915260408201527f73636f706573206172726179206c656e67746873206d757374206d6174636800606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020840193506020830160005b8281101561366f578151865260209586019590910190600101613651565b5093949350505050565b8381526060602082015260006136926060830185613458565b82810360408401526136a4818561363d565b9695505050505050565b8381526001600160a01b03831660208201526060604082018190526000906136d89083018461363d565b95945050505050565b8381526060602082015282516060820152600060208401516060608084015261370d60c0840182613458565b90506040850151605f198483030160a085015261372a8282613458565b91505082810360408401526136a4818561363d565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015260c06040820152600061378260c0830187613458565b6060830186905282810360808401528451808252602080870192019060005b818110156137de578351805184526020810151602085015260ff6040820151166040850152506060830192506020840193506001810190506137a1565b50506001600160a01b03851660a085015291506137f89050565b979650505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351613835816017850160208801613434565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613866816028840160208801613434565b01602801949350505050565b6020815260006106b36020830184613458565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761049557610495613885565b8082018082111561049557610495613885565b6000816138d4576138d4613885565b50600019019056fe504b5048656c7065723a2061757468206d6574686f64207479706520616e6420a26469706673582212206ed3a9765d6e7b1d8f7560e6b2760172ce6cf0f560518a132fc0cd9f1a58b8f864736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/rust/lit-core/lit-blockchain/abis/PKPNFTMetadata.json b/rust/lit-core/lit-blockchain/abis/PKPNFTMetadata.json index f2f8bc79..6e0a3f49 100644 --- a/rust/lit-core/lit-blockchain/abis/PKPNFTMetadata.json +++ b/rust/lit-core/lit-blockchain/abis/PKPNFTMetadata.json @@ -156,8 +156,8 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600f57600080fd5b50604051611c7d380380611c7d833981016040819052602c916076565b600080546001600160a01b0384166001600160a01b03198216811783558392916001600160a81b03191617600160a01b836002811115606b57606b60bd565b0217905550505060d3565b60008060408385031215608857600080fd5b82516001600160a01b0381168114609e57600080fd5b60208401519092506003811060b257600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b611b9b806100e26000396000f3fe608060405234801561001057600080fd5b50600436106100785760003560e01c8063451d89fa1461007d57806350d17b5e146100a6578063519a218e146100d1578063855eec22146100e65780639000fee1146100f9578063950462ee1461010c5780639dca00321461011f578063b63a767714610140575b600080fd5b61009061008b366004610fb0565b610153565b60405161009d9190611010565b60405180910390f35b6000546100b9906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b6100e46100df366004611043565b61030c565b005b6100e46100f436600461105c565b610456565b6100e461010736600461105c565b610589565b61009061011a3660046110ce565b6106b7565b60005461013390600160a01b900460ff1681565b60405161009d919061114a565b6100e461014e366004611043565b6106f3565b6060600082516002610165919061116e565b6001600160401b0381111561017c5761017c610f02565b6040519080825280601f01601f1916602001820160405280156101a6576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b84518110156102e2578182518683815181106101f2576101f2611185565b0160200151610204919060f81c6111b1565b8151811061021457610214611185565b01602001516001600160f81b0319168361022f83600261116e565b8151811061023f5761023f611185565b60200101906001600160f81b031916908160001a90535081825186838151811061026b5761026b611185565b016020015161027d919060f81c6111c5565b8151811061028d5761028d611185565b01602001516001600160f81b031916836102a883600261116e565b6102b39060016111d9565b815181106102c3576102c3611185565b60200101906001600160f81b031916908160001a9053506001016101d4565b50816040516020016102f49190611208565b60405160208183030381529060405292505050919050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa15801561035e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103829190611232565b60005460405160e084901b6001600160e01b03191681526103b19291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156103ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f2919061125f565b6001600160a01b0316336001600160a01b03161461042b5760405162461bcd60e51b81526004016104229061127c565b60405180910390fd5b60408051602080820183526000808352848152600190915291909120906104529082611376565b5050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156104a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cc9190611232565b60005460405160e084901b6001600160e01b03191681526104fb9291600160a01b900460ff169060040161124b565b602060405180830381865afa158015610518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053c919061125f565b6001600160a01b0316336001600160a01b03161461056c5760405162461bcd60e51b81526004016104229061127c565b60008281526001602052604090206105848282611376565b505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156105db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ff9190611232565b60005460405160e084901b6001600160e01b031916815261062e9291600160a01b900460ff169060040161124b565b602060405180830381865afa15801561064b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066f919061125f565b6001600160a01b0316336001600160a01b03161461069f5760405162461bcd60e51b81526004016104229061127c565b60008281526002602052604090206105848282611376565b606060006106c6858585610830565b9050806040516020016106d99190611434565b6040516020818303038152906040529150505b9392505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190611232565b60005460405160e084901b6001600160e01b03191681526107989291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156107b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d9919061125f565b6001600160a01b0316336001600160a01b0316146108095760405162461bcd60e51b81526004016104229061127c565b60408051602080820183526000808352848152600290915291909120906104529082611376565b6060600060405180610480016040528061045681526020016116d061045691399050600061085d85610153565b9050600061086a85610a84565b9050600061087788610aa0565b600089815260016020526040812080549293509091610895906112ee565b80601f01602080910402602001604051908101604052809291908181526020018280546108c1906112ee565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b505050505090506000600260008b81526020019081526020016000208054610935906112ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610961906112ee565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b50505050509050815160001480156109c65750805115155b156109f257826040516020016109dc9190611479565b6040516020818303038152906040529150610a46565b815115801590610a0157508051155b15610a0d575084610a46565b8151158015610a1b57508051155b15610a465782604051602001610a319190611479565b60405160208183030381529060405291508590505b610a768282878787604051602001610a629594939291906114aa565b604051602081830303815290604052610b32565b9a9950505050505050505050565b6060610a9a6001600160a01b0383166014610c91565b92915050565b60606000610aad83610e2c565b60010190506000816001600160401b03811115610acc57610acc610f02565b6040519080825280601f01601f191660200182016040528015610af6576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610b0057509392505050565b60608151600003610b5157505060408051602081019091526000815290565b6000604051806060016040528060408152602001611b266040913990506000600384516002610b8091906111d9565b610b8a91906111b1565b610b9590600461116e565b6001600160401b03811115610bac57610bac610f02565b6040519080825280601f01601f191660200182016040528015610bd6576020820181803683370190505b50905060018201602082018586518701602081018051600082525b82841015610c4c576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450610bf1565b9052505085516003900660018114610c6b5760028114610c7e57610c86565b603d6001830353603d6002830353610c86565b603d60018303535b509195945050505050565b60606000610ca083600261116e565b610cab9060026111d9565b6001600160401b03811115610cc257610cc2610f02565b6040519080825280601f01601f191660200182016040528015610cec576020820181803683370190505b509050600360fc1b81600081518110610d0757610d07611185565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d3657610d36611185565b60200101906001600160f81b031916908160001a9053506000610d5a84600261116e565b610d659060016111d9565b90505b6001811115610ddd576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d9957610d99611185565b1a60f81b828281518110610daf57610daf611185565b60200101906001600160f81b031916908160001a90535060049490941c93610dd6816116b8565b9050610d68565b5083156106ec5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610422565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610e6b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b8310610e95576904ee2d6d415b85acef8160201b830492506020015b662386f26fc100008310610eb357662386f26fc10000830492506010015b6305f5e1008310610ecb576305f5e100830492506008015b6127108310610edf57612710830492506004015b60648310610ef1576064830492506002015b600a8310610a9a5760010192915050565b634e487b7160e01b600052604160045260246000fd5b6000806001600160401b03841115610f3257610f32610f02565b50604051601f19601f85018116603f011681018181106001600160401b0382111715610f6057610f60610f02565b604052838152905080828401851015610f7857600080fd5b83836020830137600060208583010152509392505050565b600082601f830112610fa157600080fd5b6106ec83833560208501610f18565b600060208284031215610fc257600080fd5b81356001600160401b03811115610fd857600080fd5b610fe484828501610f90565b949350505050565b60005b83811015611007578181015183820152602001610fef565b50506000910152565b602081526000825180602084015261102f816040850160208701610fec565b601f01601f19169190910160400192915050565b60006020828403121561105557600080fd5b5035919050565b6000806040838503121561106f57600080fd5b8235915060208301356001600160401b0381111561108c57600080fd5b8301601f8101851361109d57600080fd5b6110ac85823560208401610f18565b9150509250929050565b6001600160a01b03811681146110cb57600080fd5b50565b6000806000606084860312156110e357600080fd5b8335925060208401356001600160401b0381111561110057600080fd5b61110c86828701610f90565b925050604084013561111d816110b6565b809150509250925092565b6003811061114657634e487b7160e01b600052602160045260246000fd5b9052565b60208101610a9a8284611128565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a9a57610a9a611158565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826111c0576111c061119b565b500490565b6000826111d4576111d461119b565b500690565b80820180821115610a9a57610a9a611158565b600081516111fe818560208601610fec565b9290920192915050565b61060f60f31b815260008251611225816002850160208701610fec565b9190910160020192915050565b60006020828403121561124457600080fd5b5051919050565b828152604081016106ec6020830184611128565b60006020828403121561127157600080fd5b81516106ec816110b6565b6020808252604c908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f60608201526b6d61696e2077616c6c65747360a01b608082015260a00190565b600181811c9082168061130257607f821691505b60208210810361132257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561058457806000526020600020601f840160051c8101602085101561134f5750805b601f840160051c820191505b8181101561136f576000815560010161135b565b5050505050565b81516001600160401b0381111561138f5761138f610f02565b6113a38161139d84546112ee565b84611328565b6020601f8211600181146113d757600083156113bf5750848201515b600019600385901b1c1916600184901b17845561136f565b600084815260208120601f198516915b8281101561140757878501518255602094850194600190920191016113e7565b50848210156114255786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161146c81601d850160208701610fec565b91909101601d0192915050565b684c697420504b50202360b81b81526000825161149d816009850160208701610fec565b9190910160090192915050565b683d913730b6b2911d1160b91b815285516000906114cf816009850160208b01610fec565b7f222c20226465736372697074696f6e223a202254686973204e465420656e74696009918401918201527f746c65732074686520686f6c64657220746f207573652061204c69742050726f60298201527f746f636f6c20504b502c20616e6420746f206772616e7420616363657373207460498201527f6f206f7468657220757365727320616e64204c697420416374696f6e7320746f60698201527f20757365207468697320504b50222c22696d6167655f64617461223a20220000608982015286516115a48160a7840160208b01610fec565b6009818301019150507f222c2261747472696275746573223a205b7b2274726169745f74797065223a20609e8201527711283ab13634b19025b2bc911610113b30b63ab2911d101160411b60be8201526116ac61169c61169661165b61165561161060d687018c6111ec565b7f227d2c207b2274726169745f74797065223a20224554482057616c6c6574204181527232323932b9b9911610113b30b63ab2911d101160691b602082015260330190565b896111ec565b7f227d2c207b2274726169745f74797065223a2022546f6b656e204944222c20228152683b30b63ab2911d101160b91b602082015260290190565b866111ec565b63227d5d7d60e01b815260040190565b98975050505050505050565b6000816116c7576116c7611158565b50600019019056fe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130383027206865696768743d2731303830272066696c6c3d276e6f6e652720786d6c6e733a763d2768747470733a2f2f76656374612e696f2f6e616e6f273e3c7061746820643d274d3336332e303736203339322e323237732d2e3937372031382e3532342d33362e3837342037382e393437632d34312e3537362037302e3031382d34352e343831203135312e3937382d332e303137203232302e342038392e353231203134342e323435203333322e343831203134312e3532203432322e3535362e3038392033342e3833322d35342e3730372034342e3831362d3131372e3437392033322e3932342d3138312e323438203020302d32382e3831392d3133332e3134342d3132372e3233372d3231372e30393920312e35353320312e33303820352e3336392031392e31323220362e3130312032362e37323220322e3234312032332e3335342e3034352034372e3833382d372e3738372037302e3036322d352e3734362031362e33332d31332e3731312033302e3436372d32372e3137382034312e33363820302d332e3831312d2e3935342d31302e3633352d2e3937362d31322e3931382d2e3634342d34362e3530382d31382e3635392d38392e3538322d34382e3031312d3132352e3734332d32352e3634372d33312e3535322d36302e3831322d35332e3038392d39372e38342d36382e3933322e39333120332e31393120322e3636322031362e34313920322e3930362031392e30333320312e3930382032312e39353820322e3236332035322e3731332d2e3632312037342e363439732d372e3833322033332e3837382d31342e3535342035342e343431632d31302e3138342033312e3137352d32342e30352035342e3238352d34312e3632312038322e3030342d332e323420352e3039362d31322e3931332031392e3037382d31382e3038322032362e313436203020302d382e3839372d35362e3139312d34302e3636372d38372e393231682d2e3032327a272066696c6c3d2723303030272f3e3c7061746820643d274d3536322e352032372e32386c3431302e323739203233362e3837346331332e39323320382e3033392032322e352032322e3839352032322e352033382e393731763437332e373563302031362e3037362d382e3537372033302e3933322d32322e352033382e3937314c3536322e3520313035322e3732632d31332e39323320382e30342d33312e30373720382e30342d343520304c3130372e323231203831352e383436632d31332e3932332d382e3033392d32322e352d32322e3839352d32322e352d33382e393731762d3437332e37356134352034352030203020312032322e352d33382e3937314c3531372e352032372e323861343520343520302030203120343520307a27207374726f6b653d272330303027207374726f6b652d77696474683d2732342e3735272f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208f1399b085bffde06578f1dd04ad36217eed47fba06d75a31f5ce9e67151788264736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100785760003560e01c8063451d89fa1461007d57806350d17b5e146100a6578063519a218e146100d1578063855eec22146100e65780639000fee1146100f9578063950462ee1461010c5780639dca00321461011f578063b63a767714610140575b600080fd5b61009061008b366004610fb0565b610153565b60405161009d9190611010565b60405180910390f35b6000546100b9906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b6100e46100df366004611043565b61030c565b005b6100e46100f436600461105c565b610456565b6100e461010736600461105c565b610589565b61009061011a3660046110ce565b6106b7565b60005461013390600160a01b900460ff1681565b60405161009d919061114a565b6100e461014e366004611043565b6106f3565b6060600082516002610165919061116e565b6001600160401b0381111561017c5761017c610f02565b6040519080825280601f01601f1916602001820160405280156101a6576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b84518110156102e2578182518683815181106101f2576101f2611185565b0160200151610204919060f81c6111b1565b8151811061021457610214611185565b01602001516001600160f81b0319168361022f83600261116e565b8151811061023f5761023f611185565b60200101906001600160f81b031916908160001a90535081825186838151811061026b5761026b611185565b016020015161027d919060f81c6111c5565b8151811061028d5761028d611185565b01602001516001600160f81b031916836102a883600261116e565b6102b39060016111d9565b815181106102c3576102c3611185565b60200101906001600160f81b031916908160001a9053506001016101d4565b50816040516020016102f49190611208565b60405160208183030381529060405292505050919050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa15801561035e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103829190611232565b60005460405160e084901b6001600160e01b03191681526103b19291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156103ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f2919061125f565b6001600160a01b0316336001600160a01b03161461042b5760405162461bcd60e51b81526004016104229061127c565b60405180910390fd5b60408051602080820183526000808352848152600190915291909120906104529082611376565b5050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156104a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cc9190611232565b60005460405160e084901b6001600160e01b03191681526104fb9291600160a01b900460ff169060040161124b565b602060405180830381865afa158015610518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053c919061125f565b6001600160a01b0316336001600160a01b03161461056c5760405162461bcd60e51b81526004016104229061127c565b60008281526001602052604090206105848282611376565b505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156105db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ff9190611232565b60005460405160e084901b6001600160e01b031916815261062e9291600160a01b900460ff169060040161124b565b602060405180830381865afa15801561064b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066f919061125f565b6001600160a01b0316336001600160a01b03161461069f5760405162461bcd60e51b81526004016104229061127c565b60008281526002602052604090206105848282611376565b606060006106c6858585610830565b9050806040516020016106d99190611434565b6040516020818303038152906040529150505b9392505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190611232565b60005460405160e084901b6001600160e01b03191681526107989291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156107b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d9919061125f565b6001600160a01b0316336001600160a01b0316146108095760405162461bcd60e51b81526004016104229061127c565b60408051602080820183526000808352848152600290915291909120906104529082611376565b6060600060405180610480016040528061045681526020016116d061045691399050600061085d85610153565b9050600061086a85610a84565b9050600061087788610aa0565b600089815260016020526040812080549293509091610895906112ee565b80601f01602080910402602001604051908101604052809291908181526020018280546108c1906112ee565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b505050505090506000600260008b81526020019081526020016000208054610935906112ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610961906112ee565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b50505050509050815160001480156109c65750805115155b156109f257826040516020016109dc9190611479565b6040516020818303038152906040529150610a46565b815115801590610a0157508051155b15610a0d575084610a46565b8151158015610a1b57508051155b15610a465782604051602001610a319190611479565b60405160208183030381529060405291508590505b610a768282878787604051602001610a629594939291906114aa565b604051602081830303815290604052610b32565b9a9950505050505050505050565b6060610a9a6001600160a01b0383166014610c91565b92915050565b60606000610aad83610e2c565b60010190506000816001600160401b03811115610acc57610acc610f02565b6040519080825280601f01601f191660200182016040528015610af6576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610b0057509392505050565b60608151600003610b5157505060408051602081019091526000815290565b6000604051806060016040528060408152602001611b266040913990506000600384516002610b8091906111d9565b610b8a91906111b1565b610b9590600461116e565b6001600160401b03811115610bac57610bac610f02565b6040519080825280601f01601f191660200182016040528015610bd6576020820181803683370190505b50905060018201602082018586518701602081018051600082525b82841015610c4c576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450610bf1565b9052505085516003900660018114610c6b5760028114610c7e57610c86565b603d6001830353603d6002830353610c86565b603d60018303535b509195945050505050565b60606000610ca083600261116e565b610cab9060026111d9565b6001600160401b03811115610cc257610cc2610f02565b6040519080825280601f01601f191660200182016040528015610cec576020820181803683370190505b509050600360fc1b81600081518110610d0757610d07611185565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d3657610d36611185565b60200101906001600160f81b031916908160001a9053506000610d5a84600261116e565b610d659060016111d9565b90505b6001811115610ddd576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d9957610d99611185565b1a60f81b828281518110610daf57610daf611185565b60200101906001600160f81b031916908160001a90535060049490941c93610dd6816116b8565b9050610d68565b5083156106ec5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610422565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610e6b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b8310610e95576904ee2d6d415b85acef8160201b830492506020015b662386f26fc100008310610eb357662386f26fc10000830492506010015b6305f5e1008310610ecb576305f5e100830492506008015b6127108310610edf57612710830492506004015b60648310610ef1576064830492506002015b600a8310610a9a5760010192915050565b634e487b7160e01b600052604160045260246000fd5b6000806001600160401b03841115610f3257610f32610f02565b50604051601f19601f85018116603f011681018181106001600160401b0382111715610f6057610f60610f02565b604052838152905080828401851015610f7857600080fd5b83836020830137600060208583010152509392505050565b600082601f830112610fa157600080fd5b6106ec83833560208501610f18565b600060208284031215610fc257600080fd5b81356001600160401b03811115610fd857600080fd5b610fe484828501610f90565b949350505050565b60005b83811015611007578181015183820152602001610fef565b50506000910152565b602081526000825180602084015261102f816040850160208701610fec565b601f01601f19169190910160400192915050565b60006020828403121561105557600080fd5b5035919050565b6000806040838503121561106f57600080fd5b8235915060208301356001600160401b0381111561108c57600080fd5b8301601f8101851361109d57600080fd5b6110ac85823560208401610f18565b9150509250929050565b6001600160a01b03811681146110cb57600080fd5b50565b6000806000606084860312156110e357600080fd5b8335925060208401356001600160401b0381111561110057600080fd5b61110c86828701610f90565b925050604084013561111d816110b6565b809150509250925092565b6003811061114657634e487b7160e01b600052602160045260246000fd5b9052565b60208101610a9a8284611128565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a9a57610a9a611158565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826111c0576111c061119b565b500490565b6000826111d4576111d461119b565b500690565b80820180821115610a9a57610a9a611158565b600081516111fe818560208601610fec565b9290920192915050565b61060f60f31b815260008251611225816002850160208701610fec565b9190910160020192915050565b60006020828403121561124457600080fd5b5051919050565b828152604081016106ec6020830184611128565b60006020828403121561127157600080fd5b81516106ec816110b6565b6020808252604c908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f60608201526b6d61696e2077616c6c65747360a01b608082015260a00190565b600181811c9082168061130257607f821691505b60208210810361132257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561058457806000526020600020601f840160051c8101602085101561134f5750805b601f840160051c820191505b8181101561136f576000815560010161135b565b5050505050565b81516001600160401b0381111561138f5761138f610f02565b6113a38161139d84546112ee565b84611328565b6020601f8211600181146113d757600083156113bf5750848201515b600019600385901b1c1916600184901b17845561136f565b600084815260208120601f198516915b8281101561140757878501518255602094850194600190920191016113e7565b50848210156114255786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161146c81601d850160208701610fec565b91909101601d0192915050565b684c697420504b50202360b81b81526000825161149d816009850160208701610fec565b9190910160090192915050565b683d913730b6b2911d1160b91b815285516000906114cf816009850160208b01610fec565b7f222c20226465736372697074696f6e223a202254686973204e465420656e74696009918401918201527f746c65732074686520686f6c64657220746f207573652061204c69742050726f60298201527f746f636f6c20504b502c20616e6420746f206772616e7420616363657373207460498201527f6f206f7468657220757365727320616e64204c697420416374696f6e7320746f60698201527f20757365207468697320504b50222c22696d6167655f64617461223a20220000608982015286516115a48160a7840160208b01610fec565b6009818301019150507f222c2261747472696275746573223a205b7b2274726169745f74797065223a20609e8201527711283ab13634b19025b2bc911610113b30b63ab2911d101160411b60be8201526116ac61169c61169661165b61165561161060d687018c6111ec565b7f227d2c207b2274726169745f74797065223a20224554482057616c6c6574204181527232323932b9b9911610113b30b63ab2911d101160691b602082015260330190565b896111ec565b7f227d2c207b2274726169745f74797065223a2022546f6b656e204944222c20228152683b30b63ab2911d101160b91b602082015260290190565b866111ec565b63227d5d7d60e01b815260040190565b98975050505050505050565b6000816116c7576116c7611158565b50600019019056fe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130383027206865696768743d2731303830272066696c6c3d276e6f6e652720786d6c6e733a763d2768747470733a2f2f76656374612e696f2f6e616e6f273e3c7061746820643d274d3336332e303736203339322e323237732d2e3937372031382e3532342d33362e3837342037382e393437632d34312e3537362037302e3031382d34352e343831203135312e3937382d332e303137203232302e342038392e353231203134342e323435203333322e343831203134312e3532203432322e3535362e3038392033342e3833322d35342e3730372034342e3831362d3131372e3437392033322e3932342d3138312e323438203020302d32382e3831392d3133332e3134342d3132372e3233372d3231372e30393920312e35353320312e33303820352e3336392031392e31323220362e3130312032362e37323220322e3234312032332e3335342e3034352034372e3833382d372e3738372037302e3036322d352e3734362031362e33332d31332e3731312033302e3436372d32372e3137382034312e33363820302d332e3831312d2e3935342d31302e3633352d2e3937362d31322e3931382d2e3634342d34362e3530382d31382e3635392d38392e3538322d34382e3031312d3132352e3734332d32352e3634372d33312e3535322d36302e3831322d35332e3038392d39372e38342d36382e3933322e39333120332e31393120322e3636322031362e34313920322e3930362031392e30333320312e3930382032312e39353820322e3236332035322e3731332d2e3632312037342e363439732d372e3833322033332e3837382d31342e3535342035342e343431632d31302e3138342033312e3137352d32342e30352035342e3238352d34312e3632312038322e3030342d332e323420352e3039362d31322e3931332031392e3037382d31382e3038322032362e313436203020302d382e3839372d35362e3139312d34302e3636372d38372e393231682d2e3032327a272066696c6c3d2723303030272f3e3c7061746820643d274d3536322e352032372e32386c3431302e323739203233362e3837346331332e39323320382e3033392032322e352032322e3839352032322e352033382e393731763437332e373563302031362e3037362d382e3537372033302e3933322d32322e352033382e3937314c3536322e3520313035322e3732632d31332e39323320382e30342d33312e30373720382e30342d343520304c3130372e323231203831352e383436632d31332e3932332d382e3033392d32322e352d32322e3839352d32322e352d33382e393731762d3437332e37356134352034352030203020312032322e352d33382e3937314c3531372e352032372e323861343520343520302030203120343520307a27207374726f6b653d272330303027207374726f6b652d77696474683d2732342e3735272f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208f1399b085bffde06578f1dd04ad36217eed47fba06d75a31f5ce9e67151788264736f6c634300081c0033", + "bytecode": "0x6080604052348015600f57600080fd5b50604051611c7d380380611c7d833981016040819052602c916076565b600080546001600160a01b0384166001600160a01b03198216811783558392916001600160a81b03191617600160a01b836002811115606b57606b60bd565b0217905550505060d3565b60008060408385031215608857600080fd5b82516001600160a01b0381168114609e57600080fd5b60208401519092506003811060b257600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b611b9b806100e26000396000f3fe608060405234801561001057600080fd5b50600436106100785760003560e01c8063451d89fa1461007d57806350d17b5e146100a6578063519a218e146100d1578063855eec22146100e65780639000fee1146100f9578063950462ee1461010c5780639dca00321461011f578063b63a767714610140575b600080fd5b61009061008b366004610fb0565b610153565b60405161009d9190611010565b60405180910390f35b6000546100b9906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b6100e46100df366004611043565b61030c565b005b6100e46100f436600461105c565b610456565b6100e461010736600461105c565b610589565b61009061011a3660046110ce565b6106b7565b60005461013390600160a01b900460ff1681565b60405161009d919061114a565b6100e461014e366004611043565b6106f3565b6060600082516002610165919061116e565b6001600160401b0381111561017c5761017c610f02565b6040519080825280601f01601f1916602001820160405280156101a6576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b84518110156102e2578182518683815181106101f2576101f2611185565b0160200151610204919060f81c6111b1565b8151811061021457610214611185565b01602001516001600160f81b0319168361022f83600261116e565b8151811061023f5761023f611185565b60200101906001600160f81b031916908160001a90535081825186838151811061026b5761026b611185565b016020015161027d919060f81c6111c5565b8151811061028d5761028d611185565b01602001516001600160f81b031916836102a883600261116e565b6102b39060016111d9565b815181106102c3576102c3611185565b60200101906001600160f81b031916908160001a9053506001016101d4565b50816040516020016102f49190611208565b60405160208183030381529060405292505050919050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa15801561035e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103829190611232565b60005460405160e084901b6001600160e01b03191681526103b19291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156103ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f2919061125f565b6001600160a01b0316336001600160a01b03161461042b5760405162461bcd60e51b81526004016104229061127c565b60405180910390fd5b60408051602080820183526000808352848152600190915291909120906104529082611376565b5050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156104a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cc9190611232565b60005460405160e084901b6001600160e01b03191681526104fb9291600160a01b900460ff169060040161124b565b602060405180830381865afa158015610518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053c919061125f565b6001600160a01b0316336001600160a01b03161461056c5760405162461bcd60e51b81526004016104229061127c565b60008281526001602052604090206105848282611376565b505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156105db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ff9190611232565b60005460405160e084901b6001600160e01b031916815261062e9291600160a01b900460ff169060040161124b565b602060405180830381865afa15801561064b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066f919061125f565b6001600160a01b0316336001600160a01b03161461069f5760405162461bcd60e51b81526004016104229061127c565b60008281526002602052604090206105848282611376565b606060006106c6858585610830565b9050806040516020016106d99190611434565b6040516020818303038152906040529150505b9392505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190611232565b60005460405160e084901b6001600160e01b03191681526107989291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156107b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d9919061125f565b6001600160a01b0316336001600160a01b0316146108095760405162461bcd60e51b81526004016104229061127c565b60408051602080820183526000808352848152600290915291909120906104529082611376565b6060600060405180610480016040528061045681526020016116d061045691399050600061085d85610153565b9050600061086a85610a84565b9050600061087788610aa0565b600089815260016020526040812080549293509091610895906112ee565b80601f01602080910402602001604051908101604052809291908181526020018280546108c1906112ee565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b505050505090506000600260008b81526020019081526020016000208054610935906112ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610961906112ee565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b50505050509050815160001480156109c65750805115155b156109f257826040516020016109dc9190611479565b6040516020818303038152906040529150610a46565b815115801590610a0157508051155b15610a0d575084610a46565b8151158015610a1b57508051155b15610a465782604051602001610a319190611479565b60405160208183030381529060405291508590505b610a768282878787604051602001610a629594939291906114aa565b604051602081830303815290604052610b32565b9a9950505050505050505050565b6060610a9a6001600160a01b0383166014610c91565b92915050565b60606000610aad83610e2c565b60010190506000816001600160401b03811115610acc57610acc610f02565b6040519080825280601f01601f191660200182016040528015610af6576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610b0057509392505050565b60608151600003610b5157505060408051602081019091526000815290565b6000604051806060016040528060408152602001611b266040913990506000600384516002610b8091906111d9565b610b8a91906111b1565b610b9590600461116e565b6001600160401b03811115610bac57610bac610f02565b6040519080825280601f01601f191660200182016040528015610bd6576020820181803683370190505b50905060018201602082018586518701602081018051600082525b82841015610c4c576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450610bf1565b9052505085516003900660018114610c6b5760028114610c7e57610c86565b603d6001830353603d6002830353610c86565b603d60018303535b509195945050505050565b60606000610ca083600261116e565b610cab9060026111d9565b6001600160401b03811115610cc257610cc2610f02565b6040519080825280601f01601f191660200182016040528015610cec576020820181803683370190505b509050600360fc1b81600081518110610d0757610d07611185565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d3657610d36611185565b60200101906001600160f81b031916908160001a9053506000610d5a84600261116e565b610d659060016111d9565b90505b6001811115610ddd576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d9957610d99611185565b1a60f81b828281518110610daf57610daf611185565b60200101906001600160f81b031916908160001a90535060049490941c93610dd6816116b8565b9050610d68565b5083156106ec5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610422565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610e6b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b8310610e95576904ee2d6d415b85acef8160201b830492506020015b662386f26fc100008310610eb357662386f26fc10000830492506010015b6305f5e1008310610ecb576305f5e100830492506008015b6127108310610edf57612710830492506004015b60648310610ef1576064830492506002015b600a8310610a9a5760010192915050565b634e487b7160e01b600052604160045260246000fd5b6000806001600160401b03841115610f3257610f32610f02565b50604051601f19601f85018116603f011681018181106001600160401b0382111715610f6057610f60610f02565b604052838152905080828401851015610f7857600080fd5b83836020830137600060208583010152509392505050565b600082601f830112610fa157600080fd5b6106ec83833560208501610f18565b600060208284031215610fc257600080fd5b81356001600160401b03811115610fd857600080fd5b610fe484828501610f90565b949350505050565b60005b83811015611007578181015183820152602001610fef565b50506000910152565b602081526000825180602084015261102f816040850160208701610fec565b601f01601f19169190910160400192915050565b60006020828403121561105557600080fd5b5035919050565b6000806040838503121561106f57600080fd5b8235915060208301356001600160401b0381111561108c57600080fd5b8301601f8101851361109d57600080fd5b6110ac85823560208401610f18565b9150509250929050565b6001600160a01b03811681146110cb57600080fd5b50565b6000806000606084860312156110e357600080fd5b8335925060208401356001600160401b0381111561110057600080fd5b61110c86828701610f90565b925050604084013561111d816110b6565b809150509250925092565b6003811061114657634e487b7160e01b600052602160045260246000fd5b9052565b60208101610a9a8284611128565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a9a57610a9a611158565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826111c0576111c061119b565b500490565b6000826111d4576111d461119b565b500690565b80820180821115610a9a57610a9a611158565b600081516111fe818560208601610fec565b9290920192915050565b61060f60f31b815260008251611225816002850160208701610fec565b9190910160020192915050565b60006020828403121561124457600080fd5b5051919050565b828152604081016106ec6020830184611128565b60006020828403121561127157600080fd5b81516106ec816110b6565b6020808252604c908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f60608201526b6d61696e2077616c6c65747360a01b608082015260a00190565b600181811c9082168061130257607f821691505b60208210810361132257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561058457806000526020600020601f840160051c8101602085101561134f5750805b601f840160051c820191505b8181101561136f576000815560010161135b565b5050505050565b81516001600160401b0381111561138f5761138f610f02565b6113a38161139d84546112ee565b84611328565b6020601f8211600181146113d757600083156113bf5750848201515b600019600385901b1c1916600184901b17845561136f565b600084815260208120601f198516915b8281101561140757878501518255602094850194600190920191016113e7565b50848210156114255786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161146c81601d850160208701610fec565b91909101601d0192915050565b684c697420504b50202360b81b81526000825161149d816009850160208701610fec565b9190910160090192915050565b683d913730b6b2911d1160b91b815285516000906114cf816009850160208b01610fec565b7f222c20226465736372697074696f6e223a202254686973204e465420656e74696009918401918201527f746c65732074686520686f6c64657220746f207573652061204c69742050726f60298201527f746f636f6c20504b502c20616e6420746f206772616e7420616363657373207460498201527f6f206f7468657220757365727320616e64204c697420416374696f6e7320746f60698201527f20757365207468697320504b50222c22696d6167655f64617461223a20220000608982015286516115a48160a7840160208b01610fec565b6009818301019150507f222c2261747472696275746573223a205b7b2274726169745f74797065223a20609e8201527711283ab13634b19025b2bc911610113b30b63ab2911d101160411b60be8201526116ac61169c61169661165b61165561161060d687018c6111ec565b7f227d2c207b2274726169745f74797065223a20224554482057616c6c6574204181527232323932b9b9911610113b30b63ab2911d101160691b602082015260330190565b896111ec565b7f227d2c207b2274726169745f74797065223a2022546f6b656e204944222c20228152683b30b63ab2911d101160b91b602082015260290190565b866111ec565b63227d5d7d60e01b815260040190565b98975050505050505050565b6000816116c7576116c7611158565b50600019019056fe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130383027206865696768743d2731303830272066696c6c3d276e6f6e652720786d6c6e733a763d2768747470733a2f2f76656374612e696f2f6e616e6f273e3c7061746820643d274d3336332e303736203339322e323237732d2e3937372031382e3532342d33362e3837342037382e393437632d34312e3537362037302e3031382d34352e343831203135312e3937382d332e303137203232302e342038392e353231203134342e323435203333322e343831203134312e3532203432322e3535362e3038392033342e3833322d35342e3730372034342e3831362d3131372e3437392033322e3932342d3138312e323438203020302d32382e3831392d3133332e3134342d3132372e3233372d3231372e30393920312e35353320312e33303820352e3336392031392e31323220362e3130312032362e37323220322e3234312032332e3335342e3034352034372e3833382d372e3738372037302e3036322d352e3734362031362e33332d31332e3731312033302e3436372d32372e3137382034312e33363820302d332e3831312d2e3935342d31302e3633352d2e3937362d31322e3931382d2e3634342d34362e3530382d31382e3635392d38392e3538322d34382e3031312d3132352e3734332d32352e3634372d33312e3535322d36302e3831322d35332e3038392d39372e38342d36382e3933322e39333120332e31393120322e3636322031362e34313920322e3930362031392e30333320312e3930382032312e39353820322e3236332035322e3731332d2e3632312037342e363439732d372e3833322033332e3837382d31342e3535342035342e343431632d31302e3138342033312e3137352d32342e30352035342e3238352d34312e3632312038322e3030342d332e323420352e3039362d31322e3931332031392e3037382d31382e3038322032362e313436203020302d382e3839372d35362e3139312d34302e3636372d38372e393231682d2e3032327a272066696c6c3d2723303030272f3e3c7061746820643d274d3536322e352032372e32386c3431302e323739203233362e3837346331332e39323320382e3033392032322e352032322e3839352032322e352033382e393731763437332e373563302031362e3037362d382e3537372033302e3933322d32322e352033382e3937314c3536322e3520313035322e3732632d31332e39323320382e30342d33312e30373720382e30342d343520304c3130372e323231203831352e383436632d31332e3932332d382e3033392d32322e352d32322e3839352d32322e352d33382e393731762d3437332e37356134352034352030203020312032322e352d33382e3937314c3531372e352032372e323861343520343520302030203120343520307a27207374726f6b653d272330303027207374726f6b652d77696474683d2732342e3735272f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220119f3eff15d9f5ea1c055f3790173296030e59973e2ad660e8711a55e2f0331364736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100785760003560e01c8063451d89fa1461007d57806350d17b5e146100a6578063519a218e146100d1578063855eec22146100e65780639000fee1146100f9578063950462ee1461010c5780639dca00321461011f578063b63a767714610140575b600080fd5b61009061008b366004610fb0565b610153565b60405161009d9190611010565b60405180910390f35b6000546100b9906001600160a01b031681565b6040516001600160a01b03909116815260200161009d565b6100e46100df366004611043565b61030c565b005b6100e46100f436600461105c565b610456565b6100e461010736600461105c565b610589565b61009061011a3660046110ce565b6106b7565b60005461013390600160a01b900460ff1681565b60405161009d919061114a565b6100e461014e366004611043565b6106f3565b6060600082516002610165919061116e565b6001600160401b0381111561017c5761017c610f02565b6040519080825280601f01601f1916602001820160405280156101a6576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b84518110156102e2578182518683815181106101f2576101f2611185565b0160200151610204919060f81c6111b1565b8151811061021457610214611185565b01602001516001600160f81b0319168361022f83600261116e565b8151811061023f5761023f611185565b60200101906001600160f81b031916908160001a90535081825186838151811061026b5761026b611185565b016020015161027d919060f81c6111c5565b8151811061028d5761028d611185565b01602001516001600160f81b031916836102a883600261116e565b6102b39060016111d9565b815181106102c3576102c3611185565b60200101906001600160f81b031916908160001a9053506001016101d4565b50816040516020016102f49190611208565b60405160208183030381529060405292505050919050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa15801561035e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103829190611232565b60005460405160e084901b6001600160e01b03191681526103b19291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156103ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f2919061125f565b6001600160a01b0316336001600160a01b03161461042b5760405162461bcd60e51b81526004016104229061127c565b60405180910390fd5b60408051602080820183526000808352848152600190915291909120906104529082611376565b5050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156104a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cc9190611232565b60005460405160e084901b6001600160e01b03191681526104fb9291600160a01b900460ff169060040161124b565b602060405180830381865afa158015610518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053c919061125f565b6001600160a01b0316336001600160a01b03161461056c5760405162461bcd60e51b81526004016104229061127c565b60008281526001602052604090206105848282611376565b505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa1580156105db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ff9190611232565b60005460405160e084901b6001600160e01b031916815261062e9291600160a01b900460ff169060040161124b565b602060405180830381865afa15801561064b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066f919061125f565b6001600160a01b0316336001600160a01b03161461069f5760405162461bcd60e51b81526004016104229061127c565b60008281526002602052604090206105848282611376565b606060006106c6858585610830565b9050806040516020016106d99190611434565b6040516020818303038152906040529150505b9392505050565b60005460408051630977a80760e41b815290516001600160a01b0390921691638e8dfd1691839163977a8070916004808201926020929091908290030181865afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190611232565b60005460405160e084901b6001600160e01b03191681526107989291600160a01b900460ff169060040161124b565b602060405180830381865afa1580156107b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d9919061125f565b6001600160a01b0316336001600160a01b0316146108095760405162461bcd60e51b81526004016104229061127c565b60408051602080820183526000808352848152600290915291909120906104529082611376565b6060600060405180610480016040528061045681526020016116d061045691399050600061085d85610153565b9050600061086a85610a84565b9050600061087788610aa0565b600089815260016020526040812080549293509091610895906112ee565b80601f01602080910402602001604051908101604052809291908181526020018280546108c1906112ee565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b505050505090506000600260008b81526020019081526020016000208054610935906112ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610961906112ee565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b50505050509050815160001480156109c65750805115155b156109f257826040516020016109dc9190611479565b6040516020818303038152906040529150610a46565b815115801590610a0157508051155b15610a0d575084610a46565b8151158015610a1b57508051155b15610a465782604051602001610a319190611479565b60405160208183030381529060405291508590505b610a768282878787604051602001610a629594939291906114aa565b604051602081830303815290604052610b32565b9a9950505050505050505050565b6060610a9a6001600160a01b0383166014610c91565b92915050565b60606000610aad83610e2c565b60010190506000816001600160401b03811115610acc57610acc610f02565b6040519080825280601f01601f191660200182016040528015610af6576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610b0057509392505050565b60608151600003610b5157505060408051602081019091526000815290565b6000604051806060016040528060408152602001611b266040913990506000600384516002610b8091906111d9565b610b8a91906111b1565b610b9590600461116e565b6001600160401b03811115610bac57610bac610f02565b6040519080825280601f01601f191660200182016040528015610bd6576020820181803683370190505b50905060018201602082018586518701602081018051600082525b82841015610c4c576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450610bf1565b9052505085516003900660018114610c6b5760028114610c7e57610c86565b603d6001830353603d6002830353610c86565b603d60018303535b509195945050505050565b60606000610ca083600261116e565b610cab9060026111d9565b6001600160401b03811115610cc257610cc2610f02565b6040519080825280601f01601f191660200182016040528015610cec576020820181803683370190505b509050600360fc1b81600081518110610d0757610d07611185565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d3657610d36611185565b60200101906001600160f81b031916908160001a9053506000610d5a84600261116e565b610d659060016111d9565b90505b6001811115610ddd576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d9957610d99611185565b1a60f81b828281518110610daf57610daf611185565b60200101906001600160f81b031916908160001a90535060049490941c93610dd6816116b8565b9050610d68565b5083156106ec5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610422565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610e6b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b8310610e95576904ee2d6d415b85acef8160201b830492506020015b662386f26fc100008310610eb357662386f26fc10000830492506010015b6305f5e1008310610ecb576305f5e100830492506008015b6127108310610edf57612710830492506004015b60648310610ef1576064830492506002015b600a8310610a9a5760010192915050565b634e487b7160e01b600052604160045260246000fd5b6000806001600160401b03841115610f3257610f32610f02565b50604051601f19601f85018116603f011681018181106001600160401b0382111715610f6057610f60610f02565b604052838152905080828401851015610f7857600080fd5b83836020830137600060208583010152509392505050565b600082601f830112610fa157600080fd5b6106ec83833560208501610f18565b600060208284031215610fc257600080fd5b81356001600160401b03811115610fd857600080fd5b610fe484828501610f90565b949350505050565b60005b83811015611007578181015183820152602001610fef565b50506000910152565b602081526000825180602084015261102f816040850160208701610fec565b601f01601f19169190910160400192915050565b60006020828403121561105557600080fd5b5035919050565b6000806040838503121561106f57600080fd5b8235915060208301356001600160401b0381111561108c57600080fd5b8301601f8101851361109d57600080fd5b6110ac85823560208401610f18565b9150509250929050565b6001600160a01b03811681146110cb57600080fd5b50565b6000806000606084860312156110e357600080fd5b8335925060208401356001600160401b0381111561110057600080fd5b61110c86828701610f90565b925050604084013561111d816110b6565b809150509250925092565b6003811061114657634e487b7160e01b600052602160045260246000fd5b9052565b60208101610a9a8284611128565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a9a57610a9a611158565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826111c0576111c061119b565b500490565b6000826111d4576111d461119b565b500690565b80820180821115610a9a57610a9a611158565b600081516111fe818560208601610fec565b9290920192915050565b61060f60f31b815260008251611225816002850160208701610fec565b9190910160020192915050565b60006020828403121561124457600080fd5b5051919050565b828152604081016106ec6020830184611128565b60006020828403121561127157600080fd5b81516106ec816110b6565b6020808252604c908201527f504b5048656c7065723a206f6e6c792074686520446f6d61696e2057616c6c6560408201527f7420726567697374727920697320616c6c6f77656420746f206d696e7420646f60608201526b6d61696e2077616c6c65747360a01b608082015260a00190565b600181811c9082168061130257607f821691505b60208210810361132257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561058457806000526020600020601f840160051c8101602085101561134f5750805b601f840160051c820191505b8181101561136f576000815560010161135b565b5050505050565b81516001600160401b0381111561138f5761138f610f02565b6113a38161139d84546112ee565b84611328565b6020601f8211600181146113d757600083156113bf5750848201515b600019600385901b1c1916600184901b17845561136f565b600084815260208120601f198516915b8281101561140757878501518255602094850194600190920191016113e7565b50848210156114255786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161146c81601d850160208701610fec565b91909101601d0192915050565b684c697420504b50202360b81b81526000825161149d816009850160208701610fec565b9190910160090192915050565b683d913730b6b2911d1160b91b815285516000906114cf816009850160208b01610fec565b7f222c20226465736372697074696f6e223a202254686973204e465420656e74696009918401918201527f746c65732074686520686f6c64657220746f207573652061204c69742050726f60298201527f746f636f6c20504b502c20616e6420746f206772616e7420616363657373207460498201527f6f206f7468657220757365727320616e64204c697420416374696f6e7320746f60698201527f20757365207468697320504b50222c22696d6167655f64617461223a20220000608982015286516115a48160a7840160208b01610fec565b6009818301019150507f222c2261747472696275746573223a205b7b2274726169745f74797065223a20609e8201527711283ab13634b19025b2bc911610113b30b63ab2911d101160411b60be8201526116ac61169c61169661165b61165561161060d687018c6111ec565b7f227d2c207b2274726169745f74797065223a20224554482057616c6c6574204181527232323932b9b9911610113b30b63ab2911d101160691b602082015260330190565b896111ec565b7f227d2c207b2274726169745f74797065223a2022546f6b656e204944222c20228152683b30b63ab2911d101160b91b602082015260290190565b866111ec565b63227d5d7d60e01b815260040190565b98975050505050505050565b6000816116c7576116c7611158565b50600019019056fe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130383027206865696768743d2731303830272066696c6c3d276e6f6e652720786d6c6e733a763d2768747470733a2f2f76656374612e696f2f6e616e6f273e3c7061746820643d274d3336332e303736203339322e323237732d2e3937372031382e3532342d33362e3837342037382e393437632d34312e3537362037302e3031382d34352e343831203135312e3937382d332e303137203232302e342038392e353231203134342e323435203333322e343831203134312e3532203432322e3535362e3038392033342e3833322d35342e3730372034342e3831362d3131372e3437392033322e3932342d3138312e323438203020302d32382e3831392d3133332e3134342d3132372e3233372d3231372e30393920312e35353320312e33303820352e3336392031392e31323220362e3130312032362e37323220322e3234312032332e3335342e3034352034372e3833382d372e3738372037302e3036322d352e3734362031362e33332d31332e3731312033302e3436372d32372e3137382034312e33363820302d332e3831312d2e3935342d31302e3633352d2e3937362d31322e3931382d2e3634342d34362e3530382d31382e3635392d38392e3538322d34382e3031312d3132352e3734332d32352e3634372d33312e3535322d36302e3831322d35332e3038392d39372e38342d36382e3933322e39333120332e31393120322e3636322031362e34313920322e3930362031392e30333320312e3930382032312e39353820322e3236332035322e3731332d2e3632312037342e363439732d372e3833322033332e3837382d31342e3535342035342e343431632d31302e3138342033312e3137352d32342e30352035342e3238352d34312e3632312038322e3030342d332e323420352e3039362d31322e3931332031392e3037382d31382e3038322032362e313436203020302d382e3839372d35362e3139312d34302e3636372d38372e393231682d2e3032327a272066696c6c3d2723303030272f3e3c7061746820643d274d3536322e352032372e32386c3431302e323739203233362e3837346331332e39323320382e3033392032322e352032322e3839352032322e352033382e393731763437332e373563302031362e3037362d382e3537372033302e3933322d32322e352033382e3937314c3536322e3520313035322e3732632d31332e39323320382e30342d33312e30373720382e30342d343520304c3130372e323231203831352e383436632d31332e3932332d382e3033392d32322e352d32322e3839352d32322e352d33382e393731762d3437332e37356134352034352030203020312032322e352d33382e3937314c3531372e352032372e323861343520343520302030203120343520307a27207374726f6b653d272330303027207374726f6b652d77696474683d2732342e3735272f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220119f3eff15d9f5ea1c055f3790173296030e59973e2ad660e8711a55e2f0331364736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/rust/lit-core/lit-blockchain/abis/PubkeyRouter.json b/rust/lit-core/lit-blockchain/abis/PubkeyRouter.json index 814aec26..5c48ab5e 100644 --- a/rust/lit-core/lit-blockchain/abis/PubkeyRouter.json +++ b/rust/lit-core/lit-blockchain/abis/PubkeyRouter.json @@ -501,6 +501,12 @@ "internalType": "bytes32", "name": "derivedKeyId", "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" } ], "name": "PubkeyRoutingDataSet", @@ -622,6 +628,156 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "getTrustedForwarder", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" + } + ], + "name": "setRoutingData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" + } + ], + "name": "setRoutingDataAsAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "forwarder", + "type": "address" + } + ], + "name": "setTrustedForwarder", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "identifier", + "type": "string" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "internalType": "struct IPubkeyRouter.RootKey[]", + "name": "newRootKeys", + "type": "tuple[]" + } + ], + "name": "voteForRootKeys", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -920,6 +1076,11 @@ "internalType": "bytes32", "name": "derivedKeyId", "type": "bytes32" + }, + { + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" } ], "internalType": "struct LibPubkeyRouterStorage.PubkeyRoutingData", @@ -930,19 +1091,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getTrustedForwarder", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -988,6 +1136,11 @@ "internalType": "bytes32", "name": "derivedKeyId", "type": "bytes32" + }, + { + "internalType": "string", + "name": "keySetIdentifier", + "type": "string" } ], "internalType": "struct LibPubkeyRouterStorage.PubkeyRoutingData", @@ -997,133 +1150,6 @@ ], "stateMutability": "view", "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newResolverAddress", - "type": "address" - } - ], - "name": "setContractResolver", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - }, - { - "internalType": "address", - "name": "stakingContractAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "keyType", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "derivedKeyId", - "type": "bytes32" - } - ], - "name": "setRoutingData", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - }, - { - "internalType": "address", - "name": "stakingContract", - "type": "address" - }, - { - "internalType": "uint256", - "name": "keyType", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "derivedKeyId", - "type": "bytes32" - } - ], - "name": "setRoutingDataAsAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "forwarder", - "type": "address" - } - ], - "name": "setTrustedForwarder", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "stakingContractAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "identifier", - "type": "string" - }, - { - "components": [ - { - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "keyType", - "type": "uint256" - } - ], - "internalType": "struct IPubkeyRouter.RootKey[]", - "name": "newRootKeys", - "type": "tuple[]" - } - ], - "name": "voteForRootKeys", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" } ], "deployedBytecode": "", diff --git a/rust/lit-core/lit-blockchain/abis/Staking.json b/rust/lit-core/lit-blockchain/abis/Staking.json index 59258849..08eb31f7 100644 --- a/rust/lit-core/lit-blockchain/abis/Staking.json +++ b/rust/lit-core/lit-blockchain/abis/Staking.json @@ -394,6 +394,11 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "CallerNotOwner", + "type": "error" + }, { "inputs": [ { @@ -583,6 +588,71 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "realmId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "maxConcurrentRequests", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPresignCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minPresignCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "peerCheckingIntervalSecs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPresignConcurrency", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "rpcHealthcheckEnabled", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "minEpochForRewards", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "permittedValidatorsOn", + "type": "bool" + }, + { + "internalType": "string", + "name": "defaultKeySet", + "type": "string" + } + ], + "internalType": "struct LibStakingStorage.RealmConfig", + "name": "newConfig", + "type": "tuple" + } + ], + "name": "setRealmConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -694,11 +764,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "CallerNotOwner", - "type": "error" - }, { "inputs": [], "name": "CallerNotOwnerOrDevopsAdmin", @@ -1332,11 +1397,6 @@ "name": "tokenRewardPerTokenPerEpoch", "type": "uint256" }, - { - "internalType": "uint256[]", - "name": "keyTypes", - "type": "uint256[]" - }, { "internalType": "uint256", "name": "minimumValidatorCount", @@ -1688,66 +1748,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "realmId", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "maxConcurrentRequests", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPresignCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minPresignCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "peerCheckingIntervalSecs", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPresignConcurrency", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "rpcHealthcheckEnabled", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "minEpochForRewards", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "permittedValidatorsOn", - "type": "bool" - } - ], - "internalType": "struct LibStakingStorage.RealmConfig", - "name": "newConfig", - "type": "tuple" - } - ], - "name": "setRealmConfig", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -2689,9 +2689,9 @@ "type": "uint256[]" }, { - "internalType": "address[]", - "name": "recoveryPartyMembers", - "type": "address[]" + "internalType": "bytes", + "name": "recoverySessionId", + "type": "bytes" } ], "internalType": "struct LibStakingStorage.KeySetConfig", @@ -2749,9 +2749,9 @@ "type": "uint256[]" }, { - "internalType": "address[]", - "name": "recoveryPartyMembers", - "type": "address[]" + "internalType": "bytes", + "name": "recoverySessionId", + "type": "bytes" } ], "internalType": "struct LibStakingStorage.KeySetConfig[]", @@ -2807,9 +2807,9 @@ "type": "uint256[]" }, { - "internalType": "address[]", - "name": "recoveryPartyMembers", - "type": "address[]" + "internalType": "bytes", + "name": "recoverySessionId", + "type": "bytes" } ], "internalType": "struct LibStakingStorage.KeySetConfig", @@ -3303,67 +3303,6 @@ "name": "ComplaintConfigSet", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "newTokenRewardPerTokenPerEpoch", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "newKeyTypes", - "type": "uint256[]" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMinimumValidatorCount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMaxConcurrentRequests", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMaxPresignCount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMinPresignCount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newPeerCheckingIntervalSecs", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMaxPresignConcurrency", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bool", - "name": "newRpcHealthcheckEnabled", - "type": "bool" - } - ], - "name": "ConfigSet", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -4683,19 +4622,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getKeyTypes", - "outputs": [ - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -5990,11 +5916,6 @@ "name": "tokenRewardPerTokenPerEpoch", "type": "uint256" }, - { - "internalType": "uint256[]", - "name": "keyTypes", - "type": "uint256[]" - }, { "internalType": "uint256", "name": "minimumValidatorCount", @@ -6645,6 +6566,11 @@ "internalType": "bool", "name": "permittedValidatorsOn", "type": "bool" + }, + { + "internalType": "string", + "name": "defaultKeySet", + "type": "string" } ], "internalType": "struct LibStakingStorage.RealmConfig", diff --git a/rust/lit-core/lit-blockchain/src/contracts/arbitrum_key_deriver.rs b/rust/lit-core/lit-blockchain/src/contracts/arbitrum_key_deriver.rs index dfc3f724..0b30e2df 100644 --- a/rust/lit-core/lit-blockchain/src/contracts/arbitrum_key_deriver.rs +++ b/rust/lit-core/lit-blockchain/src/contracts/arbitrum_key_deriver.rs @@ -544,13 +544,13 @@ pub mod arbitrum_key_deriver { ::ethers::core::abi::Abi, > = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\x11\xCA8\x03\x80a\x11\xCA\x839\x81\x01`@\x81\x90Ra\0/\x91a\x01\xA4V[a\0G`\0\x80Q` a\x11\xAA\x839\x81Q\x91R3a\0\xADV[a\0_`\0\x80Q` a\x11\xAA\x839\x81Q\x91R\x80a\0\xBBV[`\x01\x80T`\x01`\x01`\xA0\x1B\x03\x84\x16`\x01`\x01`\xA0\x1B\x03\x19\x82\x16\x81\x17\x83U\x83\x92\x91`\x01`\x01`\xA8\x1B\x03\x19\x16\x17`\x01`\xA0\x1B\x83`\x02\x81\x11\x15a\0\xA1Wa\0\xA1a\x01\xEEV[\x02\x17\x90UPPPa\x02\x04V[a\0\xB7\x82\x82a\x01\x06V[PPV[`\0\x82\x81R` \x81\x90R`@\x80\x82 `\x01\x01\x80T\x90\x84\x90U\x90Q\x90\x91\x83\x91\x83\x91\x86\x91\x7F\xBDy\xB8o\xFE\n\xB8\xE8waQQB\x17\xCD|\xAC\xD5,\x90\x9FfG\\:\xF4N\x12\x9F\x0B\0\xFF\x91\x90\xA4PPPV[`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 T`\xFF\x16a\0\xB7W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x01`3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[`\0\x80`@\x83\x85\x03\x12\x15a\x01\xB7W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x01\xCEW`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x03\x81\x10a\x01\xE3W`\0\x80\xFD[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[a\x0F\x97\x80a\x02\x13`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xBAW`\x005`\xE0\x1C\x80c\x01\xFF\xC9\xA7\x14a\0\xBFW\x80c$\x8A\x9C\xA3\x14a\0\xE7W\x80c//\xF1]\x14a\x01\x08W\x80c6V\x8A\xBE\x14a\x01\x1DW\x80cP\xD1{^\x14a\x010W\x80cu\xB28\xFC\x14a\x01[W\x80c\x91\xD1HT\x14a\x01\x82W\x80c\x9D\xCA\x002\x14a\x01\x95W\x80c\xA2\x17\xFD\xDF\x14a\x01\xB6W\x80c\xA3,+\x99\x14a\x01\xBEW\x80c\xB2N\xD3\x08\x14a\x01\xDFW\x80c\xD5Gt\x1F\x14a\x02\x06W\x80c\xF9]q\xB1\x14a\x02\x19W\x80c\xFE\x89\xC9p\x14a\x02,W[`\0\x80\xFD[a\0\xD2a\0\xCD6`\x04a\t\x8DV[a\x02RV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xFAa\0\xF56`\x04a\t\xB7V[a\x02\x89V[`@Q\x90\x81R` \x01a\0\xDEV[a\x01\x1Ba\x01\x166`\x04a\t\xE5V[a\x02\x9EV[\0[a\x01\x1Ba\x01+6`\x04a\t\xE5V[a\x02\xBFV[`\x01Ta\x01C\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xDEV[a\0\xFA\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\x81V[a\0\xD2a\x01\x906`\x04a\t\xE5V[a\x03BV[`\x01Ta\x01\xA9\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\xDE\x91\x90a\n7V[a\0\xFA`\0\x81V[a\x01\xD1a\x01\xCC6`\x04a\n\xDAV[a\x03kV[`@Qa\0\xDE\x92\x91\x90a\x0C\x92V[a\0\xFA\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9\x81V[a\x01\x1Ba\x02\x146`\x04a\t\xE5V[a\x04\xF6V[a\x01\x1Ba\x02'6`\x04a\x0C\xB5V[a\x05\x12V[a\0\xFA~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x02\x83WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x02\xA7\x82a\x02\x89V[a\x02\xB0\x81a\x05_V[a\x02\xBA\x83\x83a\x05lV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x034W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x03>\x82\x82a\x05\xF0V[PPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[`\0```\0a\x03|\x86\x86\x86a\x06UV[\x90P`\0\x81`\0\x81Q\x81\x10a\x03\x93Wa\x03\x93a\x0C\xD2V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16`\0\x03a\x03\xD0WP\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9a\x03\xF2V[P~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd[`\x01T`@QcGF\xFE\x8B`\xE1\x1B\x81R`\0\x91`\x01`\x01`\xA0\x1B\x03\x81\x16\x91c\x8E\x8D\xFD\x16\x91a\x04/\x91\x86\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x0C\xE8V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04LW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04p\x91\x90a\x0C\xFCV[\x90P`\0\x81`\x01`\x01`\xA0\x1B\x03\x16c\xECr3g\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04\xA0\x91\x90a\r\x19V[`\0`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xBDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra\x04\xE5\x91\x90\x81\x01\x90a\r,V[`\x01\x9A\x90\x99P\x97PPPPPPPPV[a\x04\xFF\x82a\x02\x89V[a\x05\x08\x81a\x05_V[a\x02\xBA\x83\x83a\x05\xF0V[\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECBa\x05<\x81a\x05_V[P`\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[a\x05i\x813a\x07\x87V[PV[a\x05v\x82\x82a\x03BV[a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x05\xAC3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x05\xFA\x82\x82a\x03BV[\x15a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x06\xEFW\x84\x86\x82\x81Q\x81\x10a\x06\x86Wa\x06\x86a\x0C\xD2V[` \x02` \x01\x01Q` \x01Q\x03a\x06\xE7W\x82\x86\x82\x81Q\x81\x10a\x06\xAAWa\x06\xAAa\x0C\xD2V[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x06\xC7\x92\x91\x90a\r\xA2V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x06\xE3\x90a\r\xE7V[\x92PP[`\x01\x01a\x06jV[P\x83`\x02\x03a\x07\x01W`\x01\x93Pa\x07\x0EV[\x83`\x03\x03a\x07\x0EW`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x0F7`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x07e\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x0E\x0CV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x98PPPPPPPPP[\x93\x92PPPV[a\x07\x91\x82\x82a\x03BV[a\x03>Wa\x07\x9E\x81a\x07\xE0V[a\x07\xA9\x83` a\x07\xF2V[`@Q` \x01a\x07\xBA\x92\x91\x90a\x0E\x86V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x03+\x91`\x04\x01a\r\x19V[``a\x02\x83`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\x08\x01\x83`\x02a\x0E\xF5V[a\x08\x0C\x90`\x02a\x0F\x0CV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x08#Wa\x08#a\nEV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x08MW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\x08hWa\x08ha\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\x08\x97Wa\x08\x97a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x08\xBB\x84`\x02a\x0E\xF5V[a\x08\xC6\x90`\x01a\x0F\x0CV[\x90P[`\x01\x81\x11\x15a\t>Wo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x08\xFAWa\x08\xFAa\x0C\xD2V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\t\x10Wa\t\x10a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\t7\x81a\x0F\x1FV[\x90Pa\x08\xC9V[P\x83\x15a\x07\x80W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x03+V[`\0` \x82\x84\x03\x12\x15a\t\x9FW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x07\x80W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\t\xC9W`\0\x80\xFD[P5\x91\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x05iW`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\t\xF8W`\0\x80\xFD[\x825\x91P` \x83\x015a\n\n\x81a\t\xD0V[\x80\x91PP\x92P\x92\x90PV[`\x03\x81\x10a\n3WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x02\x83\x82\x84a\n\x15V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n}Wa\n}a\nEV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n\xABWa\n\xABa\nEV[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\n\xCCWa\n\xCCa\nEV[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x80`\0``\x84\x86\x03\x12\x15a\n\xEFW`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x0CW`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x0B\x1DW`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B6Wa\x0B6a\nEV[\x80`\x05\x1Ba\x0BF` \x82\x01a\n\x83V[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x0BbW`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x0C-W\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x87W`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x0B\x9DW`\0\x80\xFD[a\x0B\xA5a\n[V[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xBEW`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x0B\xD3W`\0\x80\xFD[\x805a\x0B\xE6a\x0B\xE1\x82a\n\xB3V[a\n\x83V[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x0B\xFBW`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x0BiV[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x0C]W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0CEV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x0C~\x81` \x86\x01` \x86\x01a\x0CBV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x15\x15\x81R`@` \x82\x01R`\0a\x0C\xAD`@\x83\x01\x84a\x0CfV[\x94\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x0C\xC7W`\0\x80\xFD[\x815a\x07\x80\x81a\t\xD0V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x82\x81R`@\x81\x01a\x07\x80` \x83\x01\x84a\n\x15V[`\0` \x82\x84\x03\x12\x15a\r\x0EW`\0\x80\xFD[\x81Qa\x07\x80\x81a\t\xD0V[` \x81R`\0a\x07\x80` \x83\x01\x84a\x0CfV[`\0` \x82\x84\x03\x12\x15a\r>W`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\rTW`\0\x80\xFD[\x82\x01`\x1F\x81\x01\x84\x13a\reW`\0\x80\xFD[\x80Qa\rsa\x0B\xE1\x82a\n\xB3V[\x81\x81R\x85` \x83\x85\x01\x01\x11\x15a\r\x88W`\0\x80\xFD[a\r\x99\x82` \x83\x01` \x86\x01a\x0CBV[\x95\x94PPPPPV[`\0\x83Qa\r\xB4\x81\x84` \x88\x01a\x0CBV[\x83Q\x90\x83\x01\x90a\r\xC8\x81\x83` \x88\x01a\x0CBV[\x01\x94\x93PPPPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x0E\x03Wa\x0E\x03a\r\xD1V[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x0EN\x81`)\x85\x01` \x89\x01a\x0CBV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x0Eu\x81`-\x84\x01` \x88\x01a\x0CBV[\x01`-\x01\x99\x98PPPPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x0E\xB8\x81`\x17\x85\x01` \x88\x01a\x0CBV[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x0E\xE9\x81`(\x84\x01` \x88\x01a\x0CBV[\x01`(\x01\x94\x93PPPPV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x02\x83Wa\x02\x83a\r\xD1V[\x80\x82\x01\x80\x82\x11\x15a\x02\x83Wa\x02\x83a\r\xD1V[`\0\x81a\x0F.Wa\x0F.a\r\xD1V[P`\0\x19\x01\x90V\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 7$;\xC4>x\xAC4\xBBE\xBF\xE2CE\x0C(\x1Fa\xD2&\xE1,\xDA\xB0K(\x99\x83*D\xFFwdsolcC\0\x08\x1C\x003\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB"; + const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\x11\xCA8\x03\x80a\x11\xCA\x839\x81\x01`@\x81\x90Ra\0/\x91a\x01\xA4V[a\0G`\0\x80Q` a\x11\xAA\x839\x81Q\x91R3a\0\xADV[a\0_`\0\x80Q` a\x11\xAA\x839\x81Q\x91R\x80a\0\xBBV[`\x01\x80T`\x01`\x01`\xA0\x1B\x03\x84\x16`\x01`\x01`\xA0\x1B\x03\x19\x82\x16\x81\x17\x83U\x83\x92\x91`\x01`\x01`\xA8\x1B\x03\x19\x16\x17`\x01`\xA0\x1B\x83`\x02\x81\x11\x15a\0\xA1Wa\0\xA1a\x01\xEEV[\x02\x17\x90UPPPa\x02\x04V[a\0\xB7\x82\x82a\x01\x06V[PPV[`\0\x82\x81R` \x81\x90R`@\x80\x82 `\x01\x01\x80T\x90\x84\x90U\x90Q\x90\x91\x83\x91\x83\x91\x86\x91\x7F\xBDy\xB8o\xFE\n\xB8\xE8waQQB\x17\xCD|\xAC\xD5,\x90\x9FfG\\:\xF4N\x12\x9F\x0B\0\xFF\x91\x90\xA4PPPV[`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 T`\xFF\x16a\0\xB7W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x01`3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[`\0\x80`@\x83\x85\x03\x12\x15a\x01\xB7W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x01\xCEW`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x03\x81\x10a\x01\xE3W`\0\x80\xFD[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[a\x0F\x97\x80a\x02\x13`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xBAW`\x005`\xE0\x1C\x80c\x01\xFF\xC9\xA7\x14a\0\xBFW\x80c$\x8A\x9C\xA3\x14a\0\xE7W\x80c//\xF1]\x14a\x01\x08W\x80c6V\x8A\xBE\x14a\x01\x1DW\x80cP\xD1{^\x14a\x010W\x80cu\xB28\xFC\x14a\x01[W\x80c\x91\xD1HT\x14a\x01\x82W\x80c\x9D\xCA\x002\x14a\x01\x95W\x80c\xA2\x17\xFD\xDF\x14a\x01\xB6W\x80c\xA3,+\x99\x14a\x01\xBEW\x80c\xB2N\xD3\x08\x14a\x01\xDFW\x80c\xD5Gt\x1F\x14a\x02\x06W\x80c\xF9]q\xB1\x14a\x02\x19W\x80c\xFE\x89\xC9p\x14a\x02,W[`\0\x80\xFD[a\0\xD2a\0\xCD6`\x04a\t\x8DV[a\x02RV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xFAa\0\xF56`\x04a\t\xB7V[a\x02\x89V[`@Q\x90\x81R` \x01a\0\xDEV[a\x01\x1Ba\x01\x166`\x04a\t\xE5V[a\x02\x9EV[\0[a\x01\x1Ba\x01+6`\x04a\t\xE5V[a\x02\xBFV[`\x01Ta\x01C\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xDEV[a\0\xFA\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\x81V[a\0\xD2a\x01\x906`\x04a\t\xE5V[a\x03BV[`\x01Ta\x01\xA9\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\xDE\x91\x90a\n7V[a\0\xFA`\0\x81V[a\x01\xD1a\x01\xCC6`\x04a\n\xDAV[a\x03kV[`@Qa\0\xDE\x92\x91\x90a\x0C\x92V[a\0\xFA\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9\x81V[a\x01\x1Ba\x02\x146`\x04a\t\xE5V[a\x04\xF6V[a\x01\x1Ba\x02'6`\x04a\x0C\xB5V[a\x05\x12V[a\0\xFA~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x02\x83WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x02\xA7\x82a\x02\x89V[a\x02\xB0\x81a\x05_V[a\x02\xBA\x83\x83a\x05lV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x034W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x03>\x82\x82a\x05\xF0V[PPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[`\0```\0a\x03|\x86\x86\x86a\x06UV[\x90P`\0\x81`\0\x81Q\x81\x10a\x03\x93Wa\x03\x93a\x0C\xD2V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16`\0\x03a\x03\xD0WP\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9a\x03\xF2V[P~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd[`\x01T`@QcGF\xFE\x8B`\xE1\x1B\x81R`\0\x91`\x01`\x01`\xA0\x1B\x03\x81\x16\x91c\x8E\x8D\xFD\x16\x91a\x04/\x91\x86\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x0C\xE8V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04LW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04p\x91\x90a\x0C\xFCV[\x90P`\0\x81`\x01`\x01`\xA0\x1B\x03\x16c\xECr3g\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04\xA0\x91\x90a\r\x19V[`\0`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xBDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra\x04\xE5\x91\x90\x81\x01\x90a\r,V[`\x01\x9A\x90\x99P\x97PPPPPPPPV[a\x04\xFF\x82a\x02\x89V[a\x05\x08\x81a\x05_V[a\x02\xBA\x83\x83a\x05\xF0V[\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECBa\x05<\x81a\x05_V[P`\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[a\x05i\x813a\x07\x87V[PV[a\x05v\x82\x82a\x03BV[a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x05\xAC3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x05\xFA\x82\x82a\x03BV[\x15a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x06\xEFW\x84\x86\x82\x81Q\x81\x10a\x06\x86Wa\x06\x86a\x0C\xD2V[` \x02` \x01\x01Q` \x01Q\x03a\x06\xE7W\x82\x86\x82\x81Q\x81\x10a\x06\xAAWa\x06\xAAa\x0C\xD2V[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x06\xC7\x92\x91\x90a\r\xA2V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x06\xE3\x90a\r\xE7V[\x92PP[`\x01\x01a\x06jV[P\x83`\x02\x03a\x07\x01W`\x01\x93Pa\x07\x0EV[\x83`\x03\x03a\x07\x0EW`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x0F7`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x07e\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x0E\x0CV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x98PPPPPPPPP[\x93\x92PPPV[a\x07\x91\x82\x82a\x03BV[a\x03>Wa\x07\x9E\x81a\x07\xE0V[a\x07\xA9\x83` a\x07\xF2V[`@Q` \x01a\x07\xBA\x92\x91\x90a\x0E\x86V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x03+\x91`\x04\x01a\r\x19V[``a\x02\x83`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\x08\x01\x83`\x02a\x0E\xF5V[a\x08\x0C\x90`\x02a\x0F\x0CV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x08#Wa\x08#a\nEV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x08MW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\x08hWa\x08ha\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\x08\x97Wa\x08\x97a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x08\xBB\x84`\x02a\x0E\xF5V[a\x08\xC6\x90`\x01a\x0F\x0CV[\x90P[`\x01\x81\x11\x15a\t>Wo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x08\xFAWa\x08\xFAa\x0C\xD2V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\t\x10Wa\t\x10a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\t7\x81a\x0F\x1FV[\x90Pa\x08\xC9V[P\x83\x15a\x07\x80W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x03+V[`\0` \x82\x84\x03\x12\x15a\t\x9FW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x07\x80W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\t\xC9W`\0\x80\xFD[P5\x91\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x05iW`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\t\xF8W`\0\x80\xFD[\x825\x91P` \x83\x015a\n\n\x81a\t\xD0V[\x80\x91PP\x92P\x92\x90PV[`\x03\x81\x10a\n3WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x02\x83\x82\x84a\n\x15V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n}Wa\n}a\nEV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n\xABWa\n\xABa\nEV[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\n\xCCWa\n\xCCa\nEV[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x80`\0``\x84\x86\x03\x12\x15a\n\xEFW`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x0CW`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x0B\x1DW`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B6Wa\x0B6a\nEV[\x80`\x05\x1Ba\x0BF` \x82\x01a\n\x83V[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x0BbW`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x0C-W\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x87W`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x0B\x9DW`\0\x80\xFD[a\x0B\xA5a\n[V[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xBEW`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x0B\xD3W`\0\x80\xFD[\x805a\x0B\xE6a\x0B\xE1\x82a\n\xB3V[a\n\x83V[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x0B\xFBW`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x0BiV[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x0C]W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0CEV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x0C~\x81` \x86\x01` \x86\x01a\x0CBV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x15\x15\x81R`@` \x82\x01R`\0a\x0C\xAD`@\x83\x01\x84a\x0CfV[\x94\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x0C\xC7W`\0\x80\xFD[\x815a\x07\x80\x81a\t\xD0V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x82\x81R`@\x81\x01a\x07\x80` \x83\x01\x84a\n\x15V[`\0` \x82\x84\x03\x12\x15a\r\x0EW`\0\x80\xFD[\x81Qa\x07\x80\x81a\t\xD0V[` \x81R`\0a\x07\x80` \x83\x01\x84a\x0CfV[`\0` \x82\x84\x03\x12\x15a\r>W`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\rTW`\0\x80\xFD[\x82\x01`\x1F\x81\x01\x84\x13a\reW`\0\x80\xFD[\x80Qa\rsa\x0B\xE1\x82a\n\xB3V[\x81\x81R\x85` \x83\x85\x01\x01\x11\x15a\r\x88W`\0\x80\xFD[a\r\x99\x82` \x83\x01` \x86\x01a\x0CBV[\x95\x94PPPPPV[`\0\x83Qa\r\xB4\x81\x84` \x88\x01a\x0CBV[\x83Q\x90\x83\x01\x90a\r\xC8\x81\x83` \x88\x01a\x0CBV[\x01\x94\x93PPPPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x0E\x03Wa\x0E\x03a\r\xD1V[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x0EN\x81`)\x85\x01` \x89\x01a\x0CBV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x0Eu\x81`-\x84\x01` \x88\x01a\x0CBV[\x01`-\x01\x99\x98PPPPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x0E\xB8\x81`\x17\x85\x01` \x88\x01a\x0CBV[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x0E\xE9\x81`(\x84\x01` \x88\x01a\x0CBV[\x01`(\x01\x94\x93PPPPV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x02\x83Wa\x02\x83a\r\xD1V[\x80\x82\x01\x80\x82\x11\x15a\x02\x83Wa\x02\x83a\r\xD1V[`\0\x81a\x0F.Wa\x0F.a\r\xD1V[P`\0\x19\x01\x90V\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 \xBD\xC8a+\xB2]}\x87\x97\x18\xD9\x19\xF8\xD4\x8AS\x9A\x8FZ\xEAh\x80G\xD2!\x85a\"\xDCxapdsolcC\0\x08\x1C\x003\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB"; /// The bytecode of the contract. pub static ARBITRUMKEYDERIVER_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __BYTECODE, ); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xBAW`\x005`\xE0\x1C\x80c\x01\xFF\xC9\xA7\x14a\0\xBFW\x80c$\x8A\x9C\xA3\x14a\0\xE7W\x80c//\xF1]\x14a\x01\x08W\x80c6V\x8A\xBE\x14a\x01\x1DW\x80cP\xD1{^\x14a\x010W\x80cu\xB28\xFC\x14a\x01[W\x80c\x91\xD1HT\x14a\x01\x82W\x80c\x9D\xCA\x002\x14a\x01\x95W\x80c\xA2\x17\xFD\xDF\x14a\x01\xB6W\x80c\xA3,+\x99\x14a\x01\xBEW\x80c\xB2N\xD3\x08\x14a\x01\xDFW\x80c\xD5Gt\x1F\x14a\x02\x06W\x80c\xF9]q\xB1\x14a\x02\x19W\x80c\xFE\x89\xC9p\x14a\x02,W[`\0\x80\xFD[a\0\xD2a\0\xCD6`\x04a\t\x8DV[a\x02RV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xFAa\0\xF56`\x04a\t\xB7V[a\x02\x89V[`@Q\x90\x81R` \x01a\0\xDEV[a\x01\x1Ba\x01\x166`\x04a\t\xE5V[a\x02\x9EV[\0[a\x01\x1Ba\x01+6`\x04a\t\xE5V[a\x02\xBFV[`\x01Ta\x01C\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xDEV[a\0\xFA\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\x81V[a\0\xD2a\x01\x906`\x04a\t\xE5V[a\x03BV[`\x01Ta\x01\xA9\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\xDE\x91\x90a\n7V[a\0\xFA`\0\x81V[a\x01\xD1a\x01\xCC6`\x04a\n\xDAV[a\x03kV[`@Qa\0\xDE\x92\x91\x90a\x0C\x92V[a\0\xFA\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9\x81V[a\x01\x1Ba\x02\x146`\x04a\t\xE5V[a\x04\xF6V[a\x01\x1Ba\x02'6`\x04a\x0C\xB5V[a\x05\x12V[a\0\xFA~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x02\x83WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x02\xA7\x82a\x02\x89V[a\x02\xB0\x81a\x05_V[a\x02\xBA\x83\x83a\x05lV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x034W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x03>\x82\x82a\x05\xF0V[PPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[`\0```\0a\x03|\x86\x86\x86a\x06UV[\x90P`\0\x81`\0\x81Q\x81\x10a\x03\x93Wa\x03\x93a\x0C\xD2V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16`\0\x03a\x03\xD0WP\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9a\x03\xF2V[P~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd[`\x01T`@QcGF\xFE\x8B`\xE1\x1B\x81R`\0\x91`\x01`\x01`\xA0\x1B\x03\x81\x16\x91c\x8E\x8D\xFD\x16\x91a\x04/\x91\x86\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x0C\xE8V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04LW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04p\x91\x90a\x0C\xFCV[\x90P`\0\x81`\x01`\x01`\xA0\x1B\x03\x16c\xECr3g\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04\xA0\x91\x90a\r\x19V[`\0`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xBDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra\x04\xE5\x91\x90\x81\x01\x90a\r,V[`\x01\x9A\x90\x99P\x97PPPPPPPPV[a\x04\xFF\x82a\x02\x89V[a\x05\x08\x81a\x05_V[a\x02\xBA\x83\x83a\x05\xF0V[\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECBa\x05<\x81a\x05_V[P`\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[a\x05i\x813a\x07\x87V[PV[a\x05v\x82\x82a\x03BV[a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x05\xAC3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x05\xFA\x82\x82a\x03BV[\x15a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x06\xEFW\x84\x86\x82\x81Q\x81\x10a\x06\x86Wa\x06\x86a\x0C\xD2V[` \x02` \x01\x01Q` \x01Q\x03a\x06\xE7W\x82\x86\x82\x81Q\x81\x10a\x06\xAAWa\x06\xAAa\x0C\xD2V[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x06\xC7\x92\x91\x90a\r\xA2V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x06\xE3\x90a\r\xE7V[\x92PP[`\x01\x01a\x06jV[P\x83`\x02\x03a\x07\x01W`\x01\x93Pa\x07\x0EV[\x83`\x03\x03a\x07\x0EW`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x0F7`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x07e\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x0E\x0CV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x98PPPPPPPPP[\x93\x92PPPV[a\x07\x91\x82\x82a\x03BV[a\x03>Wa\x07\x9E\x81a\x07\xE0V[a\x07\xA9\x83` a\x07\xF2V[`@Q` \x01a\x07\xBA\x92\x91\x90a\x0E\x86V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x03+\x91`\x04\x01a\r\x19V[``a\x02\x83`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\x08\x01\x83`\x02a\x0E\xF5V[a\x08\x0C\x90`\x02a\x0F\x0CV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x08#Wa\x08#a\nEV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x08MW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\x08hWa\x08ha\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\x08\x97Wa\x08\x97a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x08\xBB\x84`\x02a\x0E\xF5V[a\x08\xC6\x90`\x01a\x0F\x0CV[\x90P[`\x01\x81\x11\x15a\t>Wo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x08\xFAWa\x08\xFAa\x0C\xD2V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\t\x10Wa\t\x10a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\t7\x81a\x0F\x1FV[\x90Pa\x08\xC9V[P\x83\x15a\x07\x80W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x03+V[`\0` \x82\x84\x03\x12\x15a\t\x9FW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x07\x80W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\t\xC9W`\0\x80\xFD[P5\x91\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x05iW`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\t\xF8W`\0\x80\xFD[\x825\x91P` \x83\x015a\n\n\x81a\t\xD0V[\x80\x91PP\x92P\x92\x90PV[`\x03\x81\x10a\n3WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x02\x83\x82\x84a\n\x15V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n}Wa\n}a\nEV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n\xABWa\n\xABa\nEV[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\n\xCCWa\n\xCCa\nEV[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x80`\0``\x84\x86\x03\x12\x15a\n\xEFW`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x0CW`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x0B\x1DW`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B6Wa\x0B6a\nEV[\x80`\x05\x1Ba\x0BF` \x82\x01a\n\x83V[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x0BbW`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x0C-W\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x87W`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x0B\x9DW`\0\x80\xFD[a\x0B\xA5a\n[V[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xBEW`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x0B\xD3W`\0\x80\xFD[\x805a\x0B\xE6a\x0B\xE1\x82a\n\xB3V[a\n\x83V[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x0B\xFBW`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x0BiV[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x0C]W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0CEV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x0C~\x81` \x86\x01` \x86\x01a\x0CBV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x15\x15\x81R`@` \x82\x01R`\0a\x0C\xAD`@\x83\x01\x84a\x0CfV[\x94\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x0C\xC7W`\0\x80\xFD[\x815a\x07\x80\x81a\t\xD0V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x82\x81R`@\x81\x01a\x07\x80` \x83\x01\x84a\n\x15V[`\0` \x82\x84\x03\x12\x15a\r\x0EW`\0\x80\xFD[\x81Qa\x07\x80\x81a\t\xD0V[` \x81R`\0a\x07\x80` \x83\x01\x84a\x0CfV[`\0` \x82\x84\x03\x12\x15a\r>W`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\rTW`\0\x80\xFD[\x82\x01`\x1F\x81\x01\x84\x13a\reW`\0\x80\xFD[\x80Qa\rsa\x0B\xE1\x82a\n\xB3V[\x81\x81R\x85` \x83\x85\x01\x01\x11\x15a\r\x88W`\0\x80\xFD[a\r\x99\x82` \x83\x01` \x86\x01a\x0CBV[\x95\x94PPPPPV[`\0\x83Qa\r\xB4\x81\x84` \x88\x01a\x0CBV[\x83Q\x90\x83\x01\x90a\r\xC8\x81\x83` \x88\x01a\x0CBV[\x01\x94\x93PPPPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x0E\x03Wa\x0E\x03a\r\xD1V[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x0EN\x81`)\x85\x01` \x89\x01a\x0CBV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x0Eu\x81`-\x84\x01` \x88\x01a\x0CBV[\x01`-\x01\x99\x98PPPPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x0E\xB8\x81`\x17\x85\x01` \x88\x01a\x0CBV[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x0E\xE9\x81`(\x84\x01` \x88\x01a\x0CBV[\x01`(\x01\x94\x93PPPPV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x02\x83Wa\x02\x83a\r\xD1V[\x80\x82\x01\x80\x82\x11\x15a\x02\x83Wa\x02\x83a\r\xD1V[`\0\x81a\x0F.Wa\x0F.a\r\xD1V[P`\0\x19\x01\x90V\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 7$;\xC4>x\xAC4\xBBE\xBF\xE2CE\x0C(\x1Fa\xD2&\xE1,\xDA\xB0K(\x99\x83*D\xFFwdsolcC\0\x08\x1C\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xBAW`\x005`\xE0\x1C\x80c\x01\xFF\xC9\xA7\x14a\0\xBFW\x80c$\x8A\x9C\xA3\x14a\0\xE7W\x80c//\xF1]\x14a\x01\x08W\x80c6V\x8A\xBE\x14a\x01\x1DW\x80cP\xD1{^\x14a\x010W\x80cu\xB28\xFC\x14a\x01[W\x80c\x91\xD1HT\x14a\x01\x82W\x80c\x9D\xCA\x002\x14a\x01\x95W\x80c\xA2\x17\xFD\xDF\x14a\x01\xB6W\x80c\xA3,+\x99\x14a\x01\xBEW\x80c\xB2N\xD3\x08\x14a\x01\xDFW\x80c\xD5Gt\x1F\x14a\x02\x06W\x80c\xF9]q\xB1\x14a\x02\x19W\x80c\xFE\x89\xC9p\x14a\x02,W[`\0\x80\xFD[a\0\xD2a\0\xCD6`\x04a\t\x8DV[a\x02RV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xFAa\0\xF56`\x04a\t\xB7V[a\x02\x89V[`@Q\x90\x81R` \x01a\0\xDEV[a\x01\x1Ba\x01\x166`\x04a\t\xE5V[a\x02\x9EV[\0[a\x01\x1Ba\x01+6`\x04a\t\xE5V[a\x02\xBFV[`\x01Ta\x01C\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xDEV[a\0\xFA\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\x81V[a\0\xD2a\x01\x906`\x04a\t\xE5V[a\x03BV[`\x01Ta\x01\xA9\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\xDE\x91\x90a\n7V[a\0\xFA`\0\x81V[a\x01\xD1a\x01\xCC6`\x04a\n\xDAV[a\x03kV[`@Qa\0\xDE\x92\x91\x90a\x0C\x92V[a\0\xFA\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9\x81V[a\x01\x1Ba\x02\x146`\x04a\t\xE5V[a\x04\xF6V[a\x01\x1Ba\x02'6`\x04a\x0C\xB5V[a\x05\x12V[a\0\xFA~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x02\x83WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x02\xA7\x82a\x02\x89V[a\x02\xB0\x81a\x05_V[a\x02\xBA\x83\x83a\x05lV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x034W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x03>\x82\x82a\x05\xF0V[PPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[`\0```\0a\x03|\x86\x86\x86a\x06UV[\x90P`\0\x81`\0\x81Q\x81\x10a\x03\x93Wa\x03\x93a\x0C\xD2V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16`\0\x03a\x03\xD0WP\x7F\x9A\x91\x86.\xF1T4\xE2e\x8Eh'R\xE7C\xFAIu\xA1\x17\x80}\xF7\xF0\xEA\xCA\xB6n7\xE8\x04\xD9a\x03\xF2V[P~\xC3H\xEF\x80\xE6m\"\xF4D\n\x90\xBF\x96C\xA0<\x82&\r\r\xCC\xA4(l\xF1\x14\xCC\x97\xDB\x0Cd[`\x01T`@QcGF\xFE\x8B`\xE1\x1B\x81R`\0\x91`\x01`\x01`\xA0\x1B\x03\x81\x16\x91c\x8E\x8D\xFD\x16\x91a\x04/\x91\x86\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x0C\xE8V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04LW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04p\x91\x90a\x0C\xFCV[\x90P`\0\x81`\x01`\x01`\xA0\x1B\x03\x16c\xECr3g\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04\xA0\x91\x90a\r\x19V[`\0`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xBDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra\x04\xE5\x91\x90\x81\x01\x90a\r,V[`\x01\x9A\x90\x99P\x97PPPPPPPPV[a\x04\xFF\x82a\x02\x89V[a\x05\x08\x81a\x05_V[a\x02\xBA\x83\x83a\x05\xF0V[\x7F\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECBa\x05<\x81a\x05_V[P`\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[a\x05i\x813a\x07\x87V[PV[a\x05v\x82\x82a\x03BV[a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x05\xAC3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x05\xFA\x82\x82a\x03BV[\x15a\x03>W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x06\xEFW\x84\x86\x82\x81Q\x81\x10a\x06\x86Wa\x06\x86a\x0C\xD2V[` \x02` \x01\x01Q` \x01Q\x03a\x06\xE7W\x82\x86\x82\x81Q\x81\x10a\x06\xAAWa\x06\xAAa\x0C\xD2V[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x06\xC7\x92\x91\x90a\r\xA2V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x06\xE3\x90a\r\xE7V[\x92PP[`\x01\x01a\x06jV[P\x83`\x02\x03a\x07\x01W`\x01\x93Pa\x07\x0EV[\x83`\x03\x03a\x07\x0EW`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x0F7`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x07e\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x0E\x0CV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x98PPPPPPPPP[\x93\x92PPPV[a\x07\x91\x82\x82a\x03BV[a\x03>Wa\x07\x9E\x81a\x07\xE0V[a\x07\xA9\x83` a\x07\xF2V[`@Q` \x01a\x07\xBA\x92\x91\x90a\x0E\x86V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x03+\x91`\x04\x01a\r\x19V[``a\x02\x83`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\x08\x01\x83`\x02a\x0E\xF5V[a\x08\x0C\x90`\x02a\x0F\x0CV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x08#Wa\x08#a\nEV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x08MW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\x08hWa\x08ha\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\x08\x97Wa\x08\x97a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x08\xBB\x84`\x02a\x0E\xF5V[a\x08\xC6\x90`\x01a\x0F\x0CV[\x90P[`\x01\x81\x11\x15a\t>Wo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x08\xFAWa\x08\xFAa\x0C\xD2V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\t\x10Wa\t\x10a\x0C\xD2V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\t7\x81a\x0F\x1FV[\x90Pa\x08\xC9V[P\x83\x15a\x07\x80W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x03+V[`\0` \x82\x84\x03\x12\x15a\t\x9FW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x07\x80W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\t\xC9W`\0\x80\xFD[P5\x91\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x05iW`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\t\xF8W`\0\x80\xFD[\x825\x91P` \x83\x015a\n\n\x81a\t\xD0V[\x80\x91PP\x92P\x92\x90PV[`\x03\x81\x10a\n3WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x02\x83\x82\x84a\n\x15V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n}Wa\n}a\nEV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\n\xABWa\n\xABa\nEV[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\n\xCCWa\n\xCCa\nEV[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x80`\0``\x84\x86\x03\x12\x15a\n\xEFW`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x0CW`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x0B\x1DW`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B6Wa\x0B6a\nEV[\x80`\x05\x1Ba\x0BF` \x82\x01a\n\x83V[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x0BbW`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x0C-W\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\x87W`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x0B\x9DW`\0\x80\xFD[a\x0B\xA5a\n[V[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xBEW`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x0B\xD3W`\0\x80\xFD[\x805a\x0B\xE6a\x0B\xE1\x82a\n\xB3V[a\n\x83V[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x0B\xFBW`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x0BiV[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x0C]W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0CEV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x0C~\x81` \x86\x01` \x86\x01a\x0CBV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x15\x15\x81R`@` \x82\x01R`\0a\x0C\xAD`@\x83\x01\x84a\x0CfV[\x94\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x0C\xC7W`\0\x80\xFD[\x815a\x07\x80\x81a\t\xD0V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x82\x81R`@\x81\x01a\x07\x80` \x83\x01\x84a\n\x15V[`\0` \x82\x84\x03\x12\x15a\r\x0EW`\0\x80\xFD[\x81Qa\x07\x80\x81a\t\xD0V[` \x81R`\0a\x07\x80` \x83\x01\x84a\x0CfV[`\0` \x82\x84\x03\x12\x15a\r>W`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\rTW`\0\x80\xFD[\x82\x01`\x1F\x81\x01\x84\x13a\reW`\0\x80\xFD[\x80Qa\rsa\x0B\xE1\x82a\n\xB3V[\x81\x81R\x85` \x83\x85\x01\x01\x11\x15a\r\x88W`\0\x80\xFD[a\r\x99\x82` \x83\x01` \x86\x01a\x0CBV[\x95\x94PPPPPV[`\0\x83Qa\r\xB4\x81\x84` \x88\x01a\x0CBV[\x83Q\x90\x83\x01\x90a\r\xC8\x81\x83` \x88\x01a\x0CBV[\x01\x94\x93PPPPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x0E\x03Wa\x0E\x03a\r\xD1V[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x0EN\x81`)\x85\x01` \x89\x01a\x0CBV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x0Eu\x81`-\x84\x01` \x88\x01a\x0CBV[\x01`-\x01\x99\x98PPPPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x0E\xB8\x81`\x17\x85\x01` \x88\x01a\x0CBV[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x0E\xE9\x81`(\x84\x01` \x88\x01a\x0CBV[\x01`(\x01\x94\x93PPPPV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x02\x83Wa\x02\x83a\r\xD1V[\x80\x82\x01\x80\x82\x11\x15a\x02\x83Wa\x02\x83a\r\xD1V[`\0\x81a\x0F.Wa\x0F.a\r\xD1V[P`\0\x19\x01\x90V\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 \xBD\xC8a+\xB2]}\x87\x97\x18\xD9\x19\xF8\xD4\x8AS\x9A\x8FZ\xEAh\x80G\xD2!\x85a\"\xDCxapdsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static ARBITRUMKEYDERIVER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __DEPLOYED_BYTECODE, diff --git a/rust/lit-core/lit-blockchain/src/contracts/backup_recovery.rs b/rust/lit-core/lit-blockchain/src/contracts/backup_recovery.rs index 72fe4fb4..c46a6210 100644 --- a/rust/lit-core/lit-blockchain/src/contracts/backup_recovery.rs +++ b/rust/lit-core/lit-blockchain/src/contracts/backup_recovery.rs @@ -970,6 +970,13 @@ pub mod backup_recovery { ::std::borrow::ToOwned::to_owned("bytes"), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("keySetId"), + kind: ::ethers::core::abi::ethabi::ParamType::String, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("string"), + ), + }, ], outputs: ::std::vec![], constant: ::core::option::Option::None, @@ -2179,14 +2186,18 @@ pub mod backup_recovery { .method_hash([93, 28, 27, 61], party_members) .expect("method not found (this should never happen)") } - ///Calls the contract's `registerRecoveryKeys` (0x960cb990) function + ///Calls the contract's `registerRecoveryKeys` (0xa6fdb149) function pub fn register_recovery_keys( &self, recovery_keys: ::std::vec::Vec, session_id: ::ethers::core::types::Bytes, + key_set_id: ::std::string::String, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([150, 12, 185, 144], (recovery_keys, session_id)) + .method_hash( + [166, 253, 177, 73], + (recovery_keys, session_id, key_set_id), + ) .expect("method not found (this should never happen)") } ///Calls the contract's `setBackupPartyState` (0xb347cccc) function @@ -4124,7 +4135,7 @@ pub mod backup_recovery { pub struct RegisterNewBackupPartyCall { pub party_members: ::std::vec::Vec<::ethers::core::types::Address>, } - ///Container type for all input parameters for the `registerRecoveryKeys` function with signature `registerRecoveryKeys((bytes,uint256)[],bytes)` and selector `0x960cb990` + ///Container type for all input parameters for the `registerRecoveryKeys` function with signature `registerRecoveryKeys((bytes,uint256)[],bytes,string)` and selector `0xa6fdb149` #[derive( Clone, ::ethers::contract::EthCall, @@ -4139,11 +4150,12 @@ pub mod backup_recovery { )] #[ethcall( name = "registerRecoveryKeys", - abi = "registerRecoveryKeys((bytes,uint256)[],bytes)" + abi = "registerRecoveryKeys((bytes,uint256)[],bytes,string)" )] pub struct RegisterRecoveryKeysCall { pub recovery_keys: ::std::vec::Vec, pub session_id: ::ethers::core::types::Bytes, + pub key_set_id: ::std::string::String, } ///Container type for all input parameters for the `setBackupPartyState` function with signature `setBackupPartyState(bytes[],address[])` and selector `0xb347cccc` #[derive( diff --git a/rust/lit-core/lit-blockchain/src/contracts/contract_resolver.rs b/rust/lit-core/lit-blockchain/src/contracts/contract_resolver.rs index a4347cce..5668ab85 100644 --- a/rust/lit-core/lit-blockchain/src/contracts/contract_resolver.rs +++ b/rust/lit-core/lit-blockchain/src/contracts/contract_resolver.rs @@ -472,6 +472,30 @@ pub mod contract_resolver { }, ], ), + ( + ::std::borrow::ToOwned::to_owned("PUB_KEY_ROUTER_VIEWS_CONTRACT"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned( + "PUB_KEY_ROUTER_VIEWS_CONTRACT", + ), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( + 32usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes32"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], + ), ( ::std::borrow::ToOwned::to_owned("RATE_LIMIT_NFT_CONTRACT"), ::std::vec![ @@ -1123,13 +1147,13 @@ pub mod contract_resolver { ::ethers::core::abi::Abi, > = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\x14g8\x03\x80a\x14g\x839\x81\x01`@\x81\x90Ra\0/\x91a\x01\xE0V[a\0G`\0\x80Q` a\x14G\x839\x81Q\x91R3a\0\xE9V[a\0_`\0\x80Q` a\x14G\x839\x81Q\x91R\x80a\0\xF7V[`\x01\x80`\0\x83`\x02\x81\x11\x15a\0vWa\0va\x02\x08V[`\x02\x81\x11\x15a\0\x87Wa\0\x87a\x02\x08V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\x83\x9A\xD2t=@b\xDFW\x9E\xDF8\x18\xF6B\xB7\x1E\xE0h\x8A5\xD6\xBCD8\xEFS\x14\xCE\xCE\x80\x15\x81`@Qa\0\xDB\x91\x90a\x02\x1EV[`@Q\x80\x91\x03\x90\xA1Pa\x02FV[a\0\xF3\x82\x82a\x01BV[PPV[`\0\x82\x81R` \x81\x90R`@\x80\x82 `\x01\x01\x80T\x90\x84\x90U\x90Q\x90\x91\x83\x91\x83\x91\x86\x91\x7F\xBDy\xB8o\xFE\n\xB8\xE8waQQB\x17\xCD|\xAC\xD5,\x90\x9FfG\\:\xF4N\x12\x9F\x0B\0\xFF\x91\x90\xA4PPPV[`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 T`\xFF\x16a\0\xF3W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x01\x9C3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[`\0` \x82\x84\x03\x12\x15a\x01\xF2W`\0\x80\xFD[\x81Q`\x03\x81\x10a\x02\x01W`\0\x80\xFD[\x93\x92PPPV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[` \x81\x01`\x03\x83\x10a\x02@WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x91\x90R\x90V[a\x11\xF2\x80a\x02U`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x01\xBCW`\x005`\xE0\x1C\x80c|\xAD\xF6\x9F\x11a\0\xF5W\x80c|\xAD\xF6\x9F\x14a\x04\x17W\x80c}J\x03\xBD\x14a\x04>W\x80c}\x9D(\x80\x14a\x04eW\x80c\x7F\x90 \x9F\x14a\x04\x8CW\x80c\x85\xCB\x11\x91\x14a\x04\xB3W\x80c\x8C\x156\xDF\x14a\x04\xDAW\x80c\x8D\xEB8\x93\x14a\x05\x01W\x80c\x8E\x8D\xFD\x16\x14a\x05\x14W\x80c\x90r\xF88\x14a\x05'W\x80c\x91\xD1HT\x14a\x05NW\x80c\x97z\x80p\x14a\x05aW\x80c\xA2\x17\xFD\xDF\x14a\x05\x88W\x80c\xAD\x1C\x8A\x86\x14a\x05\x90W\x80c\xCD\xDC\xAC\xE5\x14a\x05\xB7W\x80c\xD5Gt\x1F\x14a\x05\xDEW\x80c\xDA\x19\xDD\xFB\x14a\x05\xF1W\x80c\xDF8\x06\x93\x14a\x06\x18W\x80c\xF8\xAE\x93\xB4\x14a\x06?W`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01\xC1W\x80c\x11\xEE\x8F\xF7\x14a\x01\xE9W\x80c\x16\xF7k\xBF\x14a\x02\x1EW\x80c\x17\x85\xF5<\x14a\x02EW\x80c!\x9C&j\x14a\x02ZW\x80c$\x8A\x9C\xA3\x14a\x02\x81W\x80c&h\xF3\x05\x14a\x02\x94W\x80c,\x0B\x8B\xF7\x14a\x02\xBBW\x80c.H\x85\xE8\x14a\x02\xE2W\x80c//\xF1]\x14a\x03\tW\x80c6V\x8A\xBE\x14a\x03\x1CW\x80c>\xBFy\x85\x14a\x03/W\x80cB\x16\xE7:\x14a\x03{W\x80cQ\xAD\n\x80\x14a\x03\xA2W\x80cZ\xF2\x7Fy\x14a\x03\xB5W\x80cpH\x02u\x14a\x03\xDCW\x80ct\xBC\x819\x14a\x03\xEFW\x80cu\xB28\xFC\x14a\x04\x02W[`\0\x80\xFD[a\x01\xD4a\x01\xCF6`\x04a\x0E\xB1V[a\x06fV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x02\x10\x7FX\xA0\x04N\x0E\xCD\x81\x02^9\x8B\xF1\x81Pu\xD1#L\xBA\xC3t\x96\x14\xB0\xB3:@L.\xE2\xBA\xBF\x81V[`@Q\x90\x81R` \x01a\x01\xE0V[a\x02\x10\x7F\xF1OC\x1D\xAD\xC8.}\xBC^7\x9Fq#NW5\xC9\x18~C'\xA7\xC6\xAC\x01MU\xD1\xB7rz\x81V[a\x02Xa\x02S6`\x04a\x0E\xF7V[a\x06\x9DV[\0[a\x02\x10\x7FO\xD3\xE0Hz\x03\x82\xFB\x02|w\xB1\xAELV6r\xC9\xFB0\xA7Hy\x85_\x0C\x86\xC3v\xCF\x96\xEA\x81V[a\x02\x10a\x02\x8F6`\x04a\x0F\x12V[a\x07NV[a\x02\x10\x7F\xB1\xF7\x98\x13\xBCv0\xA5*\xE9H\xBC\x99x\x13\x97\xE4\t\xD0\xDD5!\x95;\xF7\xD8\xD7\xA2\xDBaG\xF7\x81V[a\x02\x10\x7F\xB7\xB4\xFD\xE9\x94M<\x13\xE9\xA7\x885C\x1C3\xA5\x08M\x90\xA7\xF0\xC7=\xEFv\xD7\x88c\x15\xFE\x87\xB0\x81V[a\x02\x10\x7F\xB91\xB2q\x9A\xEB*e\xA5\x03_\xA0\xA1\x90\xBF\xDCL\x86\"\xCE\x8C\xBF\xF7\xA3\xD1\xABBS\x1F\xB1\xA9\x18\x81V[a\x02Xa\x03\x176`\x04a\x0F+V[a\x07cV[a\x02Xa\x03*6`\x04a\x0F+V[a\x07\x84V[a\x03ca\x03=6`\x04a\x0FfV[`\x02` \x90\x81R`\0\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 T`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xE0V[a\x02\x10\x7FLA\xAEEK\xEBk\xBB\xE9\xBEP\xAC\xCC\x95z;\x156\xE4\x8B\x83Z\x86\x91\x9A\xF9\x81\xB5$M\xB7U\x81V[a\x02Xa\x03\xB06`\x04a\x0F\x89V[a\x07\xFEV[a\x02\x10\x7F\xA2\xC772\xDEez\xD0\xF3n\r\xDB\xB2q\x0FK\x13\xE8\xDD\xE4d!8k\xB9-\x1E\x17\x9D\xAEMM\x81V[a\x02Xa\x03\xEA6`\x04a\x0E\xF7V[a\t\x82V[a\x02Xa\x03\xFD6`\x04a\x0F\xC5V[a\t\xB2V[a\x02\x10`\0\x80Q` a\x11\x9D\x839\x81Q\x91R\x81V[a\x02\x10\x7Ft\x84]\xE3|\xFA\xBD5v3!KG\xFA\x91\xCC\xD1\x9B\x05\xB7\xC5\xA0\x8A\xC2,\x18\x7F\x81\x1F\xB6+\xCA\x81V[a\x02\x10\x7F\x9F5\xEF>\x0C&R\xA8\xBB\x87G\xD9/@\x7F\xCD9\xA7v\x8D\xAC\xC7\xF1e\x81\xC7\xA7\x1F\x10>Ub\x81V[a\x02\x10\x7F\xC2o\xAE\xDA\xEE\xDA/\xB9Jf\xD7\x86\xAA\x89\xC4\xA1\x8B\xB7\x90\xFA\0\x9D\x9D\xA9JT\x1D\x92\x18\\\xA9\x16\x81V[a\x02\x10\x7F\xC6gO\x98\xBA5\xC0\x1C\x13\x0E\x08\x19]\xD2lpF`7G:\x06\x8CZ\xAAG\nx=\x99\xC1l\x81V[a\x02\x10\x7F\xAEy\xA95sp\x12\xD0f\xE7\x1802i.R\x1F\xFE\x1A\xDE+\xED\xA2g\xE2>\x02\xB1\xD6\xE9\x11\x87\x81V[a\x02\x10\x7F\xAA\x06\xD1\x08\xDB\xD7\xBF\x97k\x16\xB7\xBFZ\xDB)\xD2\xD0\xEF,8\\\xA8\xB9\xD83\xCC\x80/3\x94-r\x81V[a\x02Xa\x05\x0F6`\x04a\x0F\xC5V[a\nnV[a\x03ca\x05\"6`\x04a\x0FfV[a\x0B\x12V[a\x02\x10\x7FT\x95<#\x06\x8B\x8F\xC4\xC0sc\x01\xB5\x0F\x10\x02}kF\x93'\xDE\x1F\xD4(A\xA5\x07+\x1B\xCE\xBE\x81V[a\x01\xD4a\x05\\6`\x04a\x0F+V[a\x0BhV[a\x02\x10\x7F'\xD7d\xEA*J8eCK\xBFJ9\x11\x10\x14\x96D\xBE1D\x8F4y\xFD\x15\xB4C\x88uWe\x81V[a\x02\x10`\0\x81V[a\x02\x10\x7F:h\xDB\xFD\x8B\xBBd\x01\\B\xBC\x13\x1C8\x8D\xEAye\xE2\x8C\x10\x04\xD0\x9B9\xF5\x95\0\xC3\xA7c\xEC\x81V[a\x02\x10\x7F\x0F'\xB9\xE4k\x89\xC5\xC7B\xE2\x80\x94\xDC\xEF\xE5\xE9F\xC3\xB9\x8F\x0F\xBE\xD8}\x9F\xCF[\x10\xBA\x96\x84\xEC\x81V[a\x02Xa\x05\xEC6`\x04a\x0F+V[a\x0B\x91V[a\x02\x10\x7F\x08\t\t\xC1\x8C\x95\x8C\xE5\xA2\xD3d\x81ix$\xE4w1\x93#\xD01T\xCE\xBA;x\xF2\x8Aa\x88{\x81V[a\x02\x10\x7F\xB4\xBF\x99\x9Bh\xD8\x08]\xBB\xF7\xA0\xEC/Z-f\x08s\x93[\xDF\x1E\xD0\x8E\xB4!\xACm\xCB\xC0\x03b\x81V[a\x02\x10\x7F\xDD[\x9B\x8A^\x8E\x01\xF2\x96.\xD7\xE9\x83\xD5\x8F\xE3.\x1Ff\xAA\x88\xDDz\xB3\x07p\xFA\x9Bw\xDArC\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x06\x97WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x80Q` a\x11\x9D\x839\x81Q\x91Ra\x06\xB5\x81a\x0B\xADV[3`\x01`\x01`\xA0\x1B\x03\x83\x16\x03a\x072W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`7`$\x82\x01R\x7FCannot remove self as admin. Ha`D\x82\x01Rv;2\x90:42\x9072\xBB\x900\xB26\xB4\xB7\x1027\x904\xBA\x17`I\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x07J`\0\x80Q` a\x11\x9D\x839\x81Q\x91R\x83a\x0B\xBAV[PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x07l\x82a\x07NV[a\x07u\x81a\x0B\xADV[a\x07\x7F\x83\x83a\x0C\x1FV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x07\xF4W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x07)V[a\x07J\x82\x82a\x0B\xBAV[a\x08\x16`\0\x80Q` a\x11\x9D\x839\x81Q\x91R3a\x0BhV[a\x083W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x83`\x02\x81\x11\x15a\x08IWa\x08Ia\x0F\xE0V[`\x02\x81\x11\x15a\x08ZWa\x08Za\x0F\xE0V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\xFF\x16\x15\x15`\x01\x14a\x08\xD7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FThe provided Env is not valid fo`D\x82\x01Rn\x1C\x88\x1D\x1A\x1A\\\xC8\x18\xDB\xDB\x9D\x1C\x98X\xDD`\x8A\x1B`d\x82\x01R`\x84\x01a\x07)V[\x80`\x02`\0\x85\x81R` \x01\x90\x81R` \x01`\0 `\0\x84`\x02\x81\x11\x15a\x08\xFFWa\x08\xFFa\x0F\xE0V[`\x02\x81\x11\x15a\t\x10Wa\t\x10a\x0F\xE0V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\x01`\x01`\xA0\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`\xA0\x1B\x03\x16\x02\x17\x90UP\x7F3\xF0\x14\x89\x0F\x10\x92)\xBB\xCF\x8D\xD4r\x04\xC1S\xA2\xC0\xFF\x1CW*a\xDE\"\r\x103e0\xF5=\x83\x83\x83`@Qa\tu\x93\x92\x91\x90a\x10\x18V[`@Q\x80\x91\x03\x90\xA1PPPV[`\0\x80Q` a\x11\x9D\x839\x81Q\x91Ra\t\x9A\x81a\x0B\xADV[a\x07J`\0\x80Q` a\x11\x9D\x839\x81Q\x91R\x83a\x0C\x1FV[a\t\xCA`\0\x80Q` a\x11\x9D\x839\x81Q\x91R3a\x0BhV[a\t\xE7W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01\x80`\0\x83`\x02\x81\x11\x15a\t\xFEWa\t\xFEa\x0F\xE0V[`\x02\x81\x11\x15a\n\x0FWa\n\x0Fa\x0F\xE0V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\x83\x9A\xD2t=@b\xDFW\x9E\xDF8\x18\xF6B\xB7\x1E\xE0h\x8A5\xD6\xBCD8\xEFS\x14\xCE\xCE\x80\x15\x81`@Qa\nc\x91\x90a\x10EV[`@Q\x80\x91\x03\x90\xA1PV[a\n\x86`\0\x80Q` a\x11\x9D\x839\x81Q\x91R3a\x0BhV[a\n\xA3W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x82`\x02\x81\x11\x15a\n\xB9Wa\n\xB9a\x0F\xE0V[`\x02\x81\x11\x15a\n\xCAWa\n\xCAa\x0F\xE0V[\x81R` \x81\x01\x91\x90\x91R`@\x90\x81\x01`\0 \x80T`\xFF\x19\x16\x90UQ\x7F?\x17\x8F\x17\xDA\xE6\xCA\xF8\xCA\t\xC4\x85u\x02\xBA\xF7tN\x85\x97\xDEB\xD6Ydv\xFE\x9E\x06\xB8\xADG\x90a\nc\x90\x83\x90a\x10EV[`\0\x82\x81R`\x02` \x81\x90R`@\x82 \x90\x82\x90\x84\x90\x81\x11\x15a\x0B6Wa\x0B6a\x0F\xE0V[`\x02\x81\x11\x15a\x0BGWa\x0BGa\x0F\xE0V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\x01`\x01`\xA0\x1B\x03\x16\x93\x92PPPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a\x0B\x9A\x82a\x07NV[a\x0B\xA3\x81a\x0B\xADV[a\x07\x7F\x83\x83a\x0B\xBAV[a\x0B\xB7\x813a\x0C\xA3V[PV[a\x0B\xC4\x82\x82a\x0BhV[\x15a\x07JW`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[a\x0C)\x82\x82a\x0BhV[a\x07JW`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x0C_3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x0C\xAD\x82\x82a\x0BhV[a\x07JWa\x0C\xBA\x81a\x0C\xFCV[a\x0C\xC5\x83` a\r\x0EV[`@Q` \x01a\x0C\xD6\x92\x91\x90a\x10wV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x07)\x91`\x04\x01a\x10\xE6V[``a\x06\x97`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\r\x1D\x83`\x02a\x11/V[a\r(\x90`\x02a\x11FV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\r@Wa\r@a\x11YV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\rjW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\x85Wa\r\x85a\x11oV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r\xB4Wa\r\xB4a\x11oV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\r\xD8\x84`\x02a\x11/V[a\r\xE3\x90`\x01a\x11FV[\x90P[`\x01\x81\x11\x15a\x0E[Wo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x0E\x17Wa\x0E\x17a\x11oV[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\x0E-Wa\x0E-a\x11oV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\x0ET\x81a\x11\x85V[\x90Pa\r\xE6V[P\x83\x15a\x0E\xAAW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x07)V[\x93\x92PPPV[`\0` \x82\x84\x03\x12\x15a\x0E\xC3W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x0E\xAAW`\0\x80\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0E\xF2W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x0F\tW`\0\x80\xFD[a\x0E\xAA\x82a\x0E\xDBV[`\0` \x82\x84\x03\x12\x15a\x0F$W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x0F>W`\0\x80\xFD[\x825\x91Pa\x0FN` \x84\x01a\x0E\xDBV[\x90P\x92P\x92\x90PV[\x805`\x03\x81\x10a\x0E\xF2W`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x0FyW`\0\x80\xFD[\x825\x91Pa\x0FN` \x84\x01a\x0FWV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x0F\x9EW`\0\x80\xFD[\x835\x92Pa\x0F\xAE` \x85\x01a\x0FWV[\x91Pa\x0F\xBC`@\x85\x01a\x0E\xDBV[\x90P\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15a\x0F\xD7W`\0\x80\xFD[a\x0E\xAA\x82a\x0FWV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x03\x81\x10a\x10\x14WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[\x83\x81R``\x81\x01a\x10,` \x83\x01\x85a\x0F\xF6V[`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16`@\x91\x90\x91\x01R\x92\x91PPV[` \x81\x01a\x06\x97\x82\x84a\x0F\xF6V[`\0[\x83\x81\x10\x15a\x10nW\x81\x81\x01Q\x83\x82\x01R` \x01a\x10VV[PP`\0\x91\x01RV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x10\xA9\x81`\x17\x85\x01` \x88\x01a\x10SV[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x10\xDA\x81`(\x84\x01` \x88\x01a\x10SV[\x01`(\x01\x94\x93PPPPV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x11\x05\x81`@\x85\x01` \x87\x01a\x10SV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x06\x97Wa\x06\x97a\x11\x19V[\x80\x82\x01\x80\x82\x11\x15a\x06\x97Wa\x06\x97a\x11\x19V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81a\x11\x94Wa\x11\x94a\x11\x19V[P`\0\x19\x01\x90V\xFE\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\xA2dipfsX\"\x12 \xBC\xFBZ\xA3%\x1D\xDF3\xA8sl\x96\x89\xBD\x99\xCE\xA1\xDF[\xAA\x0F\xAC8|Ui\x13rX%\xC9rdsolcC\0\x08\x1C\x003\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB"; + const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\x14\x998\x03\x80a\x14\x99\x839\x81\x01`@\x81\x90Ra\0/\x91a\x01\xE0V[a\0G`\0\x80Q` a\x14y\x839\x81Q\x91R3a\0\xE9V[a\0_`\0\x80Q` a\x14y\x839\x81Q\x91R\x80a\0\xF7V[`\x01\x80`\0\x83`\x02\x81\x11\x15a\0vWa\0va\x02\x08V[`\x02\x81\x11\x15a\0\x87Wa\0\x87a\x02\x08V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\x83\x9A\xD2t=@b\xDFW\x9E\xDF8\x18\xF6B\xB7\x1E\xE0h\x8A5\xD6\xBCD8\xEFS\x14\xCE\xCE\x80\x15\x81`@Qa\0\xDB\x91\x90a\x02\x1EV[`@Q\x80\x91\x03\x90\xA1Pa\x02FV[a\0\xF3\x82\x82a\x01BV[PPV[`\0\x82\x81R` \x81\x90R`@\x80\x82 `\x01\x01\x80T\x90\x84\x90U\x90Q\x90\x91\x83\x91\x83\x91\x86\x91\x7F\xBDy\xB8o\xFE\n\xB8\xE8waQQB\x17\xCD|\xAC\xD5,\x90\x9FfG\\:\xF4N\x12\x9F\x0B\0\xFF\x91\x90\xA4PPPV[`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 T`\xFF\x16a\0\xF3W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x01\x9C3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[`\0` \x82\x84\x03\x12\x15a\x01\xF2W`\0\x80\xFD[\x81Q`\x03\x81\x10a\x02\x01W`\0\x80\xFD[\x93\x92PPPV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[` \x81\x01`\x03\x83\x10a\x02@WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x91\x90R\x90V[a\x12$\x80a\x02U`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x01\xC7W`\x005`\xE0\x1C\x80c|\xAD\xF6\x9F\x11a\x01\0W\x80c|\xAD\xF6\x9F\x14a\x04\"W\x80c}J\x03\xBD\x14a\x04IW\x80c}\x9D(\x80\x14a\x04pW\x80c\x7F\x90 \x9F\x14a\x04\x97W\x80c\x81\xD4\x95x\x14a\x04\xBEW\x80c\x85\xCB\x11\x91\x14a\x04\xE5W\x80c\x8C\x156\xDF\x14a\x05\x0CW\x80c\x8D\xEB8\x93\x14a\x053W\x80c\x8E\x8D\xFD\x16\x14a\x05FW\x80c\x90r\xF88\x14a\x05YW\x80c\x91\xD1HT\x14a\x05\x80W\x80c\x97z\x80p\x14a\x05\x93W\x80c\xA2\x17\xFD\xDF\x14a\x05\xBAW\x80c\xAD\x1C\x8A\x86\x14a\x05\xC2W\x80c\xCD\xDC\xAC\xE5\x14a\x05\xE9W\x80c\xD5Gt\x1F\x14a\x06\x10W\x80c\xDA\x19\xDD\xFB\x14a\x06#W\x80c\xDF8\x06\x93\x14a\x06JW\x80c\xF8\xAE\x93\xB4\x14a\x06qW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01\xCCW\x80c\x11\xEE\x8F\xF7\x14a\x01\xF4W\x80c\x16\xF7k\xBF\x14a\x02)W\x80c\x17\x85\xF5<\x14a\x02PW\x80c!\x9C&j\x14a\x02eW\x80c$\x8A\x9C\xA3\x14a\x02\x8CW\x80c&h\xF3\x05\x14a\x02\x9FW\x80c,\x0B\x8B\xF7\x14a\x02\xC6W\x80c.H\x85\xE8\x14a\x02\xEDW\x80c//\xF1]\x14a\x03\x14W\x80c6V\x8A\xBE\x14a\x03'W\x80c>\xBFy\x85\x14a\x03:W\x80cB\x16\xE7:\x14a\x03\x86W\x80cQ\xAD\n\x80\x14a\x03\xADW\x80cZ\xF2\x7Fy\x14a\x03\xC0W\x80cpH\x02u\x14a\x03\xE7W\x80ct\xBC\x819\x14a\x03\xFAW\x80cu\xB28\xFC\x14a\x04\rW[`\0\x80\xFD[a\x01\xDFa\x01\xDA6`\x04a\x0E\xE3V[a\x06\x98V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x02\x1B\x7FX\xA0\x04N\x0E\xCD\x81\x02^9\x8B\xF1\x81Pu\xD1#L\xBA\xC3t\x96\x14\xB0\xB3:@L.\xE2\xBA\xBF\x81V[`@Q\x90\x81R` \x01a\x01\xEBV[a\x02\x1B\x7F\xF1OC\x1D\xAD\xC8.}\xBC^7\x9Fq#NW5\xC9\x18~C'\xA7\xC6\xAC\x01MU\xD1\xB7rz\x81V[a\x02ca\x02^6`\x04a\x0F)V[a\x06\xCFV[\0[a\x02\x1B\x7FO\xD3\xE0Hz\x03\x82\xFB\x02|w\xB1\xAELV6r\xC9\xFB0\xA7Hy\x85_\x0C\x86\xC3v\xCF\x96\xEA\x81V[a\x02\x1Ba\x02\x9A6`\x04a\x0FDV[a\x07\x80V[a\x02\x1B\x7F\xB1\xF7\x98\x13\xBCv0\xA5*\xE9H\xBC\x99x\x13\x97\xE4\t\xD0\xDD5!\x95;\xF7\xD8\xD7\xA2\xDBaG\xF7\x81V[a\x02\x1B\x7F\xB7\xB4\xFD\xE9\x94M<\x13\xE9\xA7\x885C\x1C3\xA5\x08M\x90\xA7\xF0\xC7=\xEFv\xD7\x88c\x15\xFE\x87\xB0\x81V[a\x02\x1B\x7F\xB91\xB2q\x9A\xEB*e\xA5\x03_\xA0\xA1\x90\xBF\xDCL\x86\"\xCE\x8C\xBF\xF7\xA3\xD1\xABBS\x1F\xB1\xA9\x18\x81V[a\x02ca\x03\"6`\x04a\x0F]V[a\x07\x95V[a\x02ca\x0356`\x04a\x0F]V[a\x07\xB6V[a\x03na\x03H6`\x04a\x0F\x98V[`\x02` \x90\x81R`\0\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 T`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xEBV[a\x02\x1B\x7FLA\xAEEK\xEBk\xBB\xE9\xBEP\xAC\xCC\x95z;\x156\xE4\x8B\x83Z\x86\x91\x9A\xF9\x81\xB5$M\xB7U\x81V[a\x02ca\x03\xBB6`\x04a\x0F\xBBV[a\x080V[a\x02\x1B\x7F\xA2\xC772\xDEez\xD0\xF3n\r\xDB\xB2q\x0FK\x13\xE8\xDD\xE4d!8k\xB9-\x1E\x17\x9D\xAEMM\x81V[a\x02ca\x03\xF56`\x04a\x0F)V[a\t\xB4V[a\x02ca\x04\x086`\x04a\x0F\xF7V[a\t\xE4V[a\x02\x1B`\0\x80Q` a\x11\xCF\x839\x81Q\x91R\x81V[a\x02\x1B\x7Ft\x84]\xE3|\xFA\xBD5v3!KG\xFA\x91\xCC\xD1\x9B\x05\xB7\xC5\xA0\x8A\xC2,\x18\x7F\x81\x1F\xB6+\xCA\x81V[a\x02\x1B\x7F\x9F5\xEF>\x0C&R\xA8\xBB\x87G\xD9/@\x7F\xCD9\xA7v\x8D\xAC\xC7\xF1e\x81\xC7\xA7\x1F\x10>Ub\x81V[a\x02\x1B\x7F\xC2o\xAE\xDA\xEE\xDA/\xB9Jf\xD7\x86\xAA\x89\xC4\xA1\x8B\xB7\x90\xFA\0\x9D\x9D\xA9JT\x1D\x92\x18\\\xA9\x16\x81V[a\x02\x1B\x7F\xC6gO\x98\xBA5\xC0\x1C\x13\x0E\x08\x19]\xD2lpF`7G:\x06\x8CZ\xAAG\nx=\x99\xC1l\x81V[a\x02\x1B\x7FWIm\xE40\x02\x8F2,Y+\x0FsQ\x10\xEB4\xF1\xAE\x81\x84\xA9K\xC5\x1D@\xB0\x84{TF\x9B\x81V[a\x02\x1B\x7F\xAEy\xA95sp\x12\xD0f\xE7\x1802i.R\x1F\xFE\x1A\xDE+\xED\xA2g\xE2>\x02\xB1\xD6\xE9\x11\x87\x81V[a\x02\x1B\x7F\xAA\x06\xD1\x08\xDB\xD7\xBF\x97k\x16\xB7\xBFZ\xDB)\xD2\xD0\xEF,8\\\xA8\xB9\xD83\xCC\x80/3\x94-r\x81V[a\x02ca\x05A6`\x04a\x0F\xF7V[a\n\xA0V[a\x03na\x05T6`\x04a\x0F\x98V[a\x0BDV[a\x02\x1B\x7FT\x95<#\x06\x8B\x8F\xC4\xC0sc\x01\xB5\x0F\x10\x02}kF\x93'\xDE\x1F\xD4(A\xA5\x07+\x1B\xCE\xBE\x81V[a\x01\xDFa\x05\x8E6`\x04a\x0F]V[a\x0B\x9AV[a\x02\x1B\x7F'\xD7d\xEA*J8eCK\xBFJ9\x11\x10\x14\x96D\xBE1D\x8F4y\xFD\x15\xB4C\x88uWe\x81V[a\x02\x1B`\0\x81V[a\x02\x1B\x7F:h\xDB\xFD\x8B\xBBd\x01\\B\xBC\x13\x1C8\x8D\xEAye\xE2\x8C\x10\x04\xD0\x9B9\xF5\x95\0\xC3\xA7c\xEC\x81V[a\x02\x1B\x7F\x0F'\xB9\xE4k\x89\xC5\xC7B\xE2\x80\x94\xDC\xEF\xE5\xE9F\xC3\xB9\x8F\x0F\xBE\xD8}\x9F\xCF[\x10\xBA\x96\x84\xEC\x81V[a\x02ca\x06\x1E6`\x04a\x0F]V[a\x0B\xC3V[a\x02\x1B\x7F\x08\t\t\xC1\x8C\x95\x8C\xE5\xA2\xD3d\x81ix$\xE4w1\x93#\xD01T\xCE\xBA;x\xF2\x8Aa\x88{\x81V[a\x02\x1B\x7F\xB4\xBF\x99\x9Bh\xD8\x08]\xBB\xF7\xA0\xEC/Z-f\x08s\x93[\xDF\x1E\xD0\x8E\xB4!\xACm\xCB\xC0\x03b\x81V[a\x02\x1B\x7F\xDD[\x9B\x8A^\x8E\x01\xF2\x96.\xD7\xE9\x83\xD5\x8F\xE3.\x1Ff\xAA\x88\xDDz\xB3\x07p\xFA\x9Bw\xDArC\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x06\xC9WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x80Q` a\x11\xCF\x839\x81Q\x91Ra\x06\xE7\x81a\x0B\xDFV[3`\x01`\x01`\xA0\x1B\x03\x83\x16\x03a\x07dW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`7`$\x82\x01R\x7FCannot remove self as admin. Ha`D\x82\x01Rv;2\x90:42\x9072\xBB\x900\xB26\xB4\xB7\x1027\x904\xBA\x17`I\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x07|`\0\x80Q` a\x11\xCF\x839\x81Q\x91R\x83a\x0B\xECV[PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x07\x9E\x82a\x07\x80V[a\x07\xA7\x81a\x0B\xDFV[a\x07\xB1\x83\x83a\x0CQV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x08&W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x07[V[a\x07|\x82\x82a\x0B\xECV[a\x08H`\0\x80Q` a\x11\xCF\x839\x81Q\x91R3a\x0B\x9AV[a\x08eW`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x83`\x02\x81\x11\x15a\x08{Wa\x08{a\x10\x12V[`\x02\x81\x11\x15a\x08\x8CWa\x08\x8Ca\x10\x12V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\xFF\x16\x15\x15`\x01\x14a\t\tW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FThe provided Env is not valid fo`D\x82\x01Rn\x1C\x88\x1D\x1A\x1A\\\xC8\x18\xDB\xDB\x9D\x1C\x98X\xDD`\x8A\x1B`d\x82\x01R`\x84\x01a\x07[V[\x80`\x02`\0\x85\x81R` \x01\x90\x81R` \x01`\0 `\0\x84`\x02\x81\x11\x15a\t1Wa\t1a\x10\x12V[`\x02\x81\x11\x15a\tBWa\tBa\x10\x12V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\x01`\x01`\xA0\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`\xA0\x1B\x03\x16\x02\x17\x90UP\x7F3\xF0\x14\x89\x0F\x10\x92)\xBB\xCF\x8D\xD4r\x04\xC1S\xA2\xC0\xFF\x1CW*a\xDE\"\r\x103e0\xF5=\x83\x83\x83`@Qa\t\xA7\x93\x92\x91\x90a\x10JV[`@Q\x80\x91\x03\x90\xA1PPPV[`\0\x80Q` a\x11\xCF\x839\x81Q\x91Ra\t\xCC\x81a\x0B\xDFV[a\x07|`\0\x80Q` a\x11\xCF\x839\x81Q\x91R\x83a\x0CQV[a\t\xFC`\0\x80Q` a\x11\xCF\x839\x81Q\x91R3a\x0B\x9AV[a\n\x19W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01\x80`\0\x83`\x02\x81\x11\x15a\n0Wa\n0a\x10\x12V[`\x02\x81\x11\x15a\nAWa\nAa\x10\x12V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\x83\x9A\xD2t=@b\xDFW\x9E\xDF8\x18\xF6B\xB7\x1E\xE0h\x8A5\xD6\xBCD8\xEFS\x14\xCE\xCE\x80\x15\x81`@Qa\n\x95\x91\x90a\x10wV[`@Q\x80\x91\x03\x90\xA1PV[a\n\xB8`\0\x80Q` a\x11\xCF\x839\x81Q\x91R3a\x0B\x9AV[a\n\xD5W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x82`\x02\x81\x11\x15a\n\xEBWa\n\xEBa\x10\x12V[`\x02\x81\x11\x15a\n\xFCWa\n\xFCa\x10\x12V[\x81R` \x81\x01\x91\x90\x91R`@\x90\x81\x01`\0 \x80T`\xFF\x19\x16\x90UQ\x7F?\x17\x8F\x17\xDA\xE6\xCA\xF8\xCA\t\xC4\x85u\x02\xBA\xF7tN\x85\x97\xDEB\xD6Ydv\xFE\x9E\x06\xB8\xADG\x90a\n\x95\x90\x83\x90a\x10wV[`\0\x82\x81R`\x02` \x81\x90R`@\x82 \x90\x82\x90\x84\x90\x81\x11\x15a\x0BhWa\x0Bha\x10\x12V[`\x02\x81\x11\x15a\x0ByWa\x0Bya\x10\x12V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\x01`\x01`\xA0\x1B\x03\x16\x93\x92PPPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a\x0B\xCC\x82a\x07\x80V[a\x0B\xD5\x81a\x0B\xDFV[a\x07\xB1\x83\x83a\x0B\xECV[a\x0B\xE9\x813a\x0C\xD5V[PV[a\x0B\xF6\x82\x82a\x0B\x9AV[\x15a\x07|W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[a\x0C[\x82\x82a\x0B\x9AV[a\x07|W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x0C\x913\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x0C\xDF\x82\x82a\x0B\x9AV[a\x07|Wa\x0C\xEC\x81a\r.V[a\x0C\xF7\x83` a\r@V[`@Q` \x01a\r\x08\x92\x91\x90a\x10\xA9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x07[\x91`\x04\x01a\x11\x18V[``a\x06\xC9`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\rO\x83`\x02a\x11aV[a\rZ\x90`\x02a\x11xV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\rrWa\rra\x11\x8BV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\r\x9CW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\xB7Wa\r\xB7a\x11\xA1V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r\xE6Wa\r\xE6a\x11\xA1V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x0E\n\x84`\x02a\x11aV[a\x0E\x15\x90`\x01a\x11xV[\x90P[`\x01\x81\x11\x15a\x0E\x8DWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x0EIWa\x0EIa\x11\xA1V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\x0E_Wa\x0E_a\x11\xA1V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\x0E\x86\x81a\x11\xB7V[\x90Pa\x0E\x18V[P\x83\x15a\x0E\xDCW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x07[V[\x93\x92PPPV[`\0` \x82\x84\x03\x12\x15a\x0E\xF5W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x0E\xDCW`\0\x80\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0F$W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x0F;W`\0\x80\xFD[a\x0E\xDC\x82a\x0F\rV[`\0` \x82\x84\x03\x12\x15a\x0FVW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x0FpW`\0\x80\xFD[\x825\x91Pa\x0F\x80` \x84\x01a\x0F\rV[\x90P\x92P\x92\x90PV[\x805`\x03\x81\x10a\x0F$W`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x0F\xABW`\0\x80\xFD[\x825\x91Pa\x0F\x80` \x84\x01a\x0F\x89V[`\0\x80`\0``\x84\x86\x03\x12\x15a\x0F\xD0W`\0\x80\xFD[\x835\x92Pa\x0F\xE0` \x85\x01a\x0F\x89V[\x91Pa\x0F\xEE`@\x85\x01a\x0F\rV[\x90P\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15a\x10\tW`\0\x80\xFD[a\x0E\xDC\x82a\x0F\x89V[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x03\x81\x10a\x10FWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[\x83\x81R``\x81\x01a\x10^` \x83\x01\x85a\x10(V[`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16`@\x91\x90\x91\x01R\x92\x91PPV[` \x81\x01a\x06\xC9\x82\x84a\x10(V[`\0[\x83\x81\x10\x15a\x10\xA0W\x81\x81\x01Q\x83\x82\x01R` \x01a\x10\x88V[PP`\0\x91\x01RV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x10\xDB\x81`\x17\x85\x01` \x88\x01a\x10\x85V[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x11\x0C\x81`(\x84\x01` \x88\x01a\x10\x85V[\x01`(\x01\x94\x93PPPPV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x117\x81`@\x85\x01` \x87\x01a\x10\x85V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x06\xC9Wa\x06\xC9a\x11KV[\x80\x82\x01\x80\x82\x11\x15a\x06\xC9Wa\x06\xC9a\x11KV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81a\x11\xC6Wa\x11\xC6a\x11KV[P`\0\x19\x01\x90V\xFE\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\xA2dipfsX\"\x12 e'hp\xAE\xCC\x95\xD0\x02j9\xA8\xA0\x8D\xC1\xB9\xA7&IlM\x88\xB6Eo*\xC6@TW\x80c}\x9D(\x80\x14a\x04eW\x80c\x7F\x90 \x9F\x14a\x04\x8CW\x80c\x85\xCB\x11\x91\x14a\x04\xB3W\x80c\x8C\x156\xDF\x14a\x04\xDAW\x80c\x8D\xEB8\x93\x14a\x05\x01W\x80c\x8E\x8D\xFD\x16\x14a\x05\x14W\x80c\x90r\xF88\x14a\x05'W\x80c\x91\xD1HT\x14a\x05NW\x80c\x97z\x80p\x14a\x05aW\x80c\xA2\x17\xFD\xDF\x14a\x05\x88W\x80c\xAD\x1C\x8A\x86\x14a\x05\x90W\x80c\xCD\xDC\xAC\xE5\x14a\x05\xB7W\x80c\xD5Gt\x1F\x14a\x05\xDEW\x80c\xDA\x19\xDD\xFB\x14a\x05\xF1W\x80c\xDF8\x06\x93\x14a\x06\x18W\x80c\xF8\xAE\x93\xB4\x14a\x06?W`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01\xC1W\x80c\x11\xEE\x8F\xF7\x14a\x01\xE9W\x80c\x16\xF7k\xBF\x14a\x02\x1EW\x80c\x17\x85\xF5<\x14a\x02EW\x80c!\x9C&j\x14a\x02ZW\x80c$\x8A\x9C\xA3\x14a\x02\x81W\x80c&h\xF3\x05\x14a\x02\x94W\x80c,\x0B\x8B\xF7\x14a\x02\xBBW\x80c.H\x85\xE8\x14a\x02\xE2W\x80c//\xF1]\x14a\x03\tW\x80c6V\x8A\xBE\x14a\x03\x1CW\x80c>\xBFy\x85\x14a\x03/W\x80cB\x16\xE7:\x14a\x03{W\x80cQ\xAD\n\x80\x14a\x03\xA2W\x80cZ\xF2\x7Fy\x14a\x03\xB5W\x80cpH\x02u\x14a\x03\xDCW\x80ct\xBC\x819\x14a\x03\xEFW\x80cu\xB28\xFC\x14a\x04\x02W[`\0\x80\xFD[a\x01\xD4a\x01\xCF6`\x04a\x0E\xB1V[a\x06fV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x02\x10\x7FX\xA0\x04N\x0E\xCD\x81\x02^9\x8B\xF1\x81Pu\xD1#L\xBA\xC3t\x96\x14\xB0\xB3:@L.\xE2\xBA\xBF\x81V[`@Q\x90\x81R` \x01a\x01\xE0V[a\x02\x10\x7F\xF1OC\x1D\xAD\xC8.}\xBC^7\x9Fq#NW5\xC9\x18~C'\xA7\xC6\xAC\x01MU\xD1\xB7rz\x81V[a\x02Xa\x02S6`\x04a\x0E\xF7V[a\x06\x9DV[\0[a\x02\x10\x7FO\xD3\xE0Hz\x03\x82\xFB\x02|w\xB1\xAELV6r\xC9\xFB0\xA7Hy\x85_\x0C\x86\xC3v\xCF\x96\xEA\x81V[a\x02\x10a\x02\x8F6`\x04a\x0F\x12V[a\x07NV[a\x02\x10\x7F\xB1\xF7\x98\x13\xBCv0\xA5*\xE9H\xBC\x99x\x13\x97\xE4\t\xD0\xDD5!\x95;\xF7\xD8\xD7\xA2\xDBaG\xF7\x81V[a\x02\x10\x7F\xB7\xB4\xFD\xE9\x94M<\x13\xE9\xA7\x885C\x1C3\xA5\x08M\x90\xA7\xF0\xC7=\xEFv\xD7\x88c\x15\xFE\x87\xB0\x81V[a\x02\x10\x7F\xB91\xB2q\x9A\xEB*e\xA5\x03_\xA0\xA1\x90\xBF\xDCL\x86\"\xCE\x8C\xBF\xF7\xA3\xD1\xABBS\x1F\xB1\xA9\x18\x81V[a\x02Xa\x03\x176`\x04a\x0F+V[a\x07cV[a\x02Xa\x03*6`\x04a\x0F+V[a\x07\x84V[a\x03ca\x03=6`\x04a\x0FfV[`\x02` \x90\x81R`\0\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 T`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xE0V[a\x02\x10\x7FLA\xAEEK\xEBk\xBB\xE9\xBEP\xAC\xCC\x95z;\x156\xE4\x8B\x83Z\x86\x91\x9A\xF9\x81\xB5$M\xB7U\x81V[a\x02Xa\x03\xB06`\x04a\x0F\x89V[a\x07\xFEV[a\x02\x10\x7F\xA2\xC772\xDEez\xD0\xF3n\r\xDB\xB2q\x0FK\x13\xE8\xDD\xE4d!8k\xB9-\x1E\x17\x9D\xAEMM\x81V[a\x02Xa\x03\xEA6`\x04a\x0E\xF7V[a\t\x82V[a\x02Xa\x03\xFD6`\x04a\x0F\xC5V[a\t\xB2V[a\x02\x10`\0\x80Q` a\x11\x9D\x839\x81Q\x91R\x81V[a\x02\x10\x7Ft\x84]\xE3|\xFA\xBD5v3!KG\xFA\x91\xCC\xD1\x9B\x05\xB7\xC5\xA0\x8A\xC2,\x18\x7F\x81\x1F\xB6+\xCA\x81V[a\x02\x10\x7F\x9F5\xEF>\x0C&R\xA8\xBB\x87G\xD9/@\x7F\xCD9\xA7v\x8D\xAC\xC7\xF1e\x81\xC7\xA7\x1F\x10>Ub\x81V[a\x02\x10\x7F\xC2o\xAE\xDA\xEE\xDA/\xB9Jf\xD7\x86\xAA\x89\xC4\xA1\x8B\xB7\x90\xFA\0\x9D\x9D\xA9JT\x1D\x92\x18\\\xA9\x16\x81V[a\x02\x10\x7F\xC6gO\x98\xBA5\xC0\x1C\x13\x0E\x08\x19]\xD2lpF`7G:\x06\x8CZ\xAAG\nx=\x99\xC1l\x81V[a\x02\x10\x7F\xAEy\xA95sp\x12\xD0f\xE7\x1802i.R\x1F\xFE\x1A\xDE+\xED\xA2g\xE2>\x02\xB1\xD6\xE9\x11\x87\x81V[a\x02\x10\x7F\xAA\x06\xD1\x08\xDB\xD7\xBF\x97k\x16\xB7\xBFZ\xDB)\xD2\xD0\xEF,8\\\xA8\xB9\xD83\xCC\x80/3\x94-r\x81V[a\x02Xa\x05\x0F6`\x04a\x0F\xC5V[a\nnV[a\x03ca\x05\"6`\x04a\x0FfV[a\x0B\x12V[a\x02\x10\x7FT\x95<#\x06\x8B\x8F\xC4\xC0sc\x01\xB5\x0F\x10\x02}kF\x93'\xDE\x1F\xD4(A\xA5\x07+\x1B\xCE\xBE\x81V[a\x01\xD4a\x05\\6`\x04a\x0F+V[a\x0BhV[a\x02\x10\x7F'\xD7d\xEA*J8eCK\xBFJ9\x11\x10\x14\x96D\xBE1D\x8F4y\xFD\x15\xB4C\x88uWe\x81V[a\x02\x10`\0\x81V[a\x02\x10\x7F:h\xDB\xFD\x8B\xBBd\x01\\B\xBC\x13\x1C8\x8D\xEAye\xE2\x8C\x10\x04\xD0\x9B9\xF5\x95\0\xC3\xA7c\xEC\x81V[a\x02\x10\x7F\x0F'\xB9\xE4k\x89\xC5\xC7B\xE2\x80\x94\xDC\xEF\xE5\xE9F\xC3\xB9\x8F\x0F\xBE\xD8}\x9F\xCF[\x10\xBA\x96\x84\xEC\x81V[a\x02Xa\x05\xEC6`\x04a\x0F+V[a\x0B\x91V[a\x02\x10\x7F\x08\t\t\xC1\x8C\x95\x8C\xE5\xA2\xD3d\x81ix$\xE4w1\x93#\xD01T\xCE\xBA;x\xF2\x8Aa\x88{\x81V[a\x02\x10\x7F\xB4\xBF\x99\x9Bh\xD8\x08]\xBB\xF7\xA0\xEC/Z-f\x08s\x93[\xDF\x1E\xD0\x8E\xB4!\xACm\xCB\xC0\x03b\x81V[a\x02\x10\x7F\xDD[\x9B\x8A^\x8E\x01\xF2\x96.\xD7\xE9\x83\xD5\x8F\xE3.\x1Ff\xAA\x88\xDDz\xB3\x07p\xFA\x9Bw\xDArC\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x06\x97WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x80Q` a\x11\x9D\x839\x81Q\x91Ra\x06\xB5\x81a\x0B\xADV[3`\x01`\x01`\xA0\x1B\x03\x83\x16\x03a\x072W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`7`$\x82\x01R\x7FCannot remove self as admin. Ha`D\x82\x01Rv;2\x90:42\x9072\xBB\x900\xB26\xB4\xB7\x1027\x904\xBA\x17`I\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x07J`\0\x80Q` a\x11\x9D\x839\x81Q\x91R\x83a\x0B\xBAV[PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x07l\x82a\x07NV[a\x07u\x81a\x0B\xADV[a\x07\x7F\x83\x83a\x0C\x1FV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x07\xF4W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x07)V[a\x07J\x82\x82a\x0B\xBAV[a\x08\x16`\0\x80Q` a\x11\x9D\x839\x81Q\x91R3a\x0BhV[a\x083W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x83`\x02\x81\x11\x15a\x08IWa\x08Ia\x0F\xE0V[`\x02\x81\x11\x15a\x08ZWa\x08Za\x0F\xE0V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\xFF\x16\x15\x15`\x01\x14a\x08\xD7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FThe provided Env is not valid fo`D\x82\x01Rn\x1C\x88\x1D\x1A\x1A\\\xC8\x18\xDB\xDB\x9D\x1C\x98X\xDD`\x8A\x1B`d\x82\x01R`\x84\x01a\x07)V[\x80`\x02`\0\x85\x81R` \x01\x90\x81R` \x01`\0 `\0\x84`\x02\x81\x11\x15a\x08\xFFWa\x08\xFFa\x0F\xE0V[`\x02\x81\x11\x15a\t\x10Wa\t\x10a\x0F\xE0V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\x01`\x01`\xA0\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`\xA0\x1B\x03\x16\x02\x17\x90UP\x7F3\xF0\x14\x89\x0F\x10\x92)\xBB\xCF\x8D\xD4r\x04\xC1S\xA2\xC0\xFF\x1CW*a\xDE\"\r\x103e0\xF5=\x83\x83\x83`@Qa\tu\x93\x92\x91\x90a\x10\x18V[`@Q\x80\x91\x03\x90\xA1PPPV[`\0\x80Q` a\x11\x9D\x839\x81Q\x91Ra\t\x9A\x81a\x0B\xADV[a\x07J`\0\x80Q` a\x11\x9D\x839\x81Q\x91R\x83a\x0C\x1FV[a\t\xCA`\0\x80Q` a\x11\x9D\x839\x81Q\x91R3a\x0BhV[a\t\xE7W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01\x80`\0\x83`\x02\x81\x11\x15a\t\xFEWa\t\xFEa\x0F\xE0V[`\x02\x81\x11\x15a\n\x0FWa\n\x0Fa\x0F\xE0V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\x83\x9A\xD2t=@b\xDFW\x9E\xDF8\x18\xF6B\xB7\x1E\xE0h\x8A5\xD6\xBCD8\xEFS\x14\xCE\xCE\x80\x15\x81`@Qa\nc\x91\x90a\x10EV[`@Q\x80\x91\x03\x90\xA1PV[a\n\x86`\0\x80Q` a\x11\x9D\x839\x81Q\x91R3a\x0BhV[a\n\xA3W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x82`\x02\x81\x11\x15a\n\xB9Wa\n\xB9a\x0F\xE0V[`\x02\x81\x11\x15a\n\xCAWa\n\xCAa\x0F\xE0V[\x81R` \x81\x01\x91\x90\x91R`@\x90\x81\x01`\0 \x80T`\xFF\x19\x16\x90UQ\x7F?\x17\x8F\x17\xDA\xE6\xCA\xF8\xCA\t\xC4\x85u\x02\xBA\xF7tN\x85\x97\xDEB\xD6Ydv\xFE\x9E\x06\xB8\xADG\x90a\nc\x90\x83\x90a\x10EV[`\0\x82\x81R`\x02` \x81\x90R`@\x82 \x90\x82\x90\x84\x90\x81\x11\x15a\x0B6Wa\x0B6a\x0F\xE0V[`\x02\x81\x11\x15a\x0BGWa\x0BGa\x0F\xE0V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\x01`\x01`\xA0\x1B\x03\x16\x93\x92PPPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a\x0B\x9A\x82a\x07NV[a\x0B\xA3\x81a\x0B\xADV[a\x07\x7F\x83\x83a\x0B\xBAV[a\x0B\xB7\x813a\x0C\xA3V[PV[a\x0B\xC4\x82\x82a\x0BhV[\x15a\x07JW`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[a\x0C)\x82\x82a\x0BhV[a\x07JW`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x0C_3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x0C\xAD\x82\x82a\x0BhV[a\x07JWa\x0C\xBA\x81a\x0C\xFCV[a\x0C\xC5\x83` a\r\x0EV[`@Q` \x01a\x0C\xD6\x92\x91\x90a\x10wV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x07)\x91`\x04\x01a\x10\xE6V[``a\x06\x97`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\r\x1D\x83`\x02a\x11/V[a\r(\x90`\x02a\x11FV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\r@Wa\r@a\x11YV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\rjW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\x85Wa\r\x85a\x11oV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r\xB4Wa\r\xB4a\x11oV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\r\xD8\x84`\x02a\x11/V[a\r\xE3\x90`\x01a\x11FV[\x90P[`\x01\x81\x11\x15a\x0E[Wo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x0E\x17Wa\x0E\x17a\x11oV[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\x0E-Wa\x0E-a\x11oV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\x0ET\x81a\x11\x85V[\x90Pa\r\xE6V[P\x83\x15a\x0E\xAAW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x07)V[\x93\x92PPPV[`\0` \x82\x84\x03\x12\x15a\x0E\xC3W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x0E\xAAW`\0\x80\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0E\xF2W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x0F\tW`\0\x80\xFD[a\x0E\xAA\x82a\x0E\xDBV[`\0` \x82\x84\x03\x12\x15a\x0F$W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x0F>W`\0\x80\xFD[\x825\x91Pa\x0FN` \x84\x01a\x0E\xDBV[\x90P\x92P\x92\x90PV[\x805`\x03\x81\x10a\x0E\xF2W`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x0FyW`\0\x80\xFD[\x825\x91Pa\x0FN` \x84\x01a\x0FWV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x0F\x9EW`\0\x80\xFD[\x835\x92Pa\x0F\xAE` \x85\x01a\x0FWV[\x91Pa\x0F\xBC`@\x85\x01a\x0E\xDBV[\x90P\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15a\x0F\xD7W`\0\x80\xFD[a\x0E\xAA\x82a\x0FWV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x03\x81\x10a\x10\x14WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[\x83\x81R``\x81\x01a\x10,` \x83\x01\x85a\x0F\xF6V[`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16`@\x91\x90\x91\x01R\x92\x91PPV[` \x81\x01a\x06\x97\x82\x84a\x0F\xF6V[`\0[\x83\x81\x10\x15a\x10nW\x81\x81\x01Q\x83\x82\x01R` \x01a\x10VV[PP`\0\x91\x01RV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x10\xA9\x81`\x17\x85\x01` \x88\x01a\x10SV[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x10\xDA\x81`(\x84\x01` \x88\x01a\x10SV[\x01`(\x01\x94\x93PPPPV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x11\x05\x81`@\x85\x01` \x87\x01a\x10SV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x06\x97Wa\x06\x97a\x11\x19V[\x80\x82\x01\x80\x82\x11\x15a\x06\x97Wa\x06\x97a\x11\x19V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81a\x11\x94Wa\x11\x94a\x11\x19V[P`\0\x19\x01\x90V\xFE\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\xA2dipfsX\"\x12 \xBC\xFBZ\xA3%\x1D\xDF3\xA8sl\x96\x89\xBD\x99\xCE\xA1\xDF[\xAA\x0F\xAC8|Ui\x13rX%\xC9rdsolcC\0\x08\x1C\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x01\xC7W`\x005`\xE0\x1C\x80c|\xAD\xF6\x9F\x11a\x01\0W\x80c|\xAD\xF6\x9F\x14a\x04\"W\x80c}J\x03\xBD\x14a\x04IW\x80c}\x9D(\x80\x14a\x04pW\x80c\x7F\x90 \x9F\x14a\x04\x97W\x80c\x81\xD4\x95x\x14a\x04\xBEW\x80c\x85\xCB\x11\x91\x14a\x04\xE5W\x80c\x8C\x156\xDF\x14a\x05\x0CW\x80c\x8D\xEB8\x93\x14a\x053W\x80c\x8E\x8D\xFD\x16\x14a\x05FW\x80c\x90r\xF88\x14a\x05YW\x80c\x91\xD1HT\x14a\x05\x80W\x80c\x97z\x80p\x14a\x05\x93W\x80c\xA2\x17\xFD\xDF\x14a\x05\xBAW\x80c\xAD\x1C\x8A\x86\x14a\x05\xC2W\x80c\xCD\xDC\xAC\xE5\x14a\x05\xE9W\x80c\xD5Gt\x1F\x14a\x06\x10W\x80c\xDA\x19\xDD\xFB\x14a\x06#W\x80c\xDF8\x06\x93\x14a\x06JW\x80c\xF8\xAE\x93\xB4\x14a\x06qW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01\xCCW\x80c\x11\xEE\x8F\xF7\x14a\x01\xF4W\x80c\x16\xF7k\xBF\x14a\x02)W\x80c\x17\x85\xF5<\x14a\x02PW\x80c!\x9C&j\x14a\x02eW\x80c$\x8A\x9C\xA3\x14a\x02\x8CW\x80c&h\xF3\x05\x14a\x02\x9FW\x80c,\x0B\x8B\xF7\x14a\x02\xC6W\x80c.H\x85\xE8\x14a\x02\xEDW\x80c//\xF1]\x14a\x03\x14W\x80c6V\x8A\xBE\x14a\x03'W\x80c>\xBFy\x85\x14a\x03:W\x80cB\x16\xE7:\x14a\x03\x86W\x80cQ\xAD\n\x80\x14a\x03\xADW\x80cZ\xF2\x7Fy\x14a\x03\xC0W\x80cpH\x02u\x14a\x03\xE7W\x80ct\xBC\x819\x14a\x03\xFAW\x80cu\xB28\xFC\x14a\x04\rW[`\0\x80\xFD[a\x01\xDFa\x01\xDA6`\x04a\x0E\xE3V[a\x06\x98V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x02\x1B\x7FX\xA0\x04N\x0E\xCD\x81\x02^9\x8B\xF1\x81Pu\xD1#L\xBA\xC3t\x96\x14\xB0\xB3:@L.\xE2\xBA\xBF\x81V[`@Q\x90\x81R` \x01a\x01\xEBV[a\x02\x1B\x7F\xF1OC\x1D\xAD\xC8.}\xBC^7\x9Fq#NW5\xC9\x18~C'\xA7\xC6\xAC\x01MU\xD1\xB7rz\x81V[a\x02ca\x02^6`\x04a\x0F)V[a\x06\xCFV[\0[a\x02\x1B\x7FO\xD3\xE0Hz\x03\x82\xFB\x02|w\xB1\xAELV6r\xC9\xFB0\xA7Hy\x85_\x0C\x86\xC3v\xCF\x96\xEA\x81V[a\x02\x1Ba\x02\x9A6`\x04a\x0FDV[a\x07\x80V[a\x02\x1B\x7F\xB1\xF7\x98\x13\xBCv0\xA5*\xE9H\xBC\x99x\x13\x97\xE4\t\xD0\xDD5!\x95;\xF7\xD8\xD7\xA2\xDBaG\xF7\x81V[a\x02\x1B\x7F\xB7\xB4\xFD\xE9\x94M<\x13\xE9\xA7\x885C\x1C3\xA5\x08M\x90\xA7\xF0\xC7=\xEFv\xD7\x88c\x15\xFE\x87\xB0\x81V[a\x02\x1B\x7F\xB91\xB2q\x9A\xEB*e\xA5\x03_\xA0\xA1\x90\xBF\xDCL\x86\"\xCE\x8C\xBF\xF7\xA3\xD1\xABBS\x1F\xB1\xA9\x18\x81V[a\x02ca\x03\"6`\x04a\x0F]V[a\x07\x95V[a\x02ca\x0356`\x04a\x0F]V[a\x07\xB6V[a\x03na\x03H6`\x04a\x0F\x98V[`\x02` \x90\x81R`\0\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 T`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xEBV[a\x02\x1B\x7FLA\xAEEK\xEBk\xBB\xE9\xBEP\xAC\xCC\x95z;\x156\xE4\x8B\x83Z\x86\x91\x9A\xF9\x81\xB5$M\xB7U\x81V[a\x02ca\x03\xBB6`\x04a\x0F\xBBV[a\x080V[a\x02\x1B\x7F\xA2\xC772\xDEez\xD0\xF3n\r\xDB\xB2q\x0FK\x13\xE8\xDD\xE4d!8k\xB9-\x1E\x17\x9D\xAEMM\x81V[a\x02ca\x03\xF56`\x04a\x0F)V[a\t\xB4V[a\x02ca\x04\x086`\x04a\x0F\xF7V[a\t\xE4V[a\x02\x1B`\0\x80Q` a\x11\xCF\x839\x81Q\x91R\x81V[a\x02\x1B\x7Ft\x84]\xE3|\xFA\xBD5v3!KG\xFA\x91\xCC\xD1\x9B\x05\xB7\xC5\xA0\x8A\xC2,\x18\x7F\x81\x1F\xB6+\xCA\x81V[a\x02\x1B\x7F\x9F5\xEF>\x0C&R\xA8\xBB\x87G\xD9/@\x7F\xCD9\xA7v\x8D\xAC\xC7\xF1e\x81\xC7\xA7\x1F\x10>Ub\x81V[a\x02\x1B\x7F\xC2o\xAE\xDA\xEE\xDA/\xB9Jf\xD7\x86\xAA\x89\xC4\xA1\x8B\xB7\x90\xFA\0\x9D\x9D\xA9JT\x1D\x92\x18\\\xA9\x16\x81V[a\x02\x1B\x7F\xC6gO\x98\xBA5\xC0\x1C\x13\x0E\x08\x19]\xD2lpF`7G:\x06\x8CZ\xAAG\nx=\x99\xC1l\x81V[a\x02\x1B\x7FWIm\xE40\x02\x8F2,Y+\x0FsQ\x10\xEB4\xF1\xAE\x81\x84\xA9K\xC5\x1D@\xB0\x84{TF\x9B\x81V[a\x02\x1B\x7F\xAEy\xA95sp\x12\xD0f\xE7\x1802i.R\x1F\xFE\x1A\xDE+\xED\xA2g\xE2>\x02\xB1\xD6\xE9\x11\x87\x81V[a\x02\x1B\x7F\xAA\x06\xD1\x08\xDB\xD7\xBF\x97k\x16\xB7\xBFZ\xDB)\xD2\xD0\xEF,8\\\xA8\xB9\xD83\xCC\x80/3\x94-r\x81V[a\x02ca\x05A6`\x04a\x0F\xF7V[a\n\xA0V[a\x03na\x05T6`\x04a\x0F\x98V[a\x0BDV[a\x02\x1B\x7FT\x95<#\x06\x8B\x8F\xC4\xC0sc\x01\xB5\x0F\x10\x02}kF\x93'\xDE\x1F\xD4(A\xA5\x07+\x1B\xCE\xBE\x81V[a\x01\xDFa\x05\x8E6`\x04a\x0F]V[a\x0B\x9AV[a\x02\x1B\x7F'\xD7d\xEA*J8eCK\xBFJ9\x11\x10\x14\x96D\xBE1D\x8F4y\xFD\x15\xB4C\x88uWe\x81V[a\x02\x1B`\0\x81V[a\x02\x1B\x7F:h\xDB\xFD\x8B\xBBd\x01\\B\xBC\x13\x1C8\x8D\xEAye\xE2\x8C\x10\x04\xD0\x9B9\xF5\x95\0\xC3\xA7c\xEC\x81V[a\x02\x1B\x7F\x0F'\xB9\xE4k\x89\xC5\xC7B\xE2\x80\x94\xDC\xEF\xE5\xE9F\xC3\xB9\x8F\x0F\xBE\xD8}\x9F\xCF[\x10\xBA\x96\x84\xEC\x81V[a\x02ca\x06\x1E6`\x04a\x0F]V[a\x0B\xC3V[a\x02\x1B\x7F\x08\t\t\xC1\x8C\x95\x8C\xE5\xA2\xD3d\x81ix$\xE4w1\x93#\xD01T\xCE\xBA;x\xF2\x8Aa\x88{\x81V[a\x02\x1B\x7F\xB4\xBF\x99\x9Bh\xD8\x08]\xBB\xF7\xA0\xEC/Z-f\x08s\x93[\xDF\x1E\xD0\x8E\xB4!\xACm\xCB\xC0\x03b\x81V[a\x02\x1B\x7F\xDD[\x9B\x8A^\x8E\x01\xF2\x96.\xD7\xE9\x83\xD5\x8F\xE3.\x1Ff\xAA\x88\xDDz\xB3\x07p\xFA\x9Bw\xDArC\x81V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x06\xC9WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\0\x80Q` a\x11\xCF\x839\x81Q\x91Ra\x06\xE7\x81a\x0B\xDFV[3`\x01`\x01`\xA0\x1B\x03\x83\x16\x03a\x07dW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`7`$\x82\x01R\x7FCannot remove self as admin. Ha`D\x82\x01Rv;2\x90:42\x9072\xBB\x900\xB26\xB4\xB7\x1027\x904\xBA\x17`I\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[a\x07|`\0\x80Q` a\x11\xCF\x839\x81Q\x91R\x83a\x0B\xECV[PPV[`\0\x90\x81R` \x81\x90R`@\x90 `\x01\x01T\x90V[a\x07\x9E\x82a\x07\x80V[a\x07\xA7\x81a\x0B\xDFV[a\x07\xB1\x83\x83a\x0CQV[PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x08&W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x07[V[a\x07|\x82\x82a\x0B\xECV[a\x08H`\0\x80Q` a\x11\xCF\x839\x81Q\x91R3a\x0B\x9AV[a\x08eW`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x83`\x02\x81\x11\x15a\x08{Wa\x08{a\x10\x12V[`\x02\x81\x11\x15a\x08\x8CWa\x08\x8Ca\x10\x12V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\xFF\x16\x15\x15`\x01\x14a\t\tW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FThe provided Env is not valid fo`D\x82\x01Rn\x1C\x88\x1D\x1A\x1A\\\xC8\x18\xDB\xDB\x9D\x1C\x98X\xDD`\x8A\x1B`d\x82\x01R`\x84\x01a\x07[V[\x80`\x02`\0\x85\x81R` \x01\x90\x81R` \x01`\0 `\0\x84`\x02\x81\x11\x15a\t1Wa\t1a\x10\x12V[`\x02\x81\x11\x15a\tBWa\tBa\x10\x12V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\x01`\x01`\xA0\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`\xA0\x1B\x03\x16\x02\x17\x90UP\x7F3\xF0\x14\x89\x0F\x10\x92)\xBB\xCF\x8D\xD4r\x04\xC1S\xA2\xC0\xFF\x1CW*a\xDE\"\r\x103e0\xF5=\x83\x83\x83`@Qa\t\xA7\x93\x92\x91\x90a\x10JV[`@Q\x80\x91\x03\x90\xA1PPPV[`\0\x80Q` a\x11\xCF\x839\x81Q\x91Ra\t\xCC\x81a\x0B\xDFV[a\x07|`\0\x80Q` a\x11\xCF\x839\x81Q\x91R\x83a\x0CQV[a\t\xFC`\0\x80Q` a\x11\xCF\x839\x81Q\x91R3a\x0B\x9AV[a\n\x19W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01\x80`\0\x83`\x02\x81\x11\x15a\n0Wa\n0a\x10\x12V[`\x02\x81\x11\x15a\nAWa\nAa\x10\x12V[\x81R` \x01\x90\x81R` \x01`\0 `\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\x83\x9A\xD2t=@b\xDFW\x9E\xDF8\x18\xF6B\xB7\x1E\xE0h\x8A5\xD6\xBCD8\xEFS\x14\xCE\xCE\x80\x15\x81`@Qa\n\x95\x91\x90a\x10wV[`@Q\x80\x91\x03\x90\xA1PV[a\n\xB8`\0\x80Q` a\x11\xCF\x839\x81Q\x91R3a\x0B\x9AV[a\n\xD5W`@QcdH|%`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\0\x82`\x02\x81\x11\x15a\n\xEBWa\n\xEBa\x10\x12V[`\x02\x81\x11\x15a\n\xFCWa\n\xFCa\x10\x12V[\x81R` \x81\x01\x91\x90\x91R`@\x90\x81\x01`\0 \x80T`\xFF\x19\x16\x90UQ\x7F?\x17\x8F\x17\xDA\xE6\xCA\xF8\xCA\t\xC4\x85u\x02\xBA\xF7tN\x85\x97\xDEB\xD6Ydv\xFE\x9E\x06\xB8\xADG\x90a\n\x95\x90\x83\x90a\x10wV[`\0\x82\x81R`\x02` \x81\x90R`@\x82 \x90\x82\x90\x84\x90\x81\x11\x15a\x0BhWa\x0Bha\x10\x12V[`\x02\x81\x11\x15a\x0ByWa\x0Bya\x10\x12V[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 T`\x01`\x01`\xA0\x1B\x03\x16\x93\x92PPPV[`\0\x91\x82R` \x82\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a\x0B\xCC\x82a\x07\x80V[a\x0B\xD5\x81a\x0B\xDFV[a\x07\xB1\x83\x83a\x0B\xECV[a\x0B\xE9\x813a\x0C\xD5V[PV[a\x0B\xF6\x82\x82a\x0B\x9AV[\x15a\x07|W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[a\x0C[\x82\x82a\x0B\x9AV[a\x07|W`\0\x82\x81R` \x81\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x0C\x913\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x83\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4PPV[a\x0C\xDF\x82\x82a\x0B\x9AV[a\x07|Wa\x0C\xEC\x81a\r.V[a\x0C\xF7\x83` a\r@V[`@Q` \x01a\r\x08\x92\x91\x90a\x10\xA9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x07[\x91`\x04\x01a\x11\x18V[``a\x06\xC9`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a\rO\x83`\x02a\x11aV[a\rZ\x90`\x02a\x11xV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\rrWa\rra\x11\x8BV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\r\x9CW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\xB7Wa\r\xB7a\x11\xA1V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r\xE6Wa\r\xE6a\x11\xA1V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x0E\n\x84`\x02a\x11aV[a\x0E\x15\x90`\x01a\x11xV[\x90P[`\x01\x81\x11\x15a\x0E\x8DWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\x0EIWa\x0EIa\x11\xA1V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\x0E_Wa\x0E_a\x11\xA1V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\x0E\x86\x81a\x11\xB7V[\x90Pa\x0E\x18V[P\x83\x15a\x0E\xDCW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x07[V[\x93\x92PPPV[`\0` \x82\x84\x03\x12\x15a\x0E\xF5W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x0E\xDCW`\0\x80\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0F$W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x0F;W`\0\x80\xFD[a\x0E\xDC\x82a\x0F\rV[`\0` \x82\x84\x03\x12\x15a\x0FVW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x0FpW`\0\x80\xFD[\x825\x91Pa\x0F\x80` \x84\x01a\x0F\rV[\x90P\x92P\x92\x90PV[\x805`\x03\x81\x10a\x0F$W`\0\x80\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x0F\xABW`\0\x80\xFD[\x825\x91Pa\x0F\x80` \x84\x01a\x0F\x89V[`\0\x80`\0``\x84\x86\x03\x12\x15a\x0F\xD0W`\0\x80\xFD[\x835\x92Pa\x0F\xE0` \x85\x01a\x0F\x89V[\x91Pa\x0F\xEE`@\x85\x01a\x0F\rV[\x90P\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15a\x10\tW`\0\x80\xFD[a\x0E\xDC\x82a\x0F\x89V[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x03\x81\x10a\x10FWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[\x83\x81R``\x81\x01a\x10^` \x83\x01\x85a\x10(V[`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16`@\x91\x90\x91\x01R\x92\x91PPV[` \x81\x01a\x06\xC9\x82\x84a\x10(V[`\0[\x83\x81\x10\x15a\x10\xA0W\x81\x81\x01Q\x83\x82\x01R` \x01a\x10\x88V[PP`\0\x91\x01RV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa\x10\xDB\x81`\x17\x85\x01` \x88\x01a\x10\x85V[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa\x11\x0C\x81`(\x84\x01` \x88\x01a\x10\x85V[\x01`(\x01\x94\x93PPPPV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x117\x81`@\x85\x01` \x87\x01a\x10\x85V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x06\xC9Wa\x06\xC9a\x11KV[\x80\x82\x01\x80\x82\x11\x15a\x06\xC9Wa\x06\xC9a\x11KV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81a\x11\xC6Wa\x11\xC6a\x11KV[P`\0\x19\x01\x90V\xFE\xDF\x8BLR\x0F\xFE\x19|SC\xC6\xF5\xAE\xC5\x95p\x15\x1E\xF9\xA4\x92\xF2\xC6$\xFDE\xDD\xDEa5\xECB\xA2dipfsX\"\x12 e'hp\xAE\xCC\x95\xD0\x02j9\xA8\xA0\x8D\xC1\xB9\xA7&IlM\x88\xB6Eo*\xC6@T ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([129, 212, 149, 120], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `RATE_LIMIT_NFT_CONTRACT` (0x2e4885e8) function pub fn rate_limit_nft_contract( &self, @@ -2115,6 +2147,24 @@ pub mod contract_resolver { )] #[ethcall(name = "PUB_KEY_ROUTER_CONTRACT", abi = "PUB_KEY_ROUTER_CONTRACT()")] pub struct PubKeyRouterContractCall; + ///Container type for all input parameters for the `PUB_KEY_ROUTER_VIEWS_CONTRACT` function with signature `PUB_KEY_ROUTER_VIEWS_CONTRACT()` and selector `0x81d49578` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash + )] + #[ethcall( + name = "PUB_KEY_ROUTER_VIEWS_CONTRACT", + abi = "PUB_KEY_ROUTER_VIEWS_CONTRACT()" + )] + pub struct PubKeyRouterViewsContractCall; ///Container type for all input parameters for the `RATE_LIMIT_NFT_CONTRACT` function with signature `RATE_LIMIT_NFT_CONTRACT()` and selector `0x2e4885e8` #[derive( Clone, @@ -2432,6 +2482,7 @@ pub mod contract_resolver { PkpPermissionsContract(PkpPermissionsContractCall), PriceFeedContract(PriceFeedContractCall), PubKeyRouterContract(PubKeyRouterContractCall), + PubKeyRouterViewsContract(PubKeyRouterViewsContractCall), RateLimitNftContract(RateLimitNftContractCall), ReleaseRegisterContract(ReleaseRegisterContractCall), StakingBalancesContract(StakingBalancesContractCall), @@ -2550,6 +2601,11 @@ pub mod contract_resolver { ) { return Ok(Self::PubKeyRouterContract(decoded)); } + if let Ok(decoded) = ::decode( + data, + ) { + return Ok(Self::PubKeyRouterViewsContract(decoded)); + } if let Ok(decoded) = ::decode( data, ) { @@ -2698,6 +2754,9 @@ pub mod contract_resolver { Self::PubKeyRouterContract(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::PubKeyRouterViewsContract(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::RateLimitNftContract(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -2792,6 +2851,9 @@ pub mod contract_resolver { Self::PubKeyRouterContract(element) => { ::core::fmt::Display::fmt(element, f) } + Self::PubKeyRouterViewsContract(element) => { + ::core::fmt::Display::fmt(element, f) + } Self::RateLimitNftContract(element) => { ::core::fmt::Display::fmt(element, f) } @@ -2913,6 +2975,11 @@ pub mod contract_resolver { Self::PubKeyRouterContract(value) } } + impl ::core::convert::From for ContractResolverCalls { + fn from(value: PubKeyRouterViewsContractCall) -> Self { + Self::PubKeyRouterViewsContract(value) + } + } impl ::core::convert::From for ContractResolverCalls { fn from(value: RateLimitNftContractCall) -> Self { Self::RateLimitNftContract(value) @@ -3264,6 +3331,20 @@ pub mod contract_resolver { Hash )] pub struct PubKeyRouterContractReturn(pub [u8; 32]); + ///Container type for all return fields from the `PUB_KEY_ROUTER_VIEWS_CONTRACT` function with signature `PUB_KEY_ROUTER_VIEWS_CONTRACT()` and selector `0x81d49578` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash + )] + pub struct PubKeyRouterViewsContractReturn(pub [u8; 32]); ///Container type for all return fields from the `RATE_LIMIT_NFT_CONTRACT` function with signature `RATE_LIMIT_NFT_CONTRACT()` and selector `0x2e4885e8` #[derive( Clone, diff --git a/rust/lit-core/lit-blockchain/src/contracts/key_deriver.rs b/rust/lit-core/lit-blockchain/src/contracts/key_deriver.rs index 21eed945..cd736892 100644 --- a/rust/lit-core/lit-blockchain/src/contracts/key_deriver.rs +++ b/rust/lit-core/lit-blockchain/src/contracts/key_deriver.rs @@ -118,13 +118,13 @@ pub mod key_deriver { __abi, ); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15`\x0FW`\0\x80\xFD[Pa\x05\xEE\x80a\0\x1F`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80cb\xE4\xC4d\x14a\0;W\x80c\xA3,+\x99\x14a\0`W[`\0\x80\xFD[a\0C`\xF5\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0sa\0n6`\x04a\x02\x9EV[a\0\x81V[`@Qa\0W\x92\x91\x90a\x04CV[`\0```\0a\0\x92\x86\x86\x86a\x01\0V[\x90P`\0\x80`\xF5`\x01`\x01`\xA0\x1B\x03\x16\x83`@Qa\0\xB0\x91\x90a\x04\x7FV[`\0`@Q\x80\x83\x03\x81\x85Z\xFA\x91PP=\x80`\0\x81\x14a\0\xEBW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\0\xF0V[``\x91P[P\x90\x99\x90\x98P\x96PPPPPPPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x01\x9AW\x84\x86\x82\x81Q\x81\x10a\x011Wa\x011a\x04\x9BV[` \x02` \x01\x01Q` \x01Q\x03a\x01\x92W\x82\x86\x82\x81Q\x81\x10a\x01UWa\x01Ua\x04\x9BV[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x01r\x92\x91\x90a\x04\xB1V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x01\x8E\x90a\x04\xE0V[\x92PP[`\x01\x01a\x01\x15V[P\x83`\x02\x03a\x01\xACW`\x01\x93Pa\x01\xB9V[\x83`\x03\x03a\x01\xB9W`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x05\x8E`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x02\x10\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x05\x13V[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x9C\x9BPPPPPPPPPPPPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02hWa\x02ha\x020V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02\x96Wa\x02\x96a\x020V[`@R\x91\x90PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x02\xB3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xD0W`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x02\xE1W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xFAWa\x02\xFAa\x020V[\x80`\x05\x1Ba\x03\n` \x82\x01a\x02nV[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x03&W`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x04\nW\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03KW`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x03aW`\0\x80\xFD[a\x03ia\x02FV[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\x82W`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x03\x97W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\xB0Wa\x03\xB0a\x020V[a\x03\xC3`\x1F\x82\x01`\x1F\x19\x16` \x01a\x02nV[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x03\xD8W`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x03-V[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x04:W\x81\x81\x01Q\x83\x82\x01R` \x01a\x04\"V[PP`\0\x91\x01RV[\x82\x15\x15\x81R`@` \x82\x01R`\0\x82Q\x80`@\x84\x01Ra\x04j\x81``\x85\x01` \x87\x01a\x04\x1FV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01``\x01\x93\x92PPPV[`\0\x82Qa\x04\x91\x81\x84` \x87\x01a\x04\x1FV[\x91\x90\x91\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x83Qa\x04\xC3\x81\x84` \x88\x01a\x04\x1FV[\x83Q\x90\x83\x01\x90a\x04\xD7\x81\x83` \x88\x01a\x04\x1FV[\x01\x94\x93PPPPV[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x05\nWcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x05U\x81`)\x85\x01` \x89\x01a\x04\x1FV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x05|\x81`-\x84\x01` \x88\x01a\x04\x1FV[\x01`-\x01\x99\x98PPPPPPPPPV\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 \xB3\xF5\xD6\xAC\xD5\xA77\x13D\xCA\xCA\xB0^`py\xEB\xF4v\xB4m\x8B\x17\x04\x19a/\x80\xE7\xA8\xAC\x95dsolcC\0\x08\x1C\x003"; + const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15`\x0FW`\0\x80\xFD[Pa\x05\xEE\x80a\0\x1F`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80cb\xE4\xC4d\x14a\0;W\x80c\xA3,+\x99\x14a\0`W[`\0\x80\xFD[a\0C`\xF5\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0sa\0n6`\x04a\x02\x9EV[a\0\x81V[`@Qa\0W\x92\x91\x90a\x04CV[`\0```\0a\0\x92\x86\x86\x86a\x01\0V[\x90P`\0\x80`\xF5`\x01`\x01`\xA0\x1B\x03\x16\x83`@Qa\0\xB0\x91\x90a\x04\x7FV[`\0`@Q\x80\x83\x03\x81\x85Z\xFA\x91PP=\x80`\0\x81\x14a\0\xEBW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\0\xF0V[``\x91P[P\x90\x99\x90\x98P\x96PPPPPPPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x01\x9AW\x84\x86\x82\x81Q\x81\x10a\x011Wa\x011a\x04\x9BV[` \x02` \x01\x01Q` \x01Q\x03a\x01\x92W\x82\x86\x82\x81Q\x81\x10a\x01UWa\x01Ua\x04\x9BV[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x01r\x92\x91\x90a\x04\xB1V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x01\x8E\x90a\x04\xE0V[\x92PP[`\x01\x01a\x01\x15V[P\x83`\x02\x03a\x01\xACW`\x01\x93Pa\x01\xB9V[\x83`\x03\x03a\x01\xB9W`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x05\x8E`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x02\x10\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x05\x13V[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x9C\x9BPPPPPPPPPPPPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02hWa\x02ha\x020V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02\x96Wa\x02\x96a\x020V[`@R\x91\x90PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x02\xB3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xD0W`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x02\xE1W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xFAWa\x02\xFAa\x020V[\x80`\x05\x1Ba\x03\n` \x82\x01a\x02nV[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x03&W`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x04\nW\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03KW`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x03aW`\0\x80\xFD[a\x03ia\x02FV[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\x82W`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x03\x97W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\xB0Wa\x03\xB0a\x020V[a\x03\xC3`\x1F\x82\x01`\x1F\x19\x16` \x01a\x02nV[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x03\xD8W`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x03-V[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x04:W\x81\x81\x01Q\x83\x82\x01R` \x01a\x04\"V[PP`\0\x91\x01RV[\x82\x15\x15\x81R`@` \x82\x01R`\0\x82Q\x80`@\x84\x01Ra\x04j\x81``\x85\x01` \x87\x01a\x04\x1FV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01``\x01\x93\x92PPPV[`\0\x82Qa\x04\x91\x81\x84` \x87\x01a\x04\x1FV[\x91\x90\x91\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x83Qa\x04\xC3\x81\x84` \x88\x01a\x04\x1FV[\x83Q\x90\x83\x01\x90a\x04\xD7\x81\x83` \x88\x01a\x04\x1FV[\x01\x94\x93PPPPV[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x05\nWcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x05U\x81`)\x85\x01` \x89\x01a\x04\x1FV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x05|\x81`-\x84\x01` \x88\x01a\x04\x1FV[\x01`-\x01\x99\x98PPPPPPPPPV\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 ].\x87\x92D\x05\xC7Z7\xCB1\x99\x10\x9D\xC5\x84wu\xCE(\x13|^\x1C\xA4\x05r\x0C\xFA;\xEA=dsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static KEYDERIVER_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __BYTECODE, ); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80cb\xE4\xC4d\x14a\0;W\x80c\xA3,+\x99\x14a\0`W[`\0\x80\xFD[a\0C`\xF5\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0sa\0n6`\x04a\x02\x9EV[a\0\x81V[`@Qa\0W\x92\x91\x90a\x04CV[`\0```\0a\0\x92\x86\x86\x86a\x01\0V[\x90P`\0\x80`\xF5`\x01`\x01`\xA0\x1B\x03\x16\x83`@Qa\0\xB0\x91\x90a\x04\x7FV[`\0`@Q\x80\x83\x03\x81\x85Z\xFA\x91PP=\x80`\0\x81\x14a\0\xEBW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\0\xF0V[``\x91P[P\x90\x99\x90\x98P\x96PPPPPPPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x01\x9AW\x84\x86\x82\x81Q\x81\x10a\x011Wa\x011a\x04\x9BV[` \x02` \x01\x01Q` \x01Q\x03a\x01\x92W\x82\x86\x82\x81Q\x81\x10a\x01UWa\x01Ua\x04\x9BV[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x01r\x92\x91\x90a\x04\xB1V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x01\x8E\x90a\x04\xE0V[\x92PP[`\x01\x01a\x01\x15V[P\x83`\x02\x03a\x01\xACW`\x01\x93Pa\x01\xB9V[\x83`\x03\x03a\x01\xB9W`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x05\x8E`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x02\x10\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x05\x13V[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x9C\x9BPPPPPPPPPPPPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02hWa\x02ha\x020V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02\x96Wa\x02\x96a\x020V[`@R\x91\x90PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x02\xB3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xD0W`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x02\xE1W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xFAWa\x02\xFAa\x020V[\x80`\x05\x1Ba\x03\n` \x82\x01a\x02nV[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x03&W`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x04\nW\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03KW`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x03aW`\0\x80\xFD[a\x03ia\x02FV[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\x82W`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x03\x97W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\xB0Wa\x03\xB0a\x020V[a\x03\xC3`\x1F\x82\x01`\x1F\x19\x16` \x01a\x02nV[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x03\xD8W`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x03-V[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x04:W\x81\x81\x01Q\x83\x82\x01R` \x01a\x04\"V[PP`\0\x91\x01RV[\x82\x15\x15\x81R`@` \x82\x01R`\0\x82Q\x80`@\x84\x01Ra\x04j\x81``\x85\x01` \x87\x01a\x04\x1FV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01``\x01\x93\x92PPPV[`\0\x82Qa\x04\x91\x81\x84` \x87\x01a\x04\x1FV[\x91\x90\x91\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x83Qa\x04\xC3\x81\x84` \x88\x01a\x04\x1FV[\x83Q\x90\x83\x01\x90a\x04\xD7\x81\x83` \x88\x01a\x04\x1FV[\x01\x94\x93PPPPV[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x05\nWcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x05U\x81`)\x85\x01` \x89\x01a\x04\x1FV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x05|\x81`-\x84\x01` \x88\x01a\x04\x1FV[\x01`-\x01\x99\x98PPPPPPPPPV\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 \xB3\xF5\xD6\xAC\xD5\xA77\x13D\xCA\xCA\xB0^`py\xEB\xF4v\xB4m\x8B\x17\x04\x19a/\x80\xE7\xA8\xAC\x95dsolcC\0\x08\x1C\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80cb\xE4\xC4d\x14a\0;W\x80c\xA3,+\x99\x14a\0`W[`\0\x80\xFD[a\0C`\xF5\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0sa\0n6`\x04a\x02\x9EV[a\0\x81V[`@Qa\0W\x92\x91\x90a\x04CV[`\0```\0a\0\x92\x86\x86\x86a\x01\0V[\x90P`\0\x80`\xF5`\x01`\x01`\xA0\x1B\x03\x16\x83`@Qa\0\xB0\x91\x90a\x04\x7FV[`\0`@Q\x80\x83\x03\x81\x85Z\xFA\x91PP=\x80`\0\x81\x14a\0\xEBW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\0\xF0V[``\x91P[P\x90\x99\x90\x98P\x96PPPPPPPV[`@\x80Q`\0\x80\x82R` \x82\x01\x90\x92R``\x91\x80[\x85Q\x81\x10\x15a\x01\x9AW\x84\x86\x82\x81Q\x81\x10a\x011Wa\x011a\x04\x9BV[` \x02` \x01\x01Q` \x01Q\x03a\x01\x92W\x82\x86\x82\x81Q\x81\x10a\x01UWa\x01Ua\x04\x9BV[` \x02` \x01\x01Q`\0\x01Q`@Q` \x01a\x01r\x92\x91\x90a\x04\xB1V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92P\x81\x80a\x01\x8E\x90a\x04\xE0V[\x92PP[`\x01\x01a\x01\x15V[P\x83`\x02\x03a\x01\xACW`\x01\x93Pa\x01\xB9V[\x83`\x03\x03a\x01\xB9W`\0\x93P[`\0`@Q\x80``\x01`@R\x80`+\x81R` \x01a\x05\x8E`+\x919\x80Q`@Q\x91\x92P`\xF8\x87\x90\x1B\x91`\x01`\xE5\x1B\x91`\xE0\x90\x81\x1B\x91\x90\x86\x90\x1B\x90`\0\x90a\x02\x10\x90\x86\x90\x86\x90\x8F\x90\x87\x90\x8B\x90\x88\x90\x8F\x90` \x01a\x05\x13V[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x9C\x9BPPPPPPPPPPPPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02hWa\x02ha\x020V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x02\x96Wa\x02\x96a\x020V[`@R\x91\x90PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x02\xB3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xD0W`\0\x80\xFD[\x84\x01`\x1F\x81\x01\x86\x13a\x02\xE1W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x02\xFAWa\x02\xFAa\x020V[\x80`\x05\x1Ba\x03\n` \x82\x01a\x02nV[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x89\x84\x11\x15a\x03&W`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a\x04\nW\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03KW`\0\x80\xFD[\x85\x01`@\x81\x8C\x03`\x1F\x19\x01\x12\x15a\x03aW`\0\x80\xFD[a\x03ia\x02FV[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\x82W`\0\x80\xFD[\x82\x01` \x81\x01\x90`?\x01\x8D\x13a\x03\x97W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a\x03\xB0Wa\x03\xB0a\x020V[a\x03\xC3`\x1F\x82\x01`\x1F\x19\x16` \x01a\x02nV[\x81\x81R\x8E` \x83\x85\x01\x01\x11\x15a\x03\xD8W`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0` \x92\x82\x01\x83\x01R\x83R`@\x93\x90\x93\x015\x82\x84\x01RP\x83R\x92\x83\x01\x92\x91\x90\x91\x01\x90a\x03-V[\x96\x99\x96\x98PPPP`@\x94\x90\x94\x015\x93PPPV[`\0[\x83\x81\x10\x15a\x04:W\x81\x81\x01Q\x83\x82\x01R` \x01a\x04\"V[PP`\0\x91\x01RV[\x82\x15\x15\x81R`@` \x82\x01R`\0\x82Q\x80`@\x84\x01Ra\x04j\x81``\x85\x01` \x87\x01a\x04\x1FV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01``\x01\x93\x92PPPV[`\0\x82Qa\x04\x91\x81\x84` \x87\x01a\x04\x1FV[\x91\x90\x91\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x83Qa\x04\xC3\x81\x84` \x88\x01a\x04\x1FV[\x83Q\x90\x83\x01\x90a\x04\xD7\x81\x83` \x88\x01a\x04\x1FV[\x01\x94\x93PPPPV[`\0c\xFF\xFF\xFF\xFF\x82\x16c\xFF\xFF\xFF\xFF\x81\x03a\x05\nWcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01\x01\x92\x91PPV[`\x01`\x01`\xF8\x1B\x03\x19\x88\x16\x81R`\x01`\x01`\xE0\x1B\x03\x19\x87\x81\x16`\x01\x83\x01R`\x05\x82\x01\x87\x90R\x85\x16`%\x82\x01R\x83Q`\0\x90a\x05U\x81`)\x85\x01` \x89\x01a\x04\x1FV[`\x01`\x01`\xE0\x1B\x03\x19\x85\x16`)\x91\x84\x01\x91\x82\x01R\x83Qa\x05|\x81`-\x84\x01` \x88\x01a\x04\x1FV[\x01`-\x01\x99\x98PPPPPPPPPV\xFELIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_\xA2dipfsX\"\x12 ].\x87\x92D\x05\xC7Z7\xCB1\x99\x10\x9D\xC5\x84wu\xCE(\x13|^\x1C\xA4\x05r\x0C\xFA;\xEA=dsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static KEYDERIVER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __DEPLOYED_BYTECODE, diff --git a/rust/lit-core/lit-blockchain/src/contracts/mod.rs b/rust/lit-core/lit-blockchain/src/contracts/mod.rs index 4f4047d6..c2fb8c1e 100644 --- a/rust/lit-core/lit-blockchain/src/contracts/mod.rs +++ b/rust/lit-core/lit-blockchain/src/contracts/mod.rs @@ -9,6 +9,7 @@ use ethers::providers::Provider; use lit_core::config::LitConfig; +use crate::SignerProvider; use crate::config::LitBlockchainConfig; use crate::contracts::allowlist::Allowlist; use crate::contracts::backup_recovery::BackupRecovery; @@ -103,6 +104,7 @@ pub const RELEASE_REGISTER_CONTRACT: &str = "RELEASE_REGISTER"; pub const MULTI_SENDER_CONTRACT: &str = "MULTI_SENDER"; pub const LIT_TOKEN_CONTRACT: &str = "LIT_TOKEN"; pub const PUB_KEY_ROUTER_CONTRACT: &str = "PUB_KEY_ROUTER"; +pub const PUB_KEY_ROUTER_VIEWS_CONTRACT: &str = "PUB_KEY_ROUTER_VIEWS"; pub const PKP_NFT_CONTRACT: &str = "PKP_NFT"; pub const RATE_LIMIT_NFT_CONTRACT: &str = "RATE_LIMIT_NFT"; pub const PKP_HELPER_CONTRACT: &str = "PKP_HELPER"; @@ -124,25 +126,19 @@ impl Staking> { } } -impl Staking>, Wallet>> { +impl Staking { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(Staking::new(address, default_local_client(cfg, wallet_key)?)) } } -impl - Staking>, Wallet>>> -{ +impl Staking> { pub(crate) fn load_with_gas_relay( cfg: &LitConfig, address: H160, forwarder_address: H160, gas_relayer_wallet_key: Option<&str>, meta_signer_key: impl Into, - ) -> Result< - Staking< - EIP2771GasRelayerMiddleware>, Wallet>>, - >, - > { + ) -> Result>> { let chain = cfg.blockchain_chain_name()?; let provider = ENDPOINT_MANAGER.get_provider(chain.as_str())?; let meta_signer = meta_signer_key.into(); @@ -169,10 +165,10 @@ impl BackupRecovery> { } } -impl BackupRecovery>, Wallet>> { +impl BackupRecovery { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(BackupRecovery::new(address, default_local_client(cfg, wallet_key)?)) } } @@ -186,25 +182,19 @@ impl Ledger> { } } -impl Ledger>, Wallet>> { +impl Ledger { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(Ledger::new(address, default_local_client(cfg, wallet_key)?)) } } -impl - Ledger>, Wallet>>> -{ +impl Ledger> { pub(crate) fn load_with_gas_relay( cfg: &LitConfig, address: H160, forwarder_address: H160, gas_relayer_wallet_key: Option<&str>, meta_signer_key: impl Into, - ) -> Result< - Ledger< - EIP2771GasRelayerMiddleware>, Wallet>>, - >, - > { + ) -> Result>> { let chain = cfg.blockchain_chain_name()?; let provider = ENDPOINT_MANAGER.get_provider(chain.as_str())?; let meta_signer = meta_signer_key.into(); @@ -231,10 +221,10 @@ impl ContractResolver> { } } -impl ContractResolver>, Wallet>> { +impl ContractResolver { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(ContractResolver::new(address, default_local_client(cfg, wallet_key)?)) } } @@ -247,10 +237,10 @@ impl ReleaseRegister> { } } -impl ReleaseRegister>, Wallet>> { +impl ReleaseRegister { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(ReleaseRegister::new(address, default_local_client(cfg, wallet_key)?)) } } @@ -263,10 +253,10 @@ impl Multisender> { } } -impl Multisender>, Wallet>> { +impl Multisender { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(Multisender::new(address, default_local_client(cfg, wallet_key)?)) } } @@ -279,10 +269,10 @@ impl LITToken> { } } -impl LITToken>, Wallet>> { +impl LITToken { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(LITToken::new(address, default_local_client(cfg, wallet_key)?)) } } @@ -295,27 +285,19 @@ impl PubkeyRouter> { } } -impl PubkeyRouter>, Wallet>> { +impl PubkeyRouter { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(PubkeyRouter::new(address, default_local_client(cfg, wallet_key)?)) } } -impl - PubkeyRouter< - EIP2771GasRelayerMiddleware>, Wallet>>, - > -{ +impl PubkeyRouter> { pub(crate) fn load_with_gas_relay( cfg: &LitConfig, address: H160, forwarder_address: H160, gas_relayer_wallet_key: Option<&str>, meta_signer_key: impl Into, - ) -> Result< - PubkeyRouter< - EIP2771GasRelayerMiddleware>, Wallet>>, - >, - > { + ) -> Result>> { let chain = cfg.blockchain_chain_name()?; let provider = ENDPOINT_MANAGER.get_provider(chain.as_str())?; let meta_signer = meta_signer_key.into(); @@ -342,25 +324,19 @@ impl PKPNFT> { } } -impl PKPNFT>, Wallet>> { +impl PKPNFT { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(PKPNFT::new(address, default_local_client(cfg, wallet_key)?)) } } -impl - PKPNFT>, Wallet>>> -{ +impl PKPNFT> { pub(crate) fn load_with_gas_relay( cfg: &LitConfig, address: H160, forwarder_address: H160, gas_relayer_wallet_key: Option<&str>, meta_signer_key: impl Into, - ) -> Result< - PKPNFT< - EIP2771GasRelayerMiddleware>, Wallet>>, - >, - > { + ) -> Result>> { let chain = cfg.blockchain_chain_name()?; let provider = ENDPOINT_MANAGER.get_provider(chain.as_str())?; let meta_signer = meta_signer_key.into(); @@ -389,10 +365,10 @@ impl PKPHelper> { } } -impl PKPHelper>, Wallet>> { +impl PKPHelper { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(PKPHelper::new(address, default_local_client(cfg, wallet_key)?)) } } @@ -405,27 +381,19 @@ impl PKPPermissions> { } } -impl PKPPermissions>, Wallet>> { +impl PKPPermissions { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(PKPPermissions::new(address, default_local_client(cfg, wallet_key)?)) } } -impl - PKPPermissions< - EIP2771GasRelayerMiddleware>, Wallet>>, - > -{ +impl PKPPermissions> { pub(crate) fn load_with_gas_relay( cfg: &LitConfig, address: H160, forwarder_address: H160, gas_relayer_wallet_key: Option<&str>, meta_signer_key: impl Into, - ) -> Result< - PKPPermissions< - EIP2771GasRelayerMiddleware>, Wallet>>, - >, - > { + ) -> Result>> { let chain = cfg.blockchain_chain_name()?; let provider = ENDPOINT_MANAGER.get_provider(chain.as_str())?; let meta_signer = meta_signer_key.into(); @@ -452,10 +420,10 @@ impl PKPNFTMetadata> { } } -impl PKPNFTMetadata>, Wallet>> { +impl PKPNFTMetadata { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(PKPNFTMetadata::new(address, default_local_client(cfg, wallet_key)?)) } } @@ -468,10 +436,10 @@ impl Allowlist> { } } -impl Allowlist>, Wallet>> { +impl Allowlist { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(Allowlist::new(address, default_local_client(cfg, wallet_key)?)) } } @@ -486,10 +454,10 @@ impl PaymentDelegation> { } } -impl PaymentDelegation>, Wallet>> { +impl PaymentDelegation { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(PaymentDelegation::new(address, default_local_client(cfg, wallet_key)?)) } } @@ -502,27 +470,19 @@ impl PriceFeed> { } } -impl PriceFeed>, Wallet>> { +impl PriceFeed { pub(crate) fn load_with_signer( cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Ok(PriceFeed::new(address, default_local_client(cfg, wallet_key)?)) } } -impl - PriceFeed< - EIP2771GasRelayerMiddleware>, Wallet>>, - > -{ +impl PriceFeed> { pub(crate) fn load_with_gas_relay( cfg: &LitConfig, address: H160, forwarder_address: H160, gas_relayer_wallet_key: Option<&str>, meta_signer_key: impl Into, - ) -> Result< - PriceFeed< - EIP2771GasRelayerMiddleware>, Wallet>>, - >, - > { + ) -> Result>> { let chain = cfg.blockchain_chain_name()?; let provider = ENDPOINT_MANAGER.get_provider(chain.as_str())?; let meta_signer = meta_signer_key.into(); @@ -567,7 +527,7 @@ pub fn load_wallet(cfg: &LitConfig, wallet_key: Option<&str>) -> Result, -) -> Result>, Wallet>>> { +) -> Result> { let chain = cfg.blockchain_chain_name()?; let wallet = load_wallet(cfg, wallet_key)?; let provider = ENDPOINT_MANAGER.get_provider(chain.as_str())?; diff --git a/rust/lit-core/lit-blockchain/src/contracts/pkp_helper.rs b/rust/lit-core/lit-blockchain/src/contracts/pkp_helper.rs index a354d6bb..730251c9 100644 --- a/rust/lit-core/lit-blockchain/src/contracts/pkp_helper.rs +++ b/rust/lit-core/lit-blockchain/src/contracts/pkp_helper.rs @@ -1416,13 +1416,13 @@ pub mod pkp_helper { __abi, ); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa:v8\x03\x80a:v\x839\x81\x01`@\x81\x90Ra\0/\x91a\0\xD5V[a\083a\0\x85V[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x84\x16`\x01`\x01`\xA0\x1B\x03\x19\x82\x16\x81\x17\x83U\x83\x92\x91`\x01`\x01`\xA8\x1B\x03\x19\x16\x17`\x01`\xA0\x1B\x83\x83\x81\x11\x15a\0yWa\0ya\x01\x1FV[\x02\x17\x90UPPPa\x015V[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[`\0\x80`@\x83\x85\x03\x12\x15a\0\xE8W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\0\xFFW`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x03\x81\x10a\x01\x14W`\0\x80\xFD[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[a92\x80a\x01D`\09`\0\xF3\xFE`\x80`@R`\x046\x10a\x01LW`\x005`\xE0\x1C\x80cs\xCCA\x11\x11a\0\xBCW\x80cs\xCCA\x11\x14a\x02\xF6W\x80cw\x8F\xE5r\x14a\x03\x0BW\x80cx..\xA5\x14a\x03\x1EW\x80c\x8D\xA5\xCB[\x14a\x03>W\x80c\x91\xD1HT\x14a\x03SW\x80c\x91\xEEO\xD5\x14a\x03sW\x80c\x9D\xCA\x002\x14a\x03\x86W\x80c\xA2\x17\xFD\xDF\x14a\x03\xB4W\x80c\xCA\xEA\xD0\xC7\x14a\x03\xC9W\x80c\xD5Gt\x1F\x14a\x03\xDEW\x80c\xDB\x0B\xF93\x14a\x03\xFEW\x80c\xE4\xF1\x1D\xF6\x14a\x04\x11W\x80c\xF2\xFD\xE3\x8B\x14a\x04$W\x80c\xF9]q\xB1\x14a\x04DW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01QW\x80c\x0E\x9E\xD6\x8B\x14a\x01\x86W\x80c\x13\xAFA\x1B\x14a\x01\xA8W\x80c\x15\x0Bz\x02\x14a\x01\xC9W\x80c /rO\x14a\x02\x02W\x80c$\x8A\x9C\xA3\x14a\x02\x15W\x80c+U5Q\x14a\x025W\x80c//\xF1]\x14a\x02WW\x80c2vU\x8C\x14a\x02wW\x80c6V\x8A\xBE\x14a\x02\x8CW\x80cPC\x02l\x14a\x02\xACW\x80cP\xD1{^\x14a\x02\xC1W\x80cqP\x18\xA6\x14a\x02\xE1W[`\0\x80\xFD[4\x80\x15a\x01]W`\0\x80\xFD[Pa\x01qa\x01l6`\x04a%\x98V[a\x04dV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x92W`\0\x80\xFD[Pa\x01\x9Ba\x04\x9BV[`@Qa\x01}\x91\x90a%\xC2V[a\x01\xBBa\x01\xB66`\x04a+\x84V[a\x05\x86V[`@Q\x90\x81R` \x01a\x01}V[4\x80\x15a\x01\xD5W`\0\x80\xFD[Pa\x01\xE9a\x01\xE46`\x04a,2V[a\x06\x03V[`@Q`\x01`\x01`\xE0\x1B\x03\x19\x90\x91\x16\x81R` \x01a\x01}V[a\x01\xBBa\x02\x106`\x04a+\x84V[a\x06\xA7V[4\x80\x15a\x02!W`\0\x80\xFD[Pa\x01\xBBa\x0206`\x04a,\xD1V[a\x06\xBAV[4\x80\x15a\x02AW`\0\x80\xFD[Pa\x02Ua\x02P6`\x04a,\xD1V[a\x06\xD0V[\0[4\x80\x15a\x02cW`\0\x80\xFD[Pa\x02Ua\x02r6`\x04a,\xEAV[a\x08\xABV[4\x80\x15a\x02\x83W`\0\x80\xFD[Pa\x01\x9Ba\x08\xCCV[4\x80\x15a\x02\x98W`\0\x80\xFD[Pa\x02Ua\x02\xA76`\x04a,\xEAV[a\t\x1EV[4\x80\x15a\x02\xB8W`\0\x80\xFD[Pa\x01\x9Ba\t\x9CV[4\x80\x15a\x02\xCDW`\0\x80\xFD[P`\x02Ta\x01\x9B\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x02\xEDW`\0\x80\xFD[Pa\x02Ua\t\xEEV[4\x80\x15a\x03\x02W`\0\x80\xFD[Pa\x01\x9Ba\n\x02V[a\x01\xBBa\x03\x196`\x04a-:V[a\nTV[4\x80\x15a\x03*W`\0\x80\xFD[Pa\x02Ua\x0396`\x04a/\xB8V[a\x10fV[4\x80\x15a\x03JW`\0\x80\xFD[Pa\x01\x9Ba\x12\x89V[4\x80\x15a\x03_W`\0\x80\xFD[Pa\x01qa\x03n6`\x04a,\xEAV[a\x12\x98V[a\x01\xBBa\x03\x816`\x04a/\xF4V[a\x12\xC3V[4\x80\x15a\x03\x92W`\0\x80\xFD[P`\x02Ta\x03\xA7\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\x01}\x91\x90a0\xF0V[4\x80\x15a\x03\xC0W`\0\x80\xFD[Pa\x01\xBB`\0\x81V[4\x80\x15a\x03\xD5W`\0\x80\xFD[Pa\x01\x9Ba\x19eV[4\x80\x15a\x03\xEAW`\0\x80\xFD[Pa\x02Ua\x03\xF96`\x04a,\xEAV[a\x19\xB7V[a\x01\xBBa\x04\x0C6`\x04a0\xFEV[a\x19\xD3V[a\x01\xBBa\x04\x1F6`\x04a2;V[a\x1F\xDDV[4\x80\x15a\x040W`\0\x80\xFD[Pa\x02Ua\x04?6`\x04a3MV[a!0V[4\x80\x15a\x04PW`\0\x80\xFD[Pa\x02Ua\x04_6`\x04a3MV[a!\xA9V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x04\x95WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\x02T`@\x80Qc\xDA\x19\xDD\xFB`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\xDA\x19\xDD\xFB\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x11\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x05@\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05]W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x81\x91\x90a3\x97V[\x90P\x90V[`\0\x80`@Q\x80`\xA0\x01`@R\x80\x85`\0\x01Q\x81R` \x01`@Q\x80`@\x01`@R\x80`\x0C\x81R` \x01knaga-keyset1`\xA0\x1B\x81RP\x81R` \x01\x85` \x01Q\x81R` \x01\x85`@\x01Q\x81R` \x01a\x05\xE4a\x04\x9BV[`\x01`\x01`\xA0\x1B\x03\x16\x90R\x90Pa\x05\xFB\x81\x84a\x12\xC3V[\x94\x93PPPPV[`\0a\x06\ra\x19eV[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x95W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`:`$\x82\x01R\x7FPKPHelper: only accepts transfer`D\x82\x01Ry\x1C\xC8\x19\x9C\x9B\xDBH\x1D\x1A\x19H\x14\x12\xD4\x13\x91\x95\x08\x18\xDB\xDB\x9D\x1C\x98X\xDD`2\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[Pc\n\x85\xBD\x01`\xE1\x1B\x95\x94PPPPPV[`\0a\x06\xB3\x83\x83a\x05\x86V[\x93\x92PPPV[`\0\x90\x81R`\x01` \x81\x90R`@\x90\x91 \x01T\x90V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07\"W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07F\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07u\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\x92W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xB6\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x07\xE6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x07\xF0a\t\x9CV[`@Qc\xB6:vw`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R\x90\x91P`\x01`\x01`\xA0\x1B\x03\x82\x16\x90c\xB6:vw\x90`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x085W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08IW=`\0\x80>=`\0\xFD[PP`@Qc(\xCD\x10\xC7`\xE1\x1B\x81R`\x04\x81\x01\x85\x90R`\x01`\x01`\xA0\x1B\x03\x84\x16\x92PcQ\x9A!\x8E\x91P`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x08\x8FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08\xA3W=`\0\x80>=`\0\xFD[PPPPPPV[a\x08\xB4\x82a\x06\xBAV[a\x08\xBD\x81a\"\x07V[a\x08\xC7\x83\x83a\"\x11V[PPPV[`\x02T`@\x80Qc\x12\x0E_\x07`\xE3\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x90r\xF88\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\t\x8EW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a\t\x98\x82\x82a\"|V[PPV[`\x02T`@\x80Qc\x16\xF7k\xBF`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x16\xF7k\xBF\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\t\xF6a\"\xE3V[a\n\0`\0a#BV[V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\0\x80a\n_a\x19eV[\x83Q` \x85\x01Q`@Qc?\xF8\x06\x97`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x92c\x7F\xF0\r.\x924\x92a\n\x94\x92`\x04\x01a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\n\xB2W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n\xD7\x91\x90a3jV[\x90P\x82``\x01QQ\x83`@\x01QQ\x14a\x0B\x02W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x82`\xA0\x01QQ\x83`\x80\x01QQ\x14a\x0B+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x82`\xE0\x01QQ\x83`\xC0\x01QQ\x14a\x0BTW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x82a\x01\0\x01QQ\x83`\xC0\x01QQ\x14a\x0B~W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x82a\x01 \x01QQ\x83`\xC0\x01QQ\x14a\x0B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[`@\x83\x01QQ\x15a\x0CtW`\0[\x83`@\x01QQ\x81\x10\x15a\x0CrWa\x0B\xCBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x86`@\x01Q\x84\x81Q\x81\x10a\x0B\xF0Wa\x0B\xF0a6'V[` \x02` \x01\x01Q\x87``\x01Q\x85\x81Q\x81\x10a\x0C\x0EWa\x0C\x0Ea6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0C4\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0CNW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0CbW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0B\xB6\x90PV[P[`\x80\x83\x01QQ\x15a\r@W`\0[\x83`\x80\x01QQ\x81\x10\x15a\r>Wa\x0C\x97a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x86`\x80\x01Q\x84\x81Q\x81\x10a\x0C\xBCWa\x0C\xBCa6'V[` \x02` \x01\x01Q\x87`\xA0\x01Q\x85\x81Q\x81\x10a\x0C\xDAWa\x0C\xDAa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\0\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\x1AW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r.W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0C\x82\x90PV[P[`\xC0\x83\x01QQ\x15a\x0EbW`\0[\x83`\xC0\x01QQ\x81\x10\x15a\x0E`Wa\rca\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x88`\xC0\x01Q\x86\x81Q\x81\x10a\r\x93Wa\r\x93a6'V[` \x02` \x01\x01Q\x81R` \x01\x88`\xE0\x01Q\x86\x81Q\x81\x10a\r\xB6Wa\r\xB6a6'V[` \x02` \x01\x01Q\x81R` \x01\x88a\x01\0\x01Q\x86\x81Q\x81\x10a\r\xDAWa\r\xDAa6'V[` \x02` \x01\x01Q\x81RP\x87a\x01 \x01Q\x85\x81Q\x81\x10a\r\xFCWa\r\xFCa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\"\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0E=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\rN\x90PV[P[`\0a\x0Ela\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\x99\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E\xB6W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xDA\x91\x90a3\x97V[\x90P\x83a\x01@\x01Q\x15a\x0F|Wa\x0E\xEFa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0F*W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0FI\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0FcW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0FwW=`\0\x80>=`\0\xFD[PPPP[\x83a\x01`\x01Q\x15a\x0F\xF5Wa\x0F\x8Fa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\xBE\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0F\xD8W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F\xECW=`\0\x80>=`\0\xFD[PPPPa\x10_V[a\x0F\xFDa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x10,\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x10FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x10ZW=`\0\x80>=`\0\xFD[PPPP[P\x92\x91PPV[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x10\xB8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10\xDC\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x11\x0B\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11(W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11L\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x11|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x11\x86a\t\x9CV[\x82Q\x90\x91P\x15a\x08\xC7W\x80`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x84\x84`\0\x81Q\x81\x10a\x11\xB3Wa\x11\xB3a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x11\xD8\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x11\xF2W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x06W=`\0\x80>=`\0\xFD[PPPP\x80`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x84\x84`\x01\x81Q\x81\x10a\x12-Wa\x12-a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x12R\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x12lW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x80W=`\0\x80>=`\0\xFD[PPPPPPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\0\x91\x82R`\x01` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[\x80Q\x82Q`\0\x91\x14a\x13=W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`>`$\x82\x01R\x7FPKPHelper: Claim key type must m`D\x82\x01R\x7Fatch Auth Method data key type\0\0`d\x82\x01R`\x84\x01a\x06\x8CV[`\x01`\0a\x13Ia\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cq\xAA\x9A\xCF4\x84\x88`\0\x01Q\x89` \x01Q\x8A`@\x01Q\x8B``\x01Q\x8C`\x80\x01Q`@Q\x88c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\x93\x96\x95\x94\x93\x92\x91\x90a7cV[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x13\xB1W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xD6\x91\x90a3jV[\x90P\x83`@\x01QQ\x84` \x01QQ\x14a\x14\x01W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x83`\x80\x01QQ\x84``\x01QQ\x14a\x14*W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x83`\xC0\x01QQ\x84`\xA0\x01QQ\x14a\x14SW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x83`\xE0\x01QQ\x84`\xA0\x01QQ\x14a\x14|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x83a\x01\0\x01QQ\x84`\xA0\x01QQ\x14a\x14\xA6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[` \x84\x01QQ\x15a\x15rW`\0[\x84` \x01QQ\x81\x10\x15a\x15pWa\x14\xC9a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x87` \x01Q\x84\x81Q\x81\x10a\x14\xEEWa\x14\xEEa6'V[` \x02` \x01\x01Q\x88`@\x01Q\x85\x81Q\x81\x10a\x15\x0CWa\x15\x0Ca6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x152\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x15LW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x15`W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x14\xB4\x90PV[P[``\x84\x01QQ\x15a\x16>W`\0[\x84``\x01QQ\x81\x10\x15a\x16=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x15\x80\x90PV[P[`\xA0\x84\x01QQ\x15a\x17_W`\0[\x84`\xA0\x01QQ\x81\x10\x15a\x17]Wa\x16aa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x89`\xA0\x01Q\x86\x81Q\x81\x10a\x16\x91Wa\x16\x91a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xC0\x01Q\x86\x81Q\x81\x10a\x16\xB4Wa\x16\xB4a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xE0\x01Q\x86\x81Q\x81\x10a\x16\xD7Wa\x16\xD7a6'V[` \x02` \x01\x01Q\x81RP\x88a\x01\0\x01Q\x85\x81Q\x81\x10a\x16\xF9Wa\x16\xF9a6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x1F\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x179W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x17MW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x16L\x90PV[P[`\0a\x17ia\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x96\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\xB3W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17\xD7\x91\x90a3\x97V[\x90P\x84a\x01 \x01Q\x15a\x18yWa\x17\xECa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x18'W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18F\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18`W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18tW=`\0\x80>=`\0\xFD[PPPP[\x84a\x01@\x01Q\x15a\x18\xF2Wa\x18\x8Ca\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18\xBB\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18\xD5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18\xE9W=`\0\x80>=`\0\xFD[PPPPa\x19\\V[a\x18\xFAa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x19)\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x19CW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x19WW=`\0\x80>=`\0\xFD[PPPP[P\x94\x93PPPPV[`\x02T`@\x80Qc,\x0B\x8B\xF7`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c,\x0B\x8B\xF7\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\x19\xC0\x82a\x06\xBAV[a\x19\xC9\x81a\"\x07V[a\x08\xC7\x83\x83a\"|V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x1A%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1AI\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x1Ax\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1A\x95W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1A\xB9\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x1A\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x1A\xF3a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16c\x7F\xF0\r.4\x8D\x8D`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1B!\x92\x91\x90a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x1B?W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1Bd\x91\x90a3jV[\x90P\x87Q\x89Q\x14a\x1B\x87W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x86Q\x89Q\x14a\x1B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x85Q\x89Q\x14a\x1B\xC9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[\x88Q\x15a\x1C\xD1W`\0[\x89Q\x81\x10\x15a\x1C\xCFWa\x1B\xE4a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x8E\x86\x81Q\x81\x10a\x1C\x10Wa\x1C\x10a6'V[` \x02` \x01\x01Q\x81R` \x01\x8D\x86\x81Q\x81\x10a\x1C/Wa\x1C/a6'V[` \x02` \x01\x01Q\x81R` \x01\x8C\x86\x81Q\x81\x10a\x1CNWa\x1CNa6'V[` \x02` \x01\x01Q\x81RP\x8A\x85\x81Q\x81\x10a\x1CkWa\x1Cka6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\x91\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1C\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1C\xBFW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x1B\xD3\x90PV[P[`\0a\x1C\xDBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\x08\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1D%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1DI\x91\x90a3\x97V[\x90P\x84\x15a\x1D\xE6Wa\x1DYa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x1D\x94W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\xB3\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1D\xCDW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1D\xE1W=`\0\x80>=`\0\xFD[PPPP[\x83\x15a\x1EZWa\x1D\xF4a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E#\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E=W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1EQW=`\0\x80>=`\0\xFD[PPPPa\x1E\xC4V[a\x1Eba\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E\x91\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1E\xBFW=`\0\x80>=`\0\xFD[PPPP[\x85Q\x15a\x1F\xCEWa\x1E\xD3a\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x83\x88`\0\x81Q\x81\x10a\x1E\xF5Wa\x1E\xF5a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x1A\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F4W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1FHW=`\0\x80>=`\0\xFD[PPPPa\x1FTa\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x83\x88`\x01\x81Q\x81\x10a\x1FvWa\x1Fva6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x9B\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F\xB5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1F\xC9W=`\0\x80>=`\0\xFD[PPPP[P\x9A\x99PPPPPPPPPPV[`\0\x80`@Q\x80a\x01\x80\x01`@R\x80\x8B\x81R` \x01\x8A\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x81\x11\x15a \x11Wa \x11a%\xD6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a DW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a /W\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \x7FW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a jW\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xB0W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xEBW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a \xD6W\x90P[P\x81R` \x01\x89\x81R` \x01\x88\x81R` \x01\x87\x81R` \x01\x86\x81R` \x01\x85\x15\x15\x81R` \x01\x84\x15\x15\x81RP\x90Pa!\"\x81a\nTV[\x9A\x99PPPPPPPPPPV[a!8a\"\xE3V[`\x01`\x01`\xA0\x1B\x03\x81\x16a!\x9DW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`&`$\x82\x01R\x7FOwnable: new owner is the zero a`D\x82\x01Reddress`\xD0\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a!\xA6\x81a#BV[PV[a!\xB1a\"\xE3V[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x17\x90U`@Q\x7F'`\x07<|\xD8\xCA\xC51\xD7\xF6C\xBE\xCB\xFB\xB7M\x8B\x81VD>\xAC\xF8yb%2\xDB\xBB<\xD5\x90a!\xFC\x90\x83\x90a%\xC2V[`@Q\x80\x91\x03\x90\xA1PV[a!\xA6\x813a#\x92V[a\"\x1B\x82\x82a\x12\x98V[a\t\x98W`\0\x82\x81R`\x01` \x81\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x86\x16\x80\x86R\x92R\x80\x84 \x80T`\xFF\x19\x16\x90\x93\x17\x90\x92U\x90Q3\x92\x85\x91\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r\x91\x90\xA4PPV[a\"\x86\x82\x82a\x12\x98V[\x15a\t\x98W`\0\x82\x81R`\x01` \x90\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[3a\"\xECa\x12\x89V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\n\0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FOwnable: caller is not the owner`D\x82\x01R`d\x01a\x06\x8CV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[a#\x9C\x82\x82a\x12\x98V[a\t\x98Wa#\xA9\x81a#\xEBV[a#\xB4\x83` a#\xFDV[`@Q` \x01a#\xC5\x92\x91\x90a8\x03V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x06\x8C\x91`\x04\x01a8rV[``a\x04\x95`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a$\x0C\x83`\x02a8\x9BV[a$\x17\x90`\x02a8\xB2V[`\x01`\x01`@\x1B\x03\x81\x11\x15a$.Wa$.a%\xD6V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a$XW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a$sWa$sa6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a$\xA2Wa$\xA2a6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a$\xC6\x84`\x02a8\x9BV[a$\xD1\x90`\x01a8\xB2V[\x90P[`\x01\x81\x11\x15a%IWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a%\x05Wa%\x05a6'V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a%\x1BWa%\x1Ba6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a%B\x81a8\xC5V[\x90Pa$\xD4V[P\x83\x15a\x06\xB3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x06\x8CV[`\0` \x82\x84\x03\x12\x15a%\xAAW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x06\xB3W`\0\x80\xFD[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@R\x90V[`@Qa\x01`\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Qa\x01\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\xA4Wa&\xA4a%\xD6V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a&\xC5Wa&\xC5a%\xD6V[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a&\xE0W`\0\x80\xFD[\x815a&\xF3a&\xEE\x82a&\xACV[a&|V[\x80\x82\x82R` \x82\x01\x91P` ``\x84\x02\x86\x01\x01\x92P\x85\x83\x11\x15a'\x15W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW``\x81\x88\x03\x12\x15a'2W`\0\x80\xFD[a':a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\xFF\x81\x16\x81\x14a'\\W`\0\x80\xFD[`@\x82\x01R\x83R` \x90\x92\x01\x91``\x01a'\x1AV[P\x95\x94PPPPPV[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a'\x95Wa'\x95a%\xD6V[P`\x1F\x83\x01`\x1F\x19\x16` \x01a'\xAA\x81a&|V[\x91PP\x82\x81R\x83\x83\x83\x01\x11\x15a'\xBFW`\0\x80\xFD[\x82\x82` \x83\x017`\0` \x84\x83\x01\x01R\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a'\xE7W`\0\x80\xFD[\x815a'\xF5a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\x17W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a(:W`\0\x80\xFD[\x86\x01`?\x81\x01\x88\x13a(KW`\0\x80\xFD[a(]\x88` \x83\x015`@\x84\x01a'{V[\x84RP` \x92\x83\x01\x92\x01a(\x1CV[`\0\x82`\x1F\x83\x01\x12a(}W`\0\x80\xFD[\x815a(\x8Ba&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\xADW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805\x83R` \x92\x83\x01\x92\x01a(\xB2V[`\0\x82`\x1F\x83\x01\x12a(\xDBW`\0\x80\xFD[\x815a(\xE9a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\x0BW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a).W`\0\x80\xFD[a)=\x88` \x83\x8A\x01\x01a(lV[\x84RP` \x92\x83\x01\x92\x01a)\x10V[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a!\xA6W`\0\x80\xFD[`\0\x82`\x1F\x83\x01\x12a)rW`\0\x80\xFD[\x815a)\x80a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\xA2W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805a)\xBA\x81a)LV[\x83R` \x92\x83\x01\x92\x01a)\xA7V[\x805\x80\x15\x15\x81\x14a)\xD8W`\0\x80\xFD[\x91\x90PV[`\0a\x01`\x82\x84\x03\x12\x15a)\xF0W`\0\x80\xFD[a)\xF8a&\x14V[\x825\x81R\x90P` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x17W`\0\x80\xFD[a*#\x84\x82\x85\x01a'\xD6V[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*BW`\0\x80\xFD[a*N\x84\x82\x85\x01a(\xCAV[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*mW`\0\x80\xFD[a*y\x84\x82\x85\x01a)aV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x98W`\0\x80\xFD[a*\xA4\x84\x82\x85\x01a(\xCAV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xC3W`\0\x80\xFD[a*\xCF\x84\x82\x85\x01a(lV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xEEW`\0\x80\xFD[a*\xFA\x84\x82\x85\x01a'\xD6V[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\x19W`\0\x80\xFD[a+%\x84\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+EW`\0\x80\xFD[a+Q\x84\x82\x85\x01a(\xCAV[a\x01\0\x83\x01RPa+ea\x01 \x83\x01a)\xC8V[a\x01 \x82\x01Ra+xa\x01@\x83\x01a)\xC8V[a\x01@\x82\x01R\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15a+\x97W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xADW`\0\x80\xFD[\x83\x01``\x81\x86\x03\x12\x15a+\xBFW`\0\x80\xFD[a+\xC7a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xEEW`\0\x80\xFD[a+\xFA\x87\x82\x85\x01a&\xCFV[`@\x83\x01RP\x92PP` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[a,(\x85\x82\x86\x01a)\xDDV[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80`\0`\x80\x86\x88\x03\x12\x15a,JW`\0\x80\xFD[\x855a,U\x81a)LV[\x94P` \x86\x015a,e\x81a)LV[\x93P`@\x86\x015\x92P``\x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x87W`\0\x80\xFD[\x86\x01`\x1F\x81\x01\x88\x13a,\x98W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a,\xAEW`\0\x80\xFD[\x88` \x82\x84\x01\x01\x11\x15a,\xC0W`\0\x80\xFD[\x95\x98\x94\x97P\x92\x95PPP` \x01\x91\x90V[`\0` \x82\x84\x03\x12\x15a,\xE3W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a,\xFDW`\0\x80\xFD[\x825\x91P` \x83\x015a-\x0F\x81a)LV[\x80\x91PP\x92P\x92\x90PV[`\0\x82`\x1F\x83\x01\x12a-+W`\0\x80\xFD[a\x06\xB3\x83\x835` \x85\x01a'{V[`\0` \x82\x84\x03\x12\x15a-LW`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a-bW`\0\x80\xFD[\x82\x01a\x01\x80\x81\x85\x03\x12\x15a-uW`\0\x80\xFD[a-}a&7V[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\x9AW`\0\x80\xFD[a-\xA6\x86\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xC5W`\0\x80\xFD[a-\xD1\x86\x82\x85\x01a'\xD6V[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xF0W`\0\x80\xFD[a-\xFC\x86\x82\x85\x01a(\xCAV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x1BW`\0\x80\xFD[a.'\x86\x82\x85\x01a)aV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.FW`\0\x80\xFD[a.R\x86\x82\x85\x01a(\xCAV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.qW`\0\x80\xFD[a.}\x86\x82\x85\x01a(lV[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x9CW`\0\x80\xFD[a.\xA8\x86\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xC8W`\0\x80\xFD[a.\xD4\x86\x82\x85\x01a'\xD6V[a\x01\0\x83\x01RPa\x01 \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xF5W`\0\x80\xFD[a/\x01\x86\x82\x85\x01a(\xCAV[a\x01 \x83\x01RPa/\x15a\x01@\x83\x01a)\xC8V[a\x01@\x82\x01Ra/(a\x01`\x83\x01a)\xC8V[a\x01`\x82\x01R\x94\x93PPPPV[`\0\x82`\x1F\x83\x01\x12a/GW`\0\x80\xFD[\x815a/Ua&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a/wW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a/\x9AW`\0\x80\xFD[a/\xA9\x88` \x83\x8A\x01\x01a-\x1AV[\x84RP` \x92\x83\x01\x92\x01a/|V[`\0\x80`@\x83\x85\x03\x12\x15a/\xCBW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a/\xE8W`\0\x80\xFD[a,(\x85\x82\x86\x01a/6V[`\0\x80`@\x83\x85\x03\x12\x15a0\x07W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x1DW`\0\x80\xFD[\x83\x01`\xA0\x81\x86\x03\x12\x15a0/W`\0\x80\xFD[a07a&ZV[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0TW`\0\x80\xFD[a0`\x87\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x81\x015\x90\x82\x01R``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x89W`\0\x80\xFD[a0\x95\x87\x82\x85\x01a&\xCFV[``\x83\x01RP`\x80\x82\x015\x91Pa0\xAB\x82a)LV[`\x80\x81\x01\x91\x90\x91R\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[`\x03\x81\x10a0\xECWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x04\x95\x82\x84a0\xCEV[`\0\x80`\0\x80`\0\x80`\0\x80`\0a\x01 \x8A\x8C\x03\x12\x15a1\x1DW`\0\x80\xFD[\x895\x98P` \x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1:W`\0\x80\xFD[a1F\x8C\x82\x8D\x01a-\x1AV[\x98PP`@\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1bW`\0\x80\xFD[a1n\x8C\x82\x8D\x01a(lV[\x97PP``\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\x8AW`\0\x80\xFD[a1\x96\x8C\x82\x8D\x01a'\xD6V[\x96PP`\x80\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xB2W`\0\x80\xFD[a1\xBE\x8C\x82\x8D\x01a'\xD6V[\x95PP`\xA0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xDAW`\0\x80\xFD[a1\xE6\x8C\x82\x8D\x01a(\xCAV[\x94PP`\xC0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x02W`\0\x80\xFD[a2\x0E\x8C\x82\x8D\x01a/6V[\x93PPa2\x1D`\xE0\x8B\x01a)\xC8V[\x91Pa2,a\x01\0\x8B\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98P\x92\x95\x98V[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15a2XW`\0\x80\xFD[\x885\x97P` \x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2uW`\0\x80\xFD[a2\x81\x8B\x82\x8C\x01a-\x1AV[\x97PP`@\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x9DW`\0\x80\xFD[a2\xA9\x8B\x82\x8C\x01a(lV[\x96PP``\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xC5W`\0\x80\xFD[a2\xD1\x8B\x82\x8C\x01a'\xD6V[\x95PP`\x80\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xEDW`\0\x80\xFD[a2\xF9\x8B\x82\x8C\x01a'\xD6V[\x94PP`\xA0\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a3\x15W`\0\x80\xFD[a3!\x8B\x82\x8C\x01a(\xCAV[\x93PPa30`\xC0\x8A\x01a)\xC8V[\x91Pa3>`\xE0\x8A\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[`\0` \x82\x84\x03\x12\x15a3_W`\0\x80\xFD[\x815a\x06\xB3\x81a)LV[`\0` \x82\x84\x03\x12\x15a3|W`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xB3` \x83\x01\x84a0\xCEV[`\0` \x82\x84\x03\x12\x15a3\xA9W`\0\x80\xFD[\x81Qa\x06\xB3\x81a)LV[` \x80\x82R`Z\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rymain wallets, who are you?`0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\0[\x83\x81\x10\x15a4OW\x81\x81\x01Q\x83\x82\x01R` \x01a47V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra4p\x81` \x86\x01` \x86\x01a44V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x81R`@` \x82\x01R`\0a\x05\xFB`@\x83\x01\x84a4XV[` \x80\x82R`6\x90\x82\x01R\x7FPKPHelper: ipfs cid and scope ar`@\x82\x01Ru\x0EL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`S\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`5\x90\x82\x01R\x7FPKPHelper: address and scope arr`@\x82\x01Rt\x0C/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`[\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`;\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01Rz\r,\x84\x0C.NL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`+\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fpubkey array lengths must match\0``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fscopes array lengths must match\0``\x82\x01R`\x80\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81Q\x80\x84R` \x84\x01\x93P` \x83\x01`\0[\x82\x81\x10\x15a6oW\x81Q\x86R` \x95\x86\x01\x95\x90\x91\x01\x90`\x01\x01a6QV[P\x93\x94\x93PPPPV[\x83\x81R``` \x82\x01R`\0a6\x92``\x83\x01\x85a4XV[\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[\x96\x95PPPPPPV[\x83\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R```@\x82\x01\x81\x90R`\0\x90a6\xD8\x90\x83\x01\x84a6=V[\x95\x94PPPPPV[\x83\x81R``` \x82\x01R\x82Q``\x82\x01R`\0` \x84\x01Q```\x80\x84\x01Ra7\r`\xC0\x84\x01\x82a4XV[\x90P`@\x85\x01Q`_\x19\x84\x83\x03\x01`\xA0\x85\x01Ra7*\x82\x82a4XV[\x91PP\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x81R\x91\x90\x92\x16` \x82\x01R`@\x81\x01\x91\x90\x91R``\x01\x90V[\x86\x81R\x85` \x82\x01R`\xC0`@\x82\x01R`\0a7\x82`\xC0\x83\x01\x87a4XV[``\x83\x01\x86\x90R\x82\x81\x03`\x80\x84\x01R\x84Q\x80\x82R` \x80\x87\x01\x92\x01\x90`\0[\x81\x81\x10\x15a7\xDEW\x83Q\x80Q\x84R` \x81\x01Q` \x85\x01R`\xFF`@\x82\x01Q\x16`@\x85\x01RP``\x83\x01\x92P` \x84\x01\x93P`\x01\x81\x01\x90Pa7\xA1V[PP`\x01`\x01`\xA0\x1B\x03\x85\x16`\xA0\x85\x01R\x91Pa7\xF8\x90PV[\x97\x96PPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa85\x81`\x17\x85\x01` \x88\x01a44V[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa8f\x81`(\x84\x01` \x88\x01a44V[\x01`(\x01\x94\x93PPPPV[` \x81R`\0a\x06\xB3` \x83\x01\x84a4XV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x04\x95Wa\x04\x95a8\x85V[\x80\x82\x01\x80\x82\x11\x15a\x04\x95Wa\x04\x95a8\x85V[`\0\x81a8\xD4Wa8\xD4a8\x85V[P`\0\x19\x01\x90V\xFEPKPHelper: auth method type and \xA2dipfsX\"\x12 8)W\x80\xA3\x13\xE8\x95\xB6\xDC\xEAh\xE9\0\xA6o\x08;\xF3mzE$\xB6<\xF8\xBF#\xE4\x9Dc\rdsolcC\0\x08\x1C\x003"; + const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa:v8\x03\x80a:v\x839\x81\x01`@\x81\x90Ra\0/\x91a\0\xD5V[a\083a\0\x85V[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x84\x16`\x01`\x01`\xA0\x1B\x03\x19\x82\x16\x81\x17\x83U\x83\x92\x91`\x01`\x01`\xA8\x1B\x03\x19\x16\x17`\x01`\xA0\x1B\x83\x83\x81\x11\x15a\0yWa\0ya\x01\x1FV[\x02\x17\x90UPPPa\x015V[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[`\0\x80`@\x83\x85\x03\x12\x15a\0\xE8W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\0\xFFW`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x03\x81\x10a\x01\x14W`\0\x80\xFD[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[a92\x80a\x01D`\09`\0\xF3\xFE`\x80`@R`\x046\x10a\x01LW`\x005`\xE0\x1C\x80cs\xCCA\x11\x11a\0\xBCW\x80cs\xCCA\x11\x14a\x02\xF6W\x80cw\x8F\xE5r\x14a\x03\x0BW\x80cx..\xA5\x14a\x03\x1EW\x80c\x8D\xA5\xCB[\x14a\x03>W\x80c\x91\xD1HT\x14a\x03SW\x80c\x91\xEEO\xD5\x14a\x03sW\x80c\x9D\xCA\x002\x14a\x03\x86W\x80c\xA2\x17\xFD\xDF\x14a\x03\xB4W\x80c\xCA\xEA\xD0\xC7\x14a\x03\xC9W\x80c\xD5Gt\x1F\x14a\x03\xDEW\x80c\xDB\x0B\xF93\x14a\x03\xFEW\x80c\xE4\xF1\x1D\xF6\x14a\x04\x11W\x80c\xF2\xFD\xE3\x8B\x14a\x04$W\x80c\xF9]q\xB1\x14a\x04DW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01QW\x80c\x0E\x9E\xD6\x8B\x14a\x01\x86W\x80c\x13\xAFA\x1B\x14a\x01\xA8W\x80c\x15\x0Bz\x02\x14a\x01\xC9W\x80c /rO\x14a\x02\x02W\x80c$\x8A\x9C\xA3\x14a\x02\x15W\x80c+U5Q\x14a\x025W\x80c//\xF1]\x14a\x02WW\x80c2vU\x8C\x14a\x02wW\x80c6V\x8A\xBE\x14a\x02\x8CW\x80cPC\x02l\x14a\x02\xACW\x80cP\xD1{^\x14a\x02\xC1W\x80cqP\x18\xA6\x14a\x02\xE1W[`\0\x80\xFD[4\x80\x15a\x01]W`\0\x80\xFD[Pa\x01qa\x01l6`\x04a%\x98V[a\x04dV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x92W`\0\x80\xFD[Pa\x01\x9Ba\x04\x9BV[`@Qa\x01}\x91\x90a%\xC2V[a\x01\xBBa\x01\xB66`\x04a+\x84V[a\x05\x86V[`@Q\x90\x81R` \x01a\x01}V[4\x80\x15a\x01\xD5W`\0\x80\xFD[Pa\x01\xE9a\x01\xE46`\x04a,2V[a\x06\x03V[`@Q`\x01`\x01`\xE0\x1B\x03\x19\x90\x91\x16\x81R` \x01a\x01}V[a\x01\xBBa\x02\x106`\x04a+\x84V[a\x06\xA7V[4\x80\x15a\x02!W`\0\x80\xFD[Pa\x01\xBBa\x0206`\x04a,\xD1V[a\x06\xBAV[4\x80\x15a\x02AW`\0\x80\xFD[Pa\x02Ua\x02P6`\x04a,\xD1V[a\x06\xD0V[\0[4\x80\x15a\x02cW`\0\x80\xFD[Pa\x02Ua\x02r6`\x04a,\xEAV[a\x08\xABV[4\x80\x15a\x02\x83W`\0\x80\xFD[Pa\x01\x9Ba\x08\xCCV[4\x80\x15a\x02\x98W`\0\x80\xFD[Pa\x02Ua\x02\xA76`\x04a,\xEAV[a\t\x1EV[4\x80\x15a\x02\xB8W`\0\x80\xFD[Pa\x01\x9Ba\t\x9CV[4\x80\x15a\x02\xCDW`\0\x80\xFD[P`\x02Ta\x01\x9B\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x02\xEDW`\0\x80\xFD[Pa\x02Ua\t\xEEV[4\x80\x15a\x03\x02W`\0\x80\xFD[Pa\x01\x9Ba\n\x02V[a\x01\xBBa\x03\x196`\x04a-:V[a\nTV[4\x80\x15a\x03*W`\0\x80\xFD[Pa\x02Ua\x0396`\x04a/\xB8V[a\x10fV[4\x80\x15a\x03JW`\0\x80\xFD[Pa\x01\x9Ba\x12\x89V[4\x80\x15a\x03_W`\0\x80\xFD[Pa\x01qa\x03n6`\x04a,\xEAV[a\x12\x98V[a\x01\xBBa\x03\x816`\x04a/\xF4V[a\x12\xC3V[4\x80\x15a\x03\x92W`\0\x80\xFD[P`\x02Ta\x03\xA7\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\x01}\x91\x90a0\xF0V[4\x80\x15a\x03\xC0W`\0\x80\xFD[Pa\x01\xBB`\0\x81V[4\x80\x15a\x03\xD5W`\0\x80\xFD[Pa\x01\x9Ba\x19eV[4\x80\x15a\x03\xEAW`\0\x80\xFD[Pa\x02Ua\x03\xF96`\x04a,\xEAV[a\x19\xB7V[a\x01\xBBa\x04\x0C6`\x04a0\xFEV[a\x19\xD3V[a\x01\xBBa\x04\x1F6`\x04a2;V[a\x1F\xDDV[4\x80\x15a\x040W`\0\x80\xFD[Pa\x02Ua\x04?6`\x04a3MV[a!0V[4\x80\x15a\x04PW`\0\x80\xFD[Pa\x02Ua\x04_6`\x04a3MV[a!\xA9V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x04\x95WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\x02T`@\x80Qc\xDA\x19\xDD\xFB`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\xDA\x19\xDD\xFB\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x11\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x05@\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05]W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x81\x91\x90a3\x97V[\x90P\x90V[`\0\x80`@Q\x80`\xA0\x01`@R\x80\x85`\0\x01Q\x81R` \x01`@Q\x80`@\x01`@R\x80`\x0C\x81R` \x01knaga-keyset1`\xA0\x1B\x81RP\x81R` \x01\x85` \x01Q\x81R` \x01\x85`@\x01Q\x81R` \x01a\x05\xE4a\x04\x9BV[`\x01`\x01`\xA0\x1B\x03\x16\x90R\x90Pa\x05\xFB\x81\x84a\x12\xC3V[\x94\x93PPPPV[`\0a\x06\ra\x19eV[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x95W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`:`$\x82\x01R\x7FPKPHelper: only accepts transfer`D\x82\x01Ry\x1C\xC8\x19\x9C\x9B\xDBH\x1D\x1A\x19H\x14\x12\xD4\x13\x91\x95\x08\x18\xDB\xDB\x9D\x1C\x98X\xDD`2\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[Pc\n\x85\xBD\x01`\xE1\x1B\x95\x94PPPPPV[`\0a\x06\xB3\x83\x83a\x05\x86V[\x93\x92PPPV[`\0\x90\x81R`\x01` \x81\x90R`@\x90\x91 \x01T\x90V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07\"W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07F\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07u\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\x92W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xB6\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x07\xE6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x07\xF0a\t\x9CV[`@Qc\xB6:vw`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R\x90\x91P`\x01`\x01`\xA0\x1B\x03\x82\x16\x90c\xB6:vw\x90`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x085W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08IW=`\0\x80>=`\0\xFD[PP`@Qc(\xCD\x10\xC7`\xE1\x1B\x81R`\x04\x81\x01\x85\x90R`\x01`\x01`\xA0\x1B\x03\x84\x16\x92PcQ\x9A!\x8E\x91P`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x08\x8FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08\xA3W=`\0\x80>=`\0\xFD[PPPPPPV[a\x08\xB4\x82a\x06\xBAV[a\x08\xBD\x81a\"\x07V[a\x08\xC7\x83\x83a\"\x11V[PPPV[`\x02T`@\x80Qc\x12\x0E_\x07`\xE3\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x90r\xF88\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\t\x8EW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a\t\x98\x82\x82a\"|V[PPV[`\x02T`@\x80Qc\x16\xF7k\xBF`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x16\xF7k\xBF\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\t\xF6a\"\xE3V[a\n\0`\0a#BV[V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\0\x80a\n_a\x19eV[\x83Q` \x85\x01Q`@Qc?\xF8\x06\x97`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x92c\x7F\xF0\r.\x924\x92a\n\x94\x92`\x04\x01a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\n\xB2W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n\xD7\x91\x90a3jV[\x90P\x82``\x01QQ\x83`@\x01QQ\x14a\x0B\x02W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x82`\xA0\x01QQ\x83`\x80\x01QQ\x14a\x0B+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x82`\xE0\x01QQ\x83`\xC0\x01QQ\x14a\x0BTW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x82a\x01\0\x01QQ\x83`\xC0\x01QQ\x14a\x0B~W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x82a\x01 \x01QQ\x83`\xC0\x01QQ\x14a\x0B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[`@\x83\x01QQ\x15a\x0CtW`\0[\x83`@\x01QQ\x81\x10\x15a\x0CrWa\x0B\xCBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x86`@\x01Q\x84\x81Q\x81\x10a\x0B\xF0Wa\x0B\xF0a6'V[` \x02` \x01\x01Q\x87``\x01Q\x85\x81Q\x81\x10a\x0C\x0EWa\x0C\x0Ea6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0C4\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0CNW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0CbW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0B\xB6\x90PV[P[`\x80\x83\x01QQ\x15a\r@W`\0[\x83`\x80\x01QQ\x81\x10\x15a\r>Wa\x0C\x97a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x86`\x80\x01Q\x84\x81Q\x81\x10a\x0C\xBCWa\x0C\xBCa6'V[` \x02` \x01\x01Q\x87`\xA0\x01Q\x85\x81Q\x81\x10a\x0C\xDAWa\x0C\xDAa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\0\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\x1AW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r.W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0C\x82\x90PV[P[`\xC0\x83\x01QQ\x15a\x0EbW`\0[\x83`\xC0\x01QQ\x81\x10\x15a\x0E`Wa\rca\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x88`\xC0\x01Q\x86\x81Q\x81\x10a\r\x93Wa\r\x93a6'V[` \x02` \x01\x01Q\x81R` \x01\x88`\xE0\x01Q\x86\x81Q\x81\x10a\r\xB6Wa\r\xB6a6'V[` \x02` \x01\x01Q\x81R` \x01\x88a\x01\0\x01Q\x86\x81Q\x81\x10a\r\xDAWa\r\xDAa6'V[` \x02` \x01\x01Q\x81RP\x87a\x01 \x01Q\x85\x81Q\x81\x10a\r\xFCWa\r\xFCa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\"\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0E=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\rN\x90PV[P[`\0a\x0Ela\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\x99\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E\xB6W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xDA\x91\x90a3\x97V[\x90P\x83a\x01@\x01Q\x15a\x0F|Wa\x0E\xEFa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0F*W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0FI\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0FcW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0FwW=`\0\x80>=`\0\xFD[PPPP[\x83a\x01`\x01Q\x15a\x0F\xF5Wa\x0F\x8Fa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\xBE\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0F\xD8W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F\xECW=`\0\x80>=`\0\xFD[PPPPa\x10_V[a\x0F\xFDa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x10,\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x10FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x10ZW=`\0\x80>=`\0\xFD[PPPP[P\x92\x91PPV[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x10\xB8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10\xDC\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x11\x0B\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11(W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11L\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x11|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x11\x86a\t\x9CV[\x82Q\x90\x91P\x15a\x08\xC7W\x80`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x84\x84`\0\x81Q\x81\x10a\x11\xB3Wa\x11\xB3a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x11\xD8\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x11\xF2W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x06W=`\0\x80>=`\0\xFD[PPPP\x80`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x84\x84`\x01\x81Q\x81\x10a\x12-Wa\x12-a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x12R\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x12lW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x80W=`\0\x80>=`\0\xFD[PPPPPPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\0\x91\x82R`\x01` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[\x80Q\x82Q`\0\x91\x14a\x13=W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`>`$\x82\x01R\x7FPKPHelper: Claim key type must m`D\x82\x01R\x7Fatch Auth Method data key type\0\0`d\x82\x01R`\x84\x01a\x06\x8CV[`\x01`\0a\x13Ia\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cq\xAA\x9A\xCF4\x84\x88`\0\x01Q\x89` \x01Q\x8A`@\x01Q\x8B``\x01Q\x8C`\x80\x01Q`@Q\x88c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\x93\x96\x95\x94\x93\x92\x91\x90a7cV[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x13\xB1W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xD6\x91\x90a3jV[\x90P\x83`@\x01QQ\x84` \x01QQ\x14a\x14\x01W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x83`\x80\x01QQ\x84``\x01QQ\x14a\x14*W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x83`\xC0\x01QQ\x84`\xA0\x01QQ\x14a\x14SW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x83`\xE0\x01QQ\x84`\xA0\x01QQ\x14a\x14|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x83a\x01\0\x01QQ\x84`\xA0\x01QQ\x14a\x14\xA6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[` \x84\x01QQ\x15a\x15rW`\0[\x84` \x01QQ\x81\x10\x15a\x15pWa\x14\xC9a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x87` \x01Q\x84\x81Q\x81\x10a\x14\xEEWa\x14\xEEa6'V[` \x02` \x01\x01Q\x88`@\x01Q\x85\x81Q\x81\x10a\x15\x0CWa\x15\x0Ca6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x152\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x15LW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x15`W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x14\xB4\x90PV[P[``\x84\x01QQ\x15a\x16>W`\0[\x84``\x01QQ\x81\x10\x15a\x16=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x15\x80\x90PV[P[`\xA0\x84\x01QQ\x15a\x17_W`\0[\x84`\xA0\x01QQ\x81\x10\x15a\x17]Wa\x16aa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x89`\xA0\x01Q\x86\x81Q\x81\x10a\x16\x91Wa\x16\x91a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xC0\x01Q\x86\x81Q\x81\x10a\x16\xB4Wa\x16\xB4a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xE0\x01Q\x86\x81Q\x81\x10a\x16\xD7Wa\x16\xD7a6'V[` \x02` \x01\x01Q\x81RP\x88a\x01\0\x01Q\x85\x81Q\x81\x10a\x16\xF9Wa\x16\xF9a6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x1F\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x179W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x17MW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x16L\x90PV[P[`\0a\x17ia\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x96\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\xB3W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17\xD7\x91\x90a3\x97V[\x90P\x84a\x01 \x01Q\x15a\x18yWa\x17\xECa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x18'W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18F\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18`W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18tW=`\0\x80>=`\0\xFD[PPPP[\x84a\x01@\x01Q\x15a\x18\xF2Wa\x18\x8Ca\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18\xBB\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18\xD5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18\xE9W=`\0\x80>=`\0\xFD[PPPPa\x19\\V[a\x18\xFAa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x19)\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x19CW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x19WW=`\0\x80>=`\0\xFD[PPPP[P\x94\x93PPPPV[`\x02T`@\x80Qc,\x0B\x8B\xF7`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c,\x0B\x8B\xF7\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\x19\xC0\x82a\x06\xBAV[a\x19\xC9\x81a\"\x07V[a\x08\xC7\x83\x83a\"|V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x1A%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1AI\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x1Ax\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1A\x95W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1A\xB9\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x1A\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x1A\xF3a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16c\x7F\xF0\r.4\x8D\x8D`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1B!\x92\x91\x90a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x1B?W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1Bd\x91\x90a3jV[\x90P\x87Q\x89Q\x14a\x1B\x87W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x86Q\x89Q\x14a\x1B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x85Q\x89Q\x14a\x1B\xC9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[\x88Q\x15a\x1C\xD1W`\0[\x89Q\x81\x10\x15a\x1C\xCFWa\x1B\xE4a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x8E\x86\x81Q\x81\x10a\x1C\x10Wa\x1C\x10a6'V[` \x02` \x01\x01Q\x81R` \x01\x8D\x86\x81Q\x81\x10a\x1C/Wa\x1C/a6'V[` \x02` \x01\x01Q\x81R` \x01\x8C\x86\x81Q\x81\x10a\x1CNWa\x1CNa6'V[` \x02` \x01\x01Q\x81RP\x8A\x85\x81Q\x81\x10a\x1CkWa\x1Cka6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\x91\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1C\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1C\xBFW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x1B\xD3\x90PV[P[`\0a\x1C\xDBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\x08\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1D%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1DI\x91\x90a3\x97V[\x90P\x84\x15a\x1D\xE6Wa\x1DYa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x1D\x94W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\xB3\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1D\xCDW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1D\xE1W=`\0\x80>=`\0\xFD[PPPP[\x83\x15a\x1EZWa\x1D\xF4a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E#\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E=W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1EQW=`\0\x80>=`\0\xFD[PPPPa\x1E\xC4V[a\x1Eba\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E\x91\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1E\xBFW=`\0\x80>=`\0\xFD[PPPP[\x85Q\x15a\x1F\xCEWa\x1E\xD3a\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x83\x88`\0\x81Q\x81\x10a\x1E\xF5Wa\x1E\xF5a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x1A\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F4W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1FHW=`\0\x80>=`\0\xFD[PPPPa\x1FTa\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x83\x88`\x01\x81Q\x81\x10a\x1FvWa\x1Fva6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x9B\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F\xB5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1F\xC9W=`\0\x80>=`\0\xFD[PPPP[P\x9A\x99PPPPPPPPPPV[`\0\x80`@Q\x80a\x01\x80\x01`@R\x80\x8B\x81R` \x01\x8A\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x81\x11\x15a \x11Wa \x11a%\xD6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a DW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a /W\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \x7FW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a jW\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xB0W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xEBW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a \xD6W\x90P[P\x81R` \x01\x89\x81R` \x01\x88\x81R` \x01\x87\x81R` \x01\x86\x81R` \x01\x85\x15\x15\x81R` \x01\x84\x15\x15\x81RP\x90Pa!\"\x81a\nTV[\x9A\x99PPPPPPPPPPV[a!8a\"\xE3V[`\x01`\x01`\xA0\x1B\x03\x81\x16a!\x9DW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`&`$\x82\x01R\x7FOwnable: new owner is the zero a`D\x82\x01Reddress`\xD0\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a!\xA6\x81a#BV[PV[a!\xB1a\"\xE3V[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x17\x90U`@Q\x7F'`\x07<|\xD8\xCA\xC51\xD7\xF6C\xBE\xCB\xFB\xB7M\x8B\x81VD>\xAC\xF8yb%2\xDB\xBB<\xD5\x90a!\xFC\x90\x83\x90a%\xC2V[`@Q\x80\x91\x03\x90\xA1PV[a!\xA6\x813a#\x92V[a\"\x1B\x82\x82a\x12\x98V[a\t\x98W`\0\x82\x81R`\x01` \x81\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x86\x16\x80\x86R\x92R\x80\x84 \x80T`\xFF\x19\x16\x90\x93\x17\x90\x92U\x90Q3\x92\x85\x91\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r\x91\x90\xA4PPV[a\"\x86\x82\x82a\x12\x98V[\x15a\t\x98W`\0\x82\x81R`\x01` \x90\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[3a\"\xECa\x12\x89V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\n\0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FOwnable: caller is not the owner`D\x82\x01R`d\x01a\x06\x8CV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[a#\x9C\x82\x82a\x12\x98V[a\t\x98Wa#\xA9\x81a#\xEBV[a#\xB4\x83` a#\xFDV[`@Q` \x01a#\xC5\x92\x91\x90a8\x03V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x06\x8C\x91`\x04\x01a8rV[``a\x04\x95`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a$\x0C\x83`\x02a8\x9BV[a$\x17\x90`\x02a8\xB2V[`\x01`\x01`@\x1B\x03\x81\x11\x15a$.Wa$.a%\xD6V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a$XW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a$sWa$sa6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a$\xA2Wa$\xA2a6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a$\xC6\x84`\x02a8\x9BV[a$\xD1\x90`\x01a8\xB2V[\x90P[`\x01\x81\x11\x15a%IWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a%\x05Wa%\x05a6'V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a%\x1BWa%\x1Ba6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a%B\x81a8\xC5V[\x90Pa$\xD4V[P\x83\x15a\x06\xB3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x06\x8CV[`\0` \x82\x84\x03\x12\x15a%\xAAW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x06\xB3W`\0\x80\xFD[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@R\x90V[`@Qa\x01`\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Qa\x01\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\xA4Wa&\xA4a%\xD6V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a&\xC5Wa&\xC5a%\xD6V[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a&\xE0W`\0\x80\xFD[\x815a&\xF3a&\xEE\x82a&\xACV[a&|V[\x80\x82\x82R` \x82\x01\x91P` ``\x84\x02\x86\x01\x01\x92P\x85\x83\x11\x15a'\x15W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW``\x81\x88\x03\x12\x15a'2W`\0\x80\xFD[a':a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\xFF\x81\x16\x81\x14a'\\W`\0\x80\xFD[`@\x82\x01R\x83R` \x90\x92\x01\x91``\x01a'\x1AV[P\x95\x94PPPPPV[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a'\x95Wa'\x95a%\xD6V[P`\x1F\x83\x01`\x1F\x19\x16` \x01a'\xAA\x81a&|V[\x91PP\x82\x81R\x83\x83\x83\x01\x11\x15a'\xBFW`\0\x80\xFD[\x82\x82` \x83\x017`\0` \x84\x83\x01\x01R\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a'\xE7W`\0\x80\xFD[\x815a'\xF5a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\x17W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a(:W`\0\x80\xFD[\x86\x01`?\x81\x01\x88\x13a(KW`\0\x80\xFD[a(]\x88` \x83\x015`@\x84\x01a'{V[\x84RP` \x92\x83\x01\x92\x01a(\x1CV[`\0\x82`\x1F\x83\x01\x12a(}W`\0\x80\xFD[\x815a(\x8Ba&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\xADW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805\x83R` \x92\x83\x01\x92\x01a(\xB2V[`\0\x82`\x1F\x83\x01\x12a(\xDBW`\0\x80\xFD[\x815a(\xE9a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\x0BW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a).W`\0\x80\xFD[a)=\x88` \x83\x8A\x01\x01a(lV[\x84RP` \x92\x83\x01\x92\x01a)\x10V[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a!\xA6W`\0\x80\xFD[`\0\x82`\x1F\x83\x01\x12a)rW`\0\x80\xFD[\x815a)\x80a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\xA2W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805a)\xBA\x81a)LV[\x83R` \x92\x83\x01\x92\x01a)\xA7V[\x805\x80\x15\x15\x81\x14a)\xD8W`\0\x80\xFD[\x91\x90PV[`\0a\x01`\x82\x84\x03\x12\x15a)\xF0W`\0\x80\xFD[a)\xF8a&\x14V[\x825\x81R\x90P` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x17W`\0\x80\xFD[a*#\x84\x82\x85\x01a'\xD6V[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*BW`\0\x80\xFD[a*N\x84\x82\x85\x01a(\xCAV[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*mW`\0\x80\xFD[a*y\x84\x82\x85\x01a)aV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x98W`\0\x80\xFD[a*\xA4\x84\x82\x85\x01a(\xCAV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xC3W`\0\x80\xFD[a*\xCF\x84\x82\x85\x01a(lV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xEEW`\0\x80\xFD[a*\xFA\x84\x82\x85\x01a'\xD6V[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\x19W`\0\x80\xFD[a+%\x84\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+EW`\0\x80\xFD[a+Q\x84\x82\x85\x01a(\xCAV[a\x01\0\x83\x01RPa+ea\x01 \x83\x01a)\xC8V[a\x01 \x82\x01Ra+xa\x01@\x83\x01a)\xC8V[a\x01@\x82\x01R\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15a+\x97W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xADW`\0\x80\xFD[\x83\x01``\x81\x86\x03\x12\x15a+\xBFW`\0\x80\xFD[a+\xC7a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xEEW`\0\x80\xFD[a+\xFA\x87\x82\x85\x01a&\xCFV[`@\x83\x01RP\x92PP` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[a,(\x85\x82\x86\x01a)\xDDV[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80`\0`\x80\x86\x88\x03\x12\x15a,JW`\0\x80\xFD[\x855a,U\x81a)LV[\x94P` \x86\x015a,e\x81a)LV[\x93P`@\x86\x015\x92P``\x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x87W`\0\x80\xFD[\x86\x01`\x1F\x81\x01\x88\x13a,\x98W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a,\xAEW`\0\x80\xFD[\x88` \x82\x84\x01\x01\x11\x15a,\xC0W`\0\x80\xFD[\x95\x98\x94\x97P\x92\x95PPP` \x01\x91\x90V[`\0` \x82\x84\x03\x12\x15a,\xE3W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a,\xFDW`\0\x80\xFD[\x825\x91P` \x83\x015a-\x0F\x81a)LV[\x80\x91PP\x92P\x92\x90PV[`\0\x82`\x1F\x83\x01\x12a-+W`\0\x80\xFD[a\x06\xB3\x83\x835` \x85\x01a'{V[`\0` \x82\x84\x03\x12\x15a-LW`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a-bW`\0\x80\xFD[\x82\x01a\x01\x80\x81\x85\x03\x12\x15a-uW`\0\x80\xFD[a-}a&7V[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\x9AW`\0\x80\xFD[a-\xA6\x86\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xC5W`\0\x80\xFD[a-\xD1\x86\x82\x85\x01a'\xD6V[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xF0W`\0\x80\xFD[a-\xFC\x86\x82\x85\x01a(\xCAV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x1BW`\0\x80\xFD[a.'\x86\x82\x85\x01a)aV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.FW`\0\x80\xFD[a.R\x86\x82\x85\x01a(\xCAV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.qW`\0\x80\xFD[a.}\x86\x82\x85\x01a(lV[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x9CW`\0\x80\xFD[a.\xA8\x86\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xC8W`\0\x80\xFD[a.\xD4\x86\x82\x85\x01a'\xD6V[a\x01\0\x83\x01RPa\x01 \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xF5W`\0\x80\xFD[a/\x01\x86\x82\x85\x01a(\xCAV[a\x01 \x83\x01RPa/\x15a\x01@\x83\x01a)\xC8V[a\x01@\x82\x01Ra/(a\x01`\x83\x01a)\xC8V[a\x01`\x82\x01R\x94\x93PPPPV[`\0\x82`\x1F\x83\x01\x12a/GW`\0\x80\xFD[\x815a/Ua&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a/wW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a/\x9AW`\0\x80\xFD[a/\xA9\x88` \x83\x8A\x01\x01a-\x1AV[\x84RP` \x92\x83\x01\x92\x01a/|V[`\0\x80`@\x83\x85\x03\x12\x15a/\xCBW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a/\xE8W`\0\x80\xFD[a,(\x85\x82\x86\x01a/6V[`\0\x80`@\x83\x85\x03\x12\x15a0\x07W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x1DW`\0\x80\xFD[\x83\x01`\xA0\x81\x86\x03\x12\x15a0/W`\0\x80\xFD[a07a&ZV[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0TW`\0\x80\xFD[a0`\x87\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x81\x015\x90\x82\x01R``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x89W`\0\x80\xFD[a0\x95\x87\x82\x85\x01a&\xCFV[``\x83\x01RP`\x80\x82\x015\x91Pa0\xAB\x82a)LV[`\x80\x81\x01\x91\x90\x91R\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[`\x03\x81\x10a0\xECWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x04\x95\x82\x84a0\xCEV[`\0\x80`\0\x80`\0\x80`\0\x80`\0a\x01 \x8A\x8C\x03\x12\x15a1\x1DW`\0\x80\xFD[\x895\x98P` \x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1:W`\0\x80\xFD[a1F\x8C\x82\x8D\x01a-\x1AV[\x98PP`@\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1bW`\0\x80\xFD[a1n\x8C\x82\x8D\x01a(lV[\x97PP``\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\x8AW`\0\x80\xFD[a1\x96\x8C\x82\x8D\x01a'\xD6V[\x96PP`\x80\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xB2W`\0\x80\xFD[a1\xBE\x8C\x82\x8D\x01a'\xD6V[\x95PP`\xA0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xDAW`\0\x80\xFD[a1\xE6\x8C\x82\x8D\x01a(\xCAV[\x94PP`\xC0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x02W`\0\x80\xFD[a2\x0E\x8C\x82\x8D\x01a/6V[\x93PPa2\x1D`\xE0\x8B\x01a)\xC8V[\x91Pa2,a\x01\0\x8B\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98P\x92\x95\x98V[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15a2XW`\0\x80\xFD[\x885\x97P` \x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2uW`\0\x80\xFD[a2\x81\x8B\x82\x8C\x01a-\x1AV[\x97PP`@\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x9DW`\0\x80\xFD[a2\xA9\x8B\x82\x8C\x01a(lV[\x96PP``\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xC5W`\0\x80\xFD[a2\xD1\x8B\x82\x8C\x01a'\xD6V[\x95PP`\x80\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xEDW`\0\x80\xFD[a2\xF9\x8B\x82\x8C\x01a'\xD6V[\x94PP`\xA0\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a3\x15W`\0\x80\xFD[a3!\x8B\x82\x8C\x01a(\xCAV[\x93PPa30`\xC0\x8A\x01a)\xC8V[\x91Pa3>`\xE0\x8A\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[`\0` \x82\x84\x03\x12\x15a3_W`\0\x80\xFD[\x815a\x06\xB3\x81a)LV[`\0` \x82\x84\x03\x12\x15a3|W`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xB3` \x83\x01\x84a0\xCEV[`\0` \x82\x84\x03\x12\x15a3\xA9W`\0\x80\xFD[\x81Qa\x06\xB3\x81a)LV[` \x80\x82R`Z\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rymain wallets, who are you?`0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\0[\x83\x81\x10\x15a4OW\x81\x81\x01Q\x83\x82\x01R` \x01a47V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra4p\x81` \x86\x01` \x86\x01a44V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x81R`@` \x82\x01R`\0a\x05\xFB`@\x83\x01\x84a4XV[` \x80\x82R`6\x90\x82\x01R\x7FPKPHelper: ipfs cid and scope ar`@\x82\x01Ru\x0EL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`S\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`5\x90\x82\x01R\x7FPKPHelper: address and scope arr`@\x82\x01Rt\x0C/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`[\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`;\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01Rz\r,\x84\x0C.NL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`+\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fpubkey array lengths must match\0``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fscopes array lengths must match\0``\x82\x01R`\x80\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81Q\x80\x84R` \x84\x01\x93P` \x83\x01`\0[\x82\x81\x10\x15a6oW\x81Q\x86R` \x95\x86\x01\x95\x90\x91\x01\x90`\x01\x01a6QV[P\x93\x94\x93PPPPV[\x83\x81R``` \x82\x01R`\0a6\x92``\x83\x01\x85a4XV[\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[\x96\x95PPPPPPV[\x83\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R```@\x82\x01\x81\x90R`\0\x90a6\xD8\x90\x83\x01\x84a6=V[\x95\x94PPPPPV[\x83\x81R``` \x82\x01R\x82Q``\x82\x01R`\0` \x84\x01Q```\x80\x84\x01Ra7\r`\xC0\x84\x01\x82a4XV[\x90P`@\x85\x01Q`_\x19\x84\x83\x03\x01`\xA0\x85\x01Ra7*\x82\x82a4XV[\x91PP\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x81R\x91\x90\x92\x16` \x82\x01R`@\x81\x01\x91\x90\x91R``\x01\x90V[\x86\x81R\x85` \x82\x01R`\xC0`@\x82\x01R`\0a7\x82`\xC0\x83\x01\x87a4XV[``\x83\x01\x86\x90R\x82\x81\x03`\x80\x84\x01R\x84Q\x80\x82R` \x80\x87\x01\x92\x01\x90`\0[\x81\x81\x10\x15a7\xDEW\x83Q\x80Q\x84R` \x81\x01Q` \x85\x01R`\xFF`@\x82\x01Q\x16`@\x85\x01RP``\x83\x01\x92P` \x84\x01\x93P`\x01\x81\x01\x90Pa7\xA1V[PP`\x01`\x01`\xA0\x1B\x03\x85\x16`\xA0\x85\x01R\x91Pa7\xF8\x90PV[\x97\x96PPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa85\x81`\x17\x85\x01` \x88\x01a44V[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa8f\x81`(\x84\x01` \x88\x01a44V[\x01`(\x01\x94\x93PPPPV[` \x81R`\0a\x06\xB3` \x83\x01\x84a4XV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x04\x95Wa\x04\x95a8\x85V[\x80\x82\x01\x80\x82\x11\x15a\x04\x95Wa\x04\x95a8\x85V[`\0\x81a8\xD4Wa8\xD4a8\x85V[P`\0\x19\x01\x90V\xFEPKPHelper: auth method type and \xA2dipfsX\"\x12 n\xD3\xA9v]n{\x1D\x8Fu`\xE6\xB2v\x01r\xCEl\xF0\xF5`Q\x8A\x13/\xC0\xCD\x9F\x1AX\xB8\xF8dsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static PKPHELPER_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __BYTECODE, ); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\x01LW`\x005`\xE0\x1C\x80cs\xCCA\x11\x11a\0\xBCW\x80cs\xCCA\x11\x14a\x02\xF6W\x80cw\x8F\xE5r\x14a\x03\x0BW\x80cx..\xA5\x14a\x03\x1EW\x80c\x8D\xA5\xCB[\x14a\x03>W\x80c\x91\xD1HT\x14a\x03SW\x80c\x91\xEEO\xD5\x14a\x03sW\x80c\x9D\xCA\x002\x14a\x03\x86W\x80c\xA2\x17\xFD\xDF\x14a\x03\xB4W\x80c\xCA\xEA\xD0\xC7\x14a\x03\xC9W\x80c\xD5Gt\x1F\x14a\x03\xDEW\x80c\xDB\x0B\xF93\x14a\x03\xFEW\x80c\xE4\xF1\x1D\xF6\x14a\x04\x11W\x80c\xF2\xFD\xE3\x8B\x14a\x04$W\x80c\xF9]q\xB1\x14a\x04DW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01QW\x80c\x0E\x9E\xD6\x8B\x14a\x01\x86W\x80c\x13\xAFA\x1B\x14a\x01\xA8W\x80c\x15\x0Bz\x02\x14a\x01\xC9W\x80c /rO\x14a\x02\x02W\x80c$\x8A\x9C\xA3\x14a\x02\x15W\x80c+U5Q\x14a\x025W\x80c//\xF1]\x14a\x02WW\x80c2vU\x8C\x14a\x02wW\x80c6V\x8A\xBE\x14a\x02\x8CW\x80cPC\x02l\x14a\x02\xACW\x80cP\xD1{^\x14a\x02\xC1W\x80cqP\x18\xA6\x14a\x02\xE1W[`\0\x80\xFD[4\x80\x15a\x01]W`\0\x80\xFD[Pa\x01qa\x01l6`\x04a%\x98V[a\x04dV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x92W`\0\x80\xFD[Pa\x01\x9Ba\x04\x9BV[`@Qa\x01}\x91\x90a%\xC2V[a\x01\xBBa\x01\xB66`\x04a+\x84V[a\x05\x86V[`@Q\x90\x81R` \x01a\x01}V[4\x80\x15a\x01\xD5W`\0\x80\xFD[Pa\x01\xE9a\x01\xE46`\x04a,2V[a\x06\x03V[`@Q`\x01`\x01`\xE0\x1B\x03\x19\x90\x91\x16\x81R` \x01a\x01}V[a\x01\xBBa\x02\x106`\x04a+\x84V[a\x06\xA7V[4\x80\x15a\x02!W`\0\x80\xFD[Pa\x01\xBBa\x0206`\x04a,\xD1V[a\x06\xBAV[4\x80\x15a\x02AW`\0\x80\xFD[Pa\x02Ua\x02P6`\x04a,\xD1V[a\x06\xD0V[\0[4\x80\x15a\x02cW`\0\x80\xFD[Pa\x02Ua\x02r6`\x04a,\xEAV[a\x08\xABV[4\x80\x15a\x02\x83W`\0\x80\xFD[Pa\x01\x9Ba\x08\xCCV[4\x80\x15a\x02\x98W`\0\x80\xFD[Pa\x02Ua\x02\xA76`\x04a,\xEAV[a\t\x1EV[4\x80\x15a\x02\xB8W`\0\x80\xFD[Pa\x01\x9Ba\t\x9CV[4\x80\x15a\x02\xCDW`\0\x80\xFD[P`\x02Ta\x01\x9B\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x02\xEDW`\0\x80\xFD[Pa\x02Ua\t\xEEV[4\x80\x15a\x03\x02W`\0\x80\xFD[Pa\x01\x9Ba\n\x02V[a\x01\xBBa\x03\x196`\x04a-:V[a\nTV[4\x80\x15a\x03*W`\0\x80\xFD[Pa\x02Ua\x0396`\x04a/\xB8V[a\x10fV[4\x80\x15a\x03JW`\0\x80\xFD[Pa\x01\x9Ba\x12\x89V[4\x80\x15a\x03_W`\0\x80\xFD[Pa\x01qa\x03n6`\x04a,\xEAV[a\x12\x98V[a\x01\xBBa\x03\x816`\x04a/\xF4V[a\x12\xC3V[4\x80\x15a\x03\x92W`\0\x80\xFD[P`\x02Ta\x03\xA7\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\x01}\x91\x90a0\xF0V[4\x80\x15a\x03\xC0W`\0\x80\xFD[Pa\x01\xBB`\0\x81V[4\x80\x15a\x03\xD5W`\0\x80\xFD[Pa\x01\x9Ba\x19eV[4\x80\x15a\x03\xEAW`\0\x80\xFD[Pa\x02Ua\x03\xF96`\x04a,\xEAV[a\x19\xB7V[a\x01\xBBa\x04\x0C6`\x04a0\xFEV[a\x19\xD3V[a\x01\xBBa\x04\x1F6`\x04a2;V[a\x1F\xDDV[4\x80\x15a\x040W`\0\x80\xFD[Pa\x02Ua\x04?6`\x04a3MV[a!0V[4\x80\x15a\x04PW`\0\x80\xFD[Pa\x02Ua\x04_6`\x04a3MV[a!\xA9V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x04\x95WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\x02T`@\x80Qc\xDA\x19\xDD\xFB`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\xDA\x19\xDD\xFB\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x11\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x05@\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05]W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x81\x91\x90a3\x97V[\x90P\x90V[`\0\x80`@Q\x80`\xA0\x01`@R\x80\x85`\0\x01Q\x81R` \x01`@Q\x80`@\x01`@R\x80`\x0C\x81R` \x01knaga-keyset1`\xA0\x1B\x81RP\x81R` \x01\x85` \x01Q\x81R` \x01\x85`@\x01Q\x81R` \x01a\x05\xE4a\x04\x9BV[`\x01`\x01`\xA0\x1B\x03\x16\x90R\x90Pa\x05\xFB\x81\x84a\x12\xC3V[\x94\x93PPPPV[`\0a\x06\ra\x19eV[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x95W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`:`$\x82\x01R\x7FPKPHelper: only accepts transfer`D\x82\x01Ry\x1C\xC8\x19\x9C\x9B\xDBH\x1D\x1A\x19H\x14\x12\xD4\x13\x91\x95\x08\x18\xDB\xDB\x9D\x1C\x98X\xDD`2\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[Pc\n\x85\xBD\x01`\xE1\x1B\x95\x94PPPPPV[`\0a\x06\xB3\x83\x83a\x05\x86V[\x93\x92PPPV[`\0\x90\x81R`\x01` \x81\x90R`@\x90\x91 \x01T\x90V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07\"W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07F\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07u\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\x92W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xB6\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x07\xE6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x07\xF0a\t\x9CV[`@Qc\xB6:vw`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R\x90\x91P`\x01`\x01`\xA0\x1B\x03\x82\x16\x90c\xB6:vw\x90`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x085W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08IW=`\0\x80>=`\0\xFD[PP`@Qc(\xCD\x10\xC7`\xE1\x1B\x81R`\x04\x81\x01\x85\x90R`\x01`\x01`\xA0\x1B\x03\x84\x16\x92PcQ\x9A!\x8E\x91P`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x08\x8FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08\xA3W=`\0\x80>=`\0\xFD[PPPPPPV[a\x08\xB4\x82a\x06\xBAV[a\x08\xBD\x81a\"\x07V[a\x08\xC7\x83\x83a\"\x11V[PPPV[`\x02T`@\x80Qc\x12\x0E_\x07`\xE3\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x90r\xF88\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\t\x8EW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a\t\x98\x82\x82a\"|V[PPV[`\x02T`@\x80Qc\x16\xF7k\xBF`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x16\xF7k\xBF\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\t\xF6a\"\xE3V[a\n\0`\0a#BV[V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\0\x80a\n_a\x19eV[\x83Q` \x85\x01Q`@Qc?\xF8\x06\x97`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x92c\x7F\xF0\r.\x924\x92a\n\x94\x92`\x04\x01a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\n\xB2W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n\xD7\x91\x90a3jV[\x90P\x82``\x01QQ\x83`@\x01QQ\x14a\x0B\x02W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x82`\xA0\x01QQ\x83`\x80\x01QQ\x14a\x0B+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x82`\xE0\x01QQ\x83`\xC0\x01QQ\x14a\x0BTW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x82a\x01\0\x01QQ\x83`\xC0\x01QQ\x14a\x0B~W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x82a\x01 \x01QQ\x83`\xC0\x01QQ\x14a\x0B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[`@\x83\x01QQ\x15a\x0CtW`\0[\x83`@\x01QQ\x81\x10\x15a\x0CrWa\x0B\xCBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x86`@\x01Q\x84\x81Q\x81\x10a\x0B\xF0Wa\x0B\xF0a6'V[` \x02` \x01\x01Q\x87``\x01Q\x85\x81Q\x81\x10a\x0C\x0EWa\x0C\x0Ea6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0C4\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0CNW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0CbW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0B\xB6\x90PV[P[`\x80\x83\x01QQ\x15a\r@W`\0[\x83`\x80\x01QQ\x81\x10\x15a\r>Wa\x0C\x97a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x86`\x80\x01Q\x84\x81Q\x81\x10a\x0C\xBCWa\x0C\xBCa6'V[` \x02` \x01\x01Q\x87`\xA0\x01Q\x85\x81Q\x81\x10a\x0C\xDAWa\x0C\xDAa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\0\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\x1AW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r.W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0C\x82\x90PV[P[`\xC0\x83\x01QQ\x15a\x0EbW`\0[\x83`\xC0\x01QQ\x81\x10\x15a\x0E`Wa\rca\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x88`\xC0\x01Q\x86\x81Q\x81\x10a\r\x93Wa\r\x93a6'V[` \x02` \x01\x01Q\x81R` \x01\x88`\xE0\x01Q\x86\x81Q\x81\x10a\r\xB6Wa\r\xB6a6'V[` \x02` \x01\x01Q\x81R` \x01\x88a\x01\0\x01Q\x86\x81Q\x81\x10a\r\xDAWa\r\xDAa6'V[` \x02` \x01\x01Q\x81RP\x87a\x01 \x01Q\x85\x81Q\x81\x10a\r\xFCWa\r\xFCa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\"\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0E=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\rN\x90PV[P[`\0a\x0Ela\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\x99\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E\xB6W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xDA\x91\x90a3\x97V[\x90P\x83a\x01@\x01Q\x15a\x0F|Wa\x0E\xEFa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0F*W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0FI\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0FcW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0FwW=`\0\x80>=`\0\xFD[PPPP[\x83a\x01`\x01Q\x15a\x0F\xF5Wa\x0F\x8Fa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\xBE\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0F\xD8W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F\xECW=`\0\x80>=`\0\xFD[PPPPa\x10_V[a\x0F\xFDa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x10,\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x10FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x10ZW=`\0\x80>=`\0\xFD[PPPP[P\x92\x91PPV[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x10\xB8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10\xDC\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x11\x0B\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11(W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11L\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x11|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x11\x86a\t\x9CV[\x82Q\x90\x91P\x15a\x08\xC7W\x80`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x84\x84`\0\x81Q\x81\x10a\x11\xB3Wa\x11\xB3a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x11\xD8\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x11\xF2W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x06W=`\0\x80>=`\0\xFD[PPPP\x80`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x84\x84`\x01\x81Q\x81\x10a\x12-Wa\x12-a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x12R\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x12lW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x80W=`\0\x80>=`\0\xFD[PPPPPPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\0\x91\x82R`\x01` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[\x80Q\x82Q`\0\x91\x14a\x13=W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`>`$\x82\x01R\x7FPKPHelper: Claim key type must m`D\x82\x01R\x7Fatch Auth Method data key type\0\0`d\x82\x01R`\x84\x01a\x06\x8CV[`\x01`\0a\x13Ia\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cq\xAA\x9A\xCF4\x84\x88`\0\x01Q\x89` \x01Q\x8A`@\x01Q\x8B``\x01Q\x8C`\x80\x01Q`@Q\x88c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\x93\x96\x95\x94\x93\x92\x91\x90a7cV[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x13\xB1W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xD6\x91\x90a3jV[\x90P\x83`@\x01QQ\x84` \x01QQ\x14a\x14\x01W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x83`\x80\x01QQ\x84``\x01QQ\x14a\x14*W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x83`\xC0\x01QQ\x84`\xA0\x01QQ\x14a\x14SW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x83`\xE0\x01QQ\x84`\xA0\x01QQ\x14a\x14|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x83a\x01\0\x01QQ\x84`\xA0\x01QQ\x14a\x14\xA6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[` \x84\x01QQ\x15a\x15rW`\0[\x84` \x01QQ\x81\x10\x15a\x15pWa\x14\xC9a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x87` \x01Q\x84\x81Q\x81\x10a\x14\xEEWa\x14\xEEa6'V[` \x02` \x01\x01Q\x88`@\x01Q\x85\x81Q\x81\x10a\x15\x0CWa\x15\x0Ca6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x152\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x15LW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x15`W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x14\xB4\x90PV[P[``\x84\x01QQ\x15a\x16>W`\0[\x84``\x01QQ\x81\x10\x15a\x16=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x15\x80\x90PV[P[`\xA0\x84\x01QQ\x15a\x17_W`\0[\x84`\xA0\x01QQ\x81\x10\x15a\x17]Wa\x16aa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x89`\xA0\x01Q\x86\x81Q\x81\x10a\x16\x91Wa\x16\x91a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xC0\x01Q\x86\x81Q\x81\x10a\x16\xB4Wa\x16\xB4a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xE0\x01Q\x86\x81Q\x81\x10a\x16\xD7Wa\x16\xD7a6'V[` \x02` \x01\x01Q\x81RP\x88a\x01\0\x01Q\x85\x81Q\x81\x10a\x16\xF9Wa\x16\xF9a6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x1F\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x179W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x17MW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x16L\x90PV[P[`\0a\x17ia\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x96\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\xB3W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17\xD7\x91\x90a3\x97V[\x90P\x84a\x01 \x01Q\x15a\x18yWa\x17\xECa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x18'W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18F\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18`W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18tW=`\0\x80>=`\0\xFD[PPPP[\x84a\x01@\x01Q\x15a\x18\xF2Wa\x18\x8Ca\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18\xBB\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18\xD5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18\xE9W=`\0\x80>=`\0\xFD[PPPPa\x19\\V[a\x18\xFAa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x19)\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x19CW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x19WW=`\0\x80>=`\0\xFD[PPPP[P\x94\x93PPPPV[`\x02T`@\x80Qc,\x0B\x8B\xF7`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c,\x0B\x8B\xF7\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\x19\xC0\x82a\x06\xBAV[a\x19\xC9\x81a\"\x07V[a\x08\xC7\x83\x83a\"|V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x1A%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1AI\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x1Ax\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1A\x95W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1A\xB9\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x1A\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x1A\xF3a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16c\x7F\xF0\r.4\x8D\x8D`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1B!\x92\x91\x90a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x1B?W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1Bd\x91\x90a3jV[\x90P\x87Q\x89Q\x14a\x1B\x87W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x86Q\x89Q\x14a\x1B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x85Q\x89Q\x14a\x1B\xC9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[\x88Q\x15a\x1C\xD1W`\0[\x89Q\x81\x10\x15a\x1C\xCFWa\x1B\xE4a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x8E\x86\x81Q\x81\x10a\x1C\x10Wa\x1C\x10a6'V[` \x02` \x01\x01Q\x81R` \x01\x8D\x86\x81Q\x81\x10a\x1C/Wa\x1C/a6'V[` \x02` \x01\x01Q\x81R` \x01\x8C\x86\x81Q\x81\x10a\x1CNWa\x1CNa6'V[` \x02` \x01\x01Q\x81RP\x8A\x85\x81Q\x81\x10a\x1CkWa\x1Cka6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\x91\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1C\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1C\xBFW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x1B\xD3\x90PV[P[`\0a\x1C\xDBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\x08\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1D%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1DI\x91\x90a3\x97V[\x90P\x84\x15a\x1D\xE6Wa\x1DYa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x1D\x94W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\xB3\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1D\xCDW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1D\xE1W=`\0\x80>=`\0\xFD[PPPP[\x83\x15a\x1EZWa\x1D\xF4a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E#\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E=W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1EQW=`\0\x80>=`\0\xFD[PPPPa\x1E\xC4V[a\x1Eba\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E\x91\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1E\xBFW=`\0\x80>=`\0\xFD[PPPP[\x85Q\x15a\x1F\xCEWa\x1E\xD3a\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x83\x88`\0\x81Q\x81\x10a\x1E\xF5Wa\x1E\xF5a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x1A\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F4W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1FHW=`\0\x80>=`\0\xFD[PPPPa\x1FTa\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x83\x88`\x01\x81Q\x81\x10a\x1FvWa\x1Fva6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x9B\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F\xB5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1F\xC9W=`\0\x80>=`\0\xFD[PPPP[P\x9A\x99PPPPPPPPPPV[`\0\x80`@Q\x80a\x01\x80\x01`@R\x80\x8B\x81R` \x01\x8A\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x81\x11\x15a \x11Wa \x11a%\xD6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a DW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a /W\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \x7FW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a jW\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xB0W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xEBW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a \xD6W\x90P[P\x81R` \x01\x89\x81R` \x01\x88\x81R` \x01\x87\x81R` \x01\x86\x81R` \x01\x85\x15\x15\x81R` \x01\x84\x15\x15\x81RP\x90Pa!\"\x81a\nTV[\x9A\x99PPPPPPPPPPV[a!8a\"\xE3V[`\x01`\x01`\xA0\x1B\x03\x81\x16a!\x9DW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`&`$\x82\x01R\x7FOwnable: new owner is the zero a`D\x82\x01Reddress`\xD0\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a!\xA6\x81a#BV[PV[a!\xB1a\"\xE3V[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x17\x90U`@Q\x7F'`\x07<|\xD8\xCA\xC51\xD7\xF6C\xBE\xCB\xFB\xB7M\x8B\x81VD>\xAC\xF8yb%2\xDB\xBB<\xD5\x90a!\xFC\x90\x83\x90a%\xC2V[`@Q\x80\x91\x03\x90\xA1PV[a!\xA6\x813a#\x92V[a\"\x1B\x82\x82a\x12\x98V[a\t\x98W`\0\x82\x81R`\x01` \x81\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x86\x16\x80\x86R\x92R\x80\x84 \x80T`\xFF\x19\x16\x90\x93\x17\x90\x92U\x90Q3\x92\x85\x91\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r\x91\x90\xA4PPV[a\"\x86\x82\x82a\x12\x98V[\x15a\t\x98W`\0\x82\x81R`\x01` \x90\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[3a\"\xECa\x12\x89V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\n\0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FOwnable: caller is not the owner`D\x82\x01R`d\x01a\x06\x8CV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[a#\x9C\x82\x82a\x12\x98V[a\t\x98Wa#\xA9\x81a#\xEBV[a#\xB4\x83` a#\xFDV[`@Q` \x01a#\xC5\x92\x91\x90a8\x03V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x06\x8C\x91`\x04\x01a8rV[``a\x04\x95`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a$\x0C\x83`\x02a8\x9BV[a$\x17\x90`\x02a8\xB2V[`\x01`\x01`@\x1B\x03\x81\x11\x15a$.Wa$.a%\xD6V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a$XW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a$sWa$sa6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a$\xA2Wa$\xA2a6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a$\xC6\x84`\x02a8\x9BV[a$\xD1\x90`\x01a8\xB2V[\x90P[`\x01\x81\x11\x15a%IWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a%\x05Wa%\x05a6'V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a%\x1BWa%\x1Ba6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a%B\x81a8\xC5V[\x90Pa$\xD4V[P\x83\x15a\x06\xB3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x06\x8CV[`\0` \x82\x84\x03\x12\x15a%\xAAW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x06\xB3W`\0\x80\xFD[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@R\x90V[`@Qa\x01`\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Qa\x01\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\xA4Wa&\xA4a%\xD6V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a&\xC5Wa&\xC5a%\xD6V[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a&\xE0W`\0\x80\xFD[\x815a&\xF3a&\xEE\x82a&\xACV[a&|V[\x80\x82\x82R` \x82\x01\x91P` ``\x84\x02\x86\x01\x01\x92P\x85\x83\x11\x15a'\x15W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW``\x81\x88\x03\x12\x15a'2W`\0\x80\xFD[a':a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\xFF\x81\x16\x81\x14a'\\W`\0\x80\xFD[`@\x82\x01R\x83R` \x90\x92\x01\x91``\x01a'\x1AV[P\x95\x94PPPPPV[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a'\x95Wa'\x95a%\xD6V[P`\x1F\x83\x01`\x1F\x19\x16` \x01a'\xAA\x81a&|V[\x91PP\x82\x81R\x83\x83\x83\x01\x11\x15a'\xBFW`\0\x80\xFD[\x82\x82` \x83\x017`\0` \x84\x83\x01\x01R\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a'\xE7W`\0\x80\xFD[\x815a'\xF5a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\x17W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a(:W`\0\x80\xFD[\x86\x01`?\x81\x01\x88\x13a(KW`\0\x80\xFD[a(]\x88` \x83\x015`@\x84\x01a'{V[\x84RP` \x92\x83\x01\x92\x01a(\x1CV[`\0\x82`\x1F\x83\x01\x12a(}W`\0\x80\xFD[\x815a(\x8Ba&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\xADW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805\x83R` \x92\x83\x01\x92\x01a(\xB2V[`\0\x82`\x1F\x83\x01\x12a(\xDBW`\0\x80\xFD[\x815a(\xE9a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\x0BW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a).W`\0\x80\xFD[a)=\x88` \x83\x8A\x01\x01a(lV[\x84RP` \x92\x83\x01\x92\x01a)\x10V[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a!\xA6W`\0\x80\xFD[`\0\x82`\x1F\x83\x01\x12a)rW`\0\x80\xFD[\x815a)\x80a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\xA2W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805a)\xBA\x81a)LV[\x83R` \x92\x83\x01\x92\x01a)\xA7V[\x805\x80\x15\x15\x81\x14a)\xD8W`\0\x80\xFD[\x91\x90PV[`\0a\x01`\x82\x84\x03\x12\x15a)\xF0W`\0\x80\xFD[a)\xF8a&\x14V[\x825\x81R\x90P` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x17W`\0\x80\xFD[a*#\x84\x82\x85\x01a'\xD6V[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*BW`\0\x80\xFD[a*N\x84\x82\x85\x01a(\xCAV[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*mW`\0\x80\xFD[a*y\x84\x82\x85\x01a)aV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x98W`\0\x80\xFD[a*\xA4\x84\x82\x85\x01a(\xCAV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xC3W`\0\x80\xFD[a*\xCF\x84\x82\x85\x01a(lV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xEEW`\0\x80\xFD[a*\xFA\x84\x82\x85\x01a'\xD6V[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\x19W`\0\x80\xFD[a+%\x84\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+EW`\0\x80\xFD[a+Q\x84\x82\x85\x01a(\xCAV[a\x01\0\x83\x01RPa+ea\x01 \x83\x01a)\xC8V[a\x01 \x82\x01Ra+xa\x01@\x83\x01a)\xC8V[a\x01@\x82\x01R\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15a+\x97W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xADW`\0\x80\xFD[\x83\x01``\x81\x86\x03\x12\x15a+\xBFW`\0\x80\xFD[a+\xC7a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xEEW`\0\x80\xFD[a+\xFA\x87\x82\x85\x01a&\xCFV[`@\x83\x01RP\x92PP` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[a,(\x85\x82\x86\x01a)\xDDV[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80`\0`\x80\x86\x88\x03\x12\x15a,JW`\0\x80\xFD[\x855a,U\x81a)LV[\x94P` \x86\x015a,e\x81a)LV[\x93P`@\x86\x015\x92P``\x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x87W`\0\x80\xFD[\x86\x01`\x1F\x81\x01\x88\x13a,\x98W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a,\xAEW`\0\x80\xFD[\x88` \x82\x84\x01\x01\x11\x15a,\xC0W`\0\x80\xFD[\x95\x98\x94\x97P\x92\x95PPP` \x01\x91\x90V[`\0` \x82\x84\x03\x12\x15a,\xE3W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a,\xFDW`\0\x80\xFD[\x825\x91P` \x83\x015a-\x0F\x81a)LV[\x80\x91PP\x92P\x92\x90PV[`\0\x82`\x1F\x83\x01\x12a-+W`\0\x80\xFD[a\x06\xB3\x83\x835` \x85\x01a'{V[`\0` \x82\x84\x03\x12\x15a-LW`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a-bW`\0\x80\xFD[\x82\x01a\x01\x80\x81\x85\x03\x12\x15a-uW`\0\x80\xFD[a-}a&7V[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\x9AW`\0\x80\xFD[a-\xA6\x86\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xC5W`\0\x80\xFD[a-\xD1\x86\x82\x85\x01a'\xD6V[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xF0W`\0\x80\xFD[a-\xFC\x86\x82\x85\x01a(\xCAV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x1BW`\0\x80\xFD[a.'\x86\x82\x85\x01a)aV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.FW`\0\x80\xFD[a.R\x86\x82\x85\x01a(\xCAV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.qW`\0\x80\xFD[a.}\x86\x82\x85\x01a(lV[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x9CW`\0\x80\xFD[a.\xA8\x86\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xC8W`\0\x80\xFD[a.\xD4\x86\x82\x85\x01a'\xD6V[a\x01\0\x83\x01RPa\x01 \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xF5W`\0\x80\xFD[a/\x01\x86\x82\x85\x01a(\xCAV[a\x01 \x83\x01RPa/\x15a\x01@\x83\x01a)\xC8V[a\x01@\x82\x01Ra/(a\x01`\x83\x01a)\xC8V[a\x01`\x82\x01R\x94\x93PPPPV[`\0\x82`\x1F\x83\x01\x12a/GW`\0\x80\xFD[\x815a/Ua&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a/wW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a/\x9AW`\0\x80\xFD[a/\xA9\x88` \x83\x8A\x01\x01a-\x1AV[\x84RP` \x92\x83\x01\x92\x01a/|V[`\0\x80`@\x83\x85\x03\x12\x15a/\xCBW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a/\xE8W`\0\x80\xFD[a,(\x85\x82\x86\x01a/6V[`\0\x80`@\x83\x85\x03\x12\x15a0\x07W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x1DW`\0\x80\xFD[\x83\x01`\xA0\x81\x86\x03\x12\x15a0/W`\0\x80\xFD[a07a&ZV[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0TW`\0\x80\xFD[a0`\x87\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x81\x015\x90\x82\x01R``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x89W`\0\x80\xFD[a0\x95\x87\x82\x85\x01a&\xCFV[``\x83\x01RP`\x80\x82\x015\x91Pa0\xAB\x82a)LV[`\x80\x81\x01\x91\x90\x91R\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[`\x03\x81\x10a0\xECWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x04\x95\x82\x84a0\xCEV[`\0\x80`\0\x80`\0\x80`\0\x80`\0a\x01 \x8A\x8C\x03\x12\x15a1\x1DW`\0\x80\xFD[\x895\x98P` \x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1:W`\0\x80\xFD[a1F\x8C\x82\x8D\x01a-\x1AV[\x98PP`@\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1bW`\0\x80\xFD[a1n\x8C\x82\x8D\x01a(lV[\x97PP``\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\x8AW`\0\x80\xFD[a1\x96\x8C\x82\x8D\x01a'\xD6V[\x96PP`\x80\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xB2W`\0\x80\xFD[a1\xBE\x8C\x82\x8D\x01a'\xD6V[\x95PP`\xA0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xDAW`\0\x80\xFD[a1\xE6\x8C\x82\x8D\x01a(\xCAV[\x94PP`\xC0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x02W`\0\x80\xFD[a2\x0E\x8C\x82\x8D\x01a/6V[\x93PPa2\x1D`\xE0\x8B\x01a)\xC8V[\x91Pa2,a\x01\0\x8B\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98P\x92\x95\x98V[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15a2XW`\0\x80\xFD[\x885\x97P` \x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2uW`\0\x80\xFD[a2\x81\x8B\x82\x8C\x01a-\x1AV[\x97PP`@\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x9DW`\0\x80\xFD[a2\xA9\x8B\x82\x8C\x01a(lV[\x96PP``\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xC5W`\0\x80\xFD[a2\xD1\x8B\x82\x8C\x01a'\xD6V[\x95PP`\x80\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xEDW`\0\x80\xFD[a2\xF9\x8B\x82\x8C\x01a'\xD6V[\x94PP`\xA0\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a3\x15W`\0\x80\xFD[a3!\x8B\x82\x8C\x01a(\xCAV[\x93PPa30`\xC0\x8A\x01a)\xC8V[\x91Pa3>`\xE0\x8A\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[`\0` \x82\x84\x03\x12\x15a3_W`\0\x80\xFD[\x815a\x06\xB3\x81a)LV[`\0` \x82\x84\x03\x12\x15a3|W`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xB3` \x83\x01\x84a0\xCEV[`\0` \x82\x84\x03\x12\x15a3\xA9W`\0\x80\xFD[\x81Qa\x06\xB3\x81a)LV[` \x80\x82R`Z\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rymain wallets, who are you?`0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\0[\x83\x81\x10\x15a4OW\x81\x81\x01Q\x83\x82\x01R` \x01a47V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra4p\x81` \x86\x01` \x86\x01a44V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x81R`@` \x82\x01R`\0a\x05\xFB`@\x83\x01\x84a4XV[` \x80\x82R`6\x90\x82\x01R\x7FPKPHelper: ipfs cid and scope ar`@\x82\x01Ru\x0EL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`S\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`5\x90\x82\x01R\x7FPKPHelper: address and scope arr`@\x82\x01Rt\x0C/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`[\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`;\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01Rz\r,\x84\x0C.NL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`+\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fpubkey array lengths must match\0``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fscopes array lengths must match\0``\x82\x01R`\x80\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81Q\x80\x84R` \x84\x01\x93P` \x83\x01`\0[\x82\x81\x10\x15a6oW\x81Q\x86R` \x95\x86\x01\x95\x90\x91\x01\x90`\x01\x01a6QV[P\x93\x94\x93PPPPV[\x83\x81R``` \x82\x01R`\0a6\x92``\x83\x01\x85a4XV[\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[\x96\x95PPPPPPV[\x83\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R```@\x82\x01\x81\x90R`\0\x90a6\xD8\x90\x83\x01\x84a6=V[\x95\x94PPPPPV[\x83\x81R``` \x82\x01R\x82Q``\x82\x01R`\0` \x84\x01Q```\x80\x84\x01Ra7\r`\xC0\x84\x01\x82a4XV[\x90P`@\x85\x01Q`_\x19\x84\x83\x03\x01`\xA0\x85\x01Ra7*\x82\x82a4XV[\x91PP\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x81R\x91\x90\x92\x16` \x82\x01R`@\x81\x01\x91\x90\x91R``\x01\x90V[\x86\x81R\x85` \x82\x01R`\xC0`@\x82\x01R`\0a7\x82`\xC0\x83\x01\x87a4XV[``\x83\x01\x86\x90R\x82\x81\x03`\x80\x84\x01R\x84Q\x80\x82R` \x80\x87\x01\x92\x01\x90`\0[\x81\x81\x10\x15a7\xDEW\x83Q\x80Q\x84R` \x81\x01Q` \x85\x01R`\xFF`@\x82\x01Q\x16`@\x85\x01RP``\x83\x01\x92P` \x84\x01\x93P`\x01\x81\x01\x90Pa7\xA1V[PP`\x01`\x01`\xA0\x1B\x03\x85\x16`\xA0\x85\x01R\x91Pa7\xF8\x90PV[\x97\x96PPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa85\x81`\x17\x85\x01` \x88\x01a44V[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa8f\x81`(\x84\x01` \x88\x01a44V[\x01`(\x01\x94\x93PPPPV[` \x81R`\0a\x06\xB3` \x83\x01\x84a4XV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x04\x95Wa\x04\x95a8\x85V[\x80\x82\x01\x80\x82\x11\x15a\x04\x95Wa\x04\x95a8\x85V[`\0\x81a8\xD4Wa8\xD4a8\x85V[P`\0\x19\x01\x90V\xFEPKPHelper: auth method type and \xA2dipfsX\"\x12 8)W\x80\xA3\x13\xE8\x95\xB6\xDC\xEAh\xE9\0\xA6o\x08;\xF3mzE$\xB6<\xF8\xBF#\xE4\x9Dc\rdsolcC\0\x08\x1C\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\x01LW`\x005`\xE0\x1C\x80cs\xCCA\x11\x11a\0\xBCW\x80cs\xCCA\x11\x14a\x02\xF6W\x80cw\x8F\xE5r\x14a\x03\x0BW\x80cx..\xA5\x14a\x03\x1EW\x80c\x8D\xA5\xCB[\x14a\x03>W\x80c\x91\xD1HT\x14a\x03SW\x80c\x91\xEEO\xD5\x14a\x03sW\x80c\x9D\xCA\x002\x14a\x03\x86W\x80c\xA2\x17\xFD\xDF\x14a\x03\xB4W\x80c\xCA\xEA\xD0\xC7\x14a\x03\xC9W\x80c\xD5Gt\x1F\x14a\x03\xDEW\x80c\xDB\x0B\xF93\x14a\x03\xFEW\x80c\xE4\xF1\x1D\xF6\x14a\x04\x11W\x80c\xF2\xFD\xE3\x8B\x14a\x04$W\x80c\xF9]q\xB1\x14a\x04DW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01QW\x80c\x0E\x9E\xD6\x8B\x14a\x01\x86W\x80c\x13\xAFA\x1B\x14a\x01\xA8W\x80c\x15\x0Bz\x02\x14a\x01\xC9W\x80c /rO\x14a\x02\x02W\x80c$\x8A\x9C\xA3\x14a\x02\x15W\x80c+U5Q\x14a\x025W\x80c//\xF1]\x14a\x02WW\x80c2vU\x8C\x14a\x02wW\x80c6V\x8A\xBE\x14a\x02\x8CW\x80cPC\x02l\x14a\x02\xACW\x80cP\xD1{^\x14a\x02\xC1W\x80cqP\x18\xA6\x14a\x02\xE1W[`\0\x80\xFD[4\x80\x15a\x01]W`\0\x80\xFD[Pa\x01qa\x01l6`\x04a%\x98V[a\x04dV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x92W`\0\x80\xFD[Pa\x01\x9Ba\x04\x9BV[`@Qa\x01}\x91\x90a%\xC2V[a\x01\xBBa\x01\xB66`\x04a+\x84V[a\x05\x86V[`@Q\x90\x81R` \x01a\x01}V[4\x80\x15a\x01\xD5W`\0\x80\xFD[Pa\x01\xE9a\x01\xE46`\x04a,2V[a\x06\x03V[`@Q`\x01`\x01`\xE0\x1B\x03\x19\x90\x91\x16\x81R` \x01a\x01}V[a\x01\xBBa\x02\x106`\x04a+\x84V[a\x06\xA7V[4\x80\x15a\x02!W`\0\x80\xFD[Pa\x01\xBBa\x0206`\x04a,\xD1V[a\x06\xBAV[4\x80\x15a\x02AW`\0\x80\xFD[Pa\x02Ua\x02P6`\x04a,\xD1V[a\x06\xD0V[\0[4\x80\x15a\x02cW`\0\x80\xFD[Pa\x02Ua\x02r6`\x04a,\xEAV[a\x08\xABV[4\x80\x15a\x02\x83W`\0\x80\xFD[Pa\x01\x9Ba\x08\xCCV[4\x80\x15a\x02\x98W`\0\x80\xFD[Pa\x02Ua\x02\xA76`\x04a,\xEAV[a\t\x1EV[4\x80\x15a\x02\xB8W`\0\x80\xFD[Pa\x01\x9Ba\t\x9CV[4\x80\x15a\x02\xCDW`\0\x80\xFD[P`\x02Ta\x01\x9B\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x02\xEDW`\0\x80\xFD[Pa\x02Ua\t\xEEV[4\x80\x15a\x03\x02W`\0\x80\xFD[Pa\x01\x9Ba\n\x02V[a\x01\xBBa\x03\x196`\x04a-:V[a\nTV[4\x80\x15a\x03*W`\0\x80\xFD[Pa\x02Ua\x0396`\x04a/\xB8V[a\x10fV[4\x80\x15a\x03JW`\0\x80\xFD[Pa\x01\x9Ba\x12\x89V[4\x80\x15a\x03_W`\0\x80\xFD[Pa\x01qa\x03n6`\x04a,\xEAV[a\x12\x98V[a\x01\xBBa\x03\x816`\x04a/\xF4V[a\x12\xC3V[4\x80\x15a\x03\x92W`\0\x80\xFD[P`\x02Ta\x03\xA7\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\x01}\x91\x90a0\xF0V[4\x80\x15a\x03\xC0W`\0\x80\xFD[Pa\x01\xBB`\0\x81V[4\x80\x15a\x03\xD5W`\0\x80\xFD[Pa\x01\x9Ba\x19eV[4\x80\x15a\x03\xEAW`\0\x80\xFD[Pa\x02Ua\x03\xF96`\x04a,\xEAV[a\x19\xB7V[a\x01\xBBa\x04\x0C6`\x04a0\xFEV[a\x19\xD3V[a\x01\xBBa\x04\x1F6`\x04a2;V[a\x1F\xDDV[4\x80\x15a\x040W`\0\x80\xFD[Pa\x02Ua\x04?6`\x04a3MV[a!0V[4\x80\x15a\x04PW`\0\x80\xFD[Pa\x02Ua\x04_6`\x04a3MV[a!\xA9V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x04\x95WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[`\x02T`@\x80Qc\xDA\x19\xDD\xFB`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\xDA\x19\xDD\xFB\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x11\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x05@\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05]W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x81\x91\x90a3\x97V[\x90P\x90V[`\0\x80`@Q\x80`\xA0\x01`@R\x80\x85`\0\x01Q\x81R` \x01`@Q\x80`@\x01`@R\x80`\x0C\x81R` \x01knaga-keyset1`\xA0\x1B\x81RP\x81R` \x01\x85` \x01Q\x81R` \x01\x85`@\x01Q\x81R` \x01a\x05\xE4a\x04\x9BV[`\x01`\x01`\xA0\x1B\x03\x16\x90R\x90Pa\x05\xFB\x81\x84a\x12\xC3V[\x94\x93PPPPV[`\0a\x06\ra\x19eV[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x95W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`:`$\x82\x01R\x7FPKPHelper: only accepts transfer`D\x82\x01Ry\x1C\xC8\x19\x9C\x9B\xDBH\x1D\x1A\x19H\x14\x12\xD4\x13\x91\x95\x08\x18\xDB\xDB\x9D\x1C\x98X\xDD`2\x1B`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[Pc\n\x85\xBD\x01`\xE1\x1B\x95\x94PPPPPV[`\0a\x06\xB3\x83\x83a\x05\x86V[\x93\x92PPPV[`\0\x90\x81R`\x01` \x81\x90R`@\x90\x91 \x01T\x90V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07\"W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07F\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07u\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\x92W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xB6\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x07\xE6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x07\xF0a\t\x9CV[`@Qc\xB6:vw`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R\x90\x91P`\x01`\x01`\xA0\x1B\x03\x82\x16\x90c\xB6:vw\x90`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x085W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08IW=`\0\x80>=`\0\xFD[PP`@Qc(\xCD\x10\xC7`\xE1\x1B\x81R`\x04\x81\x01\x85\x90R`\x01`\x01`\xA0\x1B\x03\x84\x16\x92PcQ\x9A!\x8E\x91P`$\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x08\x8FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08\xA3W=`\0\x80>=`\0\xFD[PPPPPPV[a\x08\xB4\x82a\x06\xBAV[a\x08\xBD\x81a\"\x07V[a\x08\xC7\x83\x83a\"\x11V[PPPV[`\x02T`@\x80Qc\x12\x0E_\x07`\xE3\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x90r\xF88\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\t\x8EW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FAccessControl: can only renounce`D\x82\x01Rn\x1097\xB62\xB9\x9037\xB9\x109\xB2\xB63`\x89\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a\t\x98\x82\x82a\"|V[PPV[`\x02T`@\x80Qc\x16\xF7k\xBF`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x16\xF7k\xBF\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\t\xF6a\"\xE3V[a\n\0`\0a#BV[V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[`\0\x80a\n_a\x19eV[\x83Q` \x85\x01Q`@Qc?\xF8\x06\x97`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x92c\x7F\xF0\r.\x924\x92a\n\x94\x92`\x04\x01a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\n\xB2W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n\xD7\x91\x90a3jV[\x90P\x82``\x01QQ\x83`@\x01QQ\x14a\x0B\x02W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x82`\xA0\x01QQ\x83`\x80\x01QQ\x14a\x0B+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x82`\xE0\x01QQ\x83`\xC0\x01QQ\x14a\x0BTW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x82a\x01\0\x01QQ\x83`\xC0\x01QQ\x14a\x0B~W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x82a\x01 \x01QQ\x83`\xC0\x01QQ\x14a\x0B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[`@\x83\x01QQ\x15a\x0CtW`\0[\x83`@\x01QQ\x81\x10\x15a\x0CrWa\x0B\xCBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x86`@\x01Q\x84\x81Q\x81\x10a\x0B\xF0Wa\x0B\xF0a6'V[` \x02` \x01\x01Q\x87``\x01Q\x85\x81Q\x81\x10a\x0C\x0EWa\x0C\x0Ea6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0C4\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0CNW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0CbW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0B\xB6\x90PV[P[`\x80\x83\x01QQ\x15a\r@W`\0[\x83`\x80\x01QQ\x81\x10\x15a\r>Wa\x0C\x97a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x86`\x80\x01Q\x84\x81Q\x81\x10a\x0C\xBCWa\x0C\xBCa6'V[` \x02` \x01\x01Q\x87`\xA0\x01Q\x85\x81Q\x81\x10a\x0C\xDAWa\x0C\xDAa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\0\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\x1AW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r.W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x0C\x82\x90PV[P[`\xC0\x83\x01QQ\x15a\x0EbW`\0[\x83`\xC0\x01QQ\x81\x10\x15a\x0E`Wa\rca\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x88`\xC0\x01Q\x86\x81Q\x81\x10a\r\x93Wa\r\x93a6'V[` \x02` \x01\x01Q\x81R` \x01\x88`\xE0\x01Q\x86\x81Q\x81\x10a\r\xB6Wa\r\xB6a6'V[` \x02` \x01\x01Q\x81R` \x01\x88a\x01\0\x01Q\x86\x81Q\x81\x10a\r\xDAWa\r\xDAa6'V[` \x02` \x01\x01Q\x81RP\x87a\x01 \x01Q\x85\x81Q\x81\x10a\r\xFCWa\r\xFCa6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\"\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0E=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\rN\x90PV[P[`\0a\x0Ela\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\x99\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E\xB6W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xDA\x91\x90a3\x97V[\x90P\x83a\x01@\x01Q\x15a\x0F|Wa\x0E\xEFa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0F*W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0FI\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0FcW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0FwW=`\0\x80>=`\0\xFD[PPPP[\x83a\x01`\x01Q\x15a\x0F\xF5Wa\x0F\x8Fa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\xBE\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0F\xD8W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F\xECW=`\0\x80>=`\0\xFD[PPPPa\x10_V[a\x0F\xFDa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x10,\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x10FW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x10ZW=`\0\x80>=`\0\xFD[PPPP[P\x92\x91PPV[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x10\xB8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10\xDC\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x11\x0B\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11(W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11L\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x11|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x11\x86a\t\x9CV[\x82Q\x90\x91P\x15a\x08\xC7W\x80`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x84\x84`\0\x81Q\x81\x10a\x11\xB3Wa\x11\xB3a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x11\xD8\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x11\xF2W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x06W=`\0\x80>=`\0\xFD[PPPP\x80`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x84\x84`\x01\x81Q\x81\x10a\x12-Wa\x12-a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x12R\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x12lW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x12\x80W=`\0\x80>=`\0\xFD[PPPPPPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\0\x91\x82R`\x01` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[\x80Q\x82Q`\0\x91\x14a\x13=W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`>`$\x82\x01R\x7FPKPHelper: Claim key type must m`D\x82\x01R\x7Fatch Auth Method data key type\0\0`d\x82\x01R`\x84\x01a\x06\x8CV[`\x01`\0a\x13Ia\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cq\xAA\x9A\xCF4\x84\x88`\0\x01Q\x89` \x01Q\x8A`@\x01Q\x8B``\x01Q\x8C`\x80\x01Q`@Q\x88c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\x93\x96\x95\x94\x93\x92\x91\x90a7cV[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x13\xB1W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xD6\x91\x90a3jV[\x90P\x83`@\x01QQ\x84` \x01QQ\x14a\x14\x01W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\x9DV[\x83`\x80\x01QQ\x84``\x01QQ\x14a\x14*W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a4\xF3V[\x83`\xC0\x01QQ\x84`\xA0\x01QQ\x14a\x14SW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x83`\xE0\x01QQ\x84`\xA0\x01QQ\x14a\x14|W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x83a\x01\0\x01QQ\x84`\xA0\x01QQ\x14a\x14\xA6W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[` \x84\x01QQ\x15a\x15rW`\0[\x84` \x01QQ\x81\x10\x15a\x15pWa\x14\xC9a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x8AC\x15x\x83\x87` \x01Q\x84\x81Q\x81\x10a\x14\xEEWa\x14\xEEa6'V[` \x02` \x01\x01Q\x88`@\x01Q\x85\x81Q\x81\x10a\x15\x0CWa\x15\x0Ca6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x152\x93\x92\x91\x90a6yV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x15LW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x15`W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x14\xB4\x90PV[P[``\x84\x01QQ\x15a\x16>W`\0[\x84``\x01QQ\x81\x10\x15a\x16=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x15\x80\x90PV[P[`\xA0\x84\x01QQ\x15a\x17_W`\0[\x84`\xA0\x01QQ\x81\x10\x15a\x17]Wa\x16aa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x89`\xA0\x01Q\x86\x81Q\x81\x10a\x16\x91Wa\x16\x91a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xC0\x01Q\x86\x81Q\x81\x10a\x16\xB4Wa\x16\xB4a6'V[` \x02` \x01\x01Q\x81R` \x01\x89`\xE0\x01Q\x86\x81Q\x81\x10a\x16\xD7Wa\x16\xD7a6'V[` \x02` \x01\x01Q\x81RP\x88a\x01\0\x01Q\x85\x81Q\x81\x10a\x16\xF9Wa\x16\xF9a6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x1F\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x179W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x17MW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x16L\x90PV[P[`\0a\x17ia\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x96\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\xB3W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17\xD7\x91\x90a3\x97V[\x90P\x84a\x01 \x01Q\x15a\x18yWa\x17\xECa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x18'W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18F\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18`W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18tW=`\0\x80>=`\0\xFD[PPPP[\x84a\x01@\x01Q\x15a\x18\xF2Wa\x18\x8Ca\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18\xBB\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18\xD5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18\xE9W=`\0\x80>=`\0\xFD[PPPPa\x19\\V[a\x18\xFAa\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x19)\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x19CW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x19WW=`\0\x80>=`\0\xFD[PPPP[P\x94\x93PPPPV[`\x02T`@\x80Qc,\x0B\x8B\xF7`\xE0\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c,\x0B\x8B\xF7\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xEDW=`\0\x80>=`\0\xFD[a\x19\xC0\x82a\x06\xBAV[a\x19\xC9\x81a\"\x07V[a\x08\xC7\x83\x83a\"|V[`\x02T`@\x80Qc!\x0Bs\x9D`\xE1\x1B\x81R\x90Q`\0\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91cB\x16\xE7:\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x1A%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1AI\x91\x90a3jV[`\x02T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x1Ax\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a3\x83V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1A\x95W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1A\xB9\x91\x90a3\x97V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x1A\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a3\xB4V[`\0a\x1A\xF3a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16c\x7F\xF0\r.4\x8D\x8D`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1B!\x92\x91\x90a4\x84V[` `@Q\x80\x83\x03\x81\x85\x88Z\xF1\x15\x80\x15a\x1B?W=`\0\x80>=`\0\xFD[PPPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1Bd\x91\x90a3jV[\x90P\x87Q\x89Q\x14a\x1B\x87W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5HV[\x86Q\x89Q\x14a\x1B\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\x91V[\x85Q\x89Q\x14a\x1B\xC9W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x06\x8C\x90a5\xDCV[\x88Q\x15a\x1C\xD1W`\0[\x89Q\x81\x10\x15a\x1C\xCFWa\x1B\xE4a\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x9D\xD44\x9B\x83`@Q\x80``\x01`@R\x80\x8E\x86\x81Q\x81\x10a\x1C\x10Wa\x1C\x10a6'V[` \x02` \x01\x01Q\x81R` \x01\x8D\x86\x81Q\x81\x10a\x1C/Wa\x1C/a6'V[` \x02` \x01\x01Q\x81R` \x01\x8C\x86\x81Q\x81\x10a\x1CNWa\x1CNa6'V[` \x02` \x01\x01Q\x81RP\x8A\x85\x81Q\x81\x10a\x1CkWa\x1Cka6'V[` \x02` \x01\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\x91\x93\x92\x91\x90a6\xE1V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1C\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1C\xBFW=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x1B\xD3\x90PV[P[`\0a\x1C\xDBa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\xBDI\x86\xA0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\x08\x91\x81R` \x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1D%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1DI\x91\x90a3\x97V[\x90P\x84\x15a\x1D\xE6Wa\x1DYa\x08\xCCV[`\x01`\x01`\xA0\x1B\x03\x16c\x16c\xC1!\x83\x83`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x1D\x94W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\xB3\x93\x92\x91\x90a6\xAEV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1D\xCDW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1D\xE1W=`\0\x80>=`\0\xFD[PPPP[\x83\x15a\x1EZWa\x1D\xF4a\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E0\x83\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E#\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E=W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1EQW=`\0\x80>=`\0\xFD[PPPPa\x1E\xC4V[a\x1Eba\x19eV[`\x01`\x01`\xA0\x1B\x03\x16cB\x84.\x0E03\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E\x91\x93\x92\x91\x90a7?V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1E\xBFW=`\0\x80>=`\0\xFD[PPPP[\x85Q\x15a\x1F\xCEWa\x1E\xD3a\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x85^\xEC\"\x83\x88`\0\x81Q\x81\x10a\x1E\xF5Wa\x1E\xF5a6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x1A\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F4W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1FHW=`\0\x80>=`\0\xFD[PPPPa\x1FTa\t\x9CV[`\x01`\x01`\xA0\x1B\x03\x16c\x90\0\xFE\xE1\x83\x88`\x01\x81Q\x81\x10a\x1FvWa\x1Fva6'V[` \x02` \x01\x01Q`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1F\x9B\x92\x91\x90a4\x84V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1F\xB5W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1F\xC9W=`\0\x80>=`\0\xFD[PPPP[P\x9A\x99PPPPPPPPPPV[`\0\x80`@Q\x80a\x01\x80\x01`@R\x80\x8B\x81R` \x01\x8A\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x81\x11\x15a \x11Wa \x11a%\xD6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a DW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a /W\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \x7FW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a jW\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xB0W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x81R` \x01`\0`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a \xEBW\x81` \x01[``\x81R` \x01\x90`\x01\x90\x03\x90\x81a \xD6W\x90P[P\x81R` \x01\x89\x81R` \x01\x88\x81R` \x01\x87\x81R` \x01\x86\x81R` \x01\x85\x15\x15\x81R` \x01\x84\x15\x15\x81RP\x90Pa!\"\x81a\nTV[\x9A\x99PPPPPPPPPPV[a!8a\"\xE3V[`\x01`\x01`\xA0\x1B\x03\x81\x16a!\x9DW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`&`$\x82\x01R\x7FOwnable: new owner is the zero a`D\x82\x01Reddress`\xD0\x1B`d\x82\x01R`\x84\x01a\x06\x8CV[a!\xA6\x81a#BV[PV[a!\xB1a\"\xE3V[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x17\x90U`@Q\x7F'`\x07<|\xD8\xCA\xC51\xD7\xF6C\xBE\xCB\xFB\xB7M\x8B\x81VD>\xAC\xF8yb%2\xDB\xBB<\xD5\x90a!\xFC\x90\x83\x90a%\xC2V[`@Q\x80\x91\x03\x90\xA1PV[a!\xA6\x813a#\x92V[a\"\x1B\x82\x82a\x12\x98V[a\t\x98W`\0\x82\x81R`\x01` \x81\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x86\x16\x80\x86R\x92R\x80\x84 \x80T`\xFF\x19\x16\x90\x93\x17\x90\x92U\x90Q3\x92\x85\x91\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r\x91\x90\xA4PPV[a\"\x86\x82\x82a\x12\x98V[\x15a\t\x98W`\0\x82\x81R`\x01` \x90\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x85\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x85\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4PPV[3a\"\xECa\x12\x89V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\n\0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FOwnable: caller is not the owner`D\x82\x01R`d\x01a\x06\x8CV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[a#\x9C\x82\x82a\x12\x98V[a\t\x98Wa#\xA9\x81a#\xEBV[a#\xB4\x83` a#\xFDV[`@Q` \x01a#\xC5\x92\x91\x90a8\x03V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90RbF\x1B\xCD`\xE5\x1B\x82Ra\x06\x8C\x91`\x04\x01a8rV[``a\x04\x95`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14[```\0a$\x0C\x83`\x02a8\x9BV[a$\x17\x90`\x02a8\xB2V[`\x01`\x01`@\x1B\x03\x81\x11\x15a$.Wa$.a%\xD6V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a$XW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a$sWa$sa6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a$\xA2Wa$\xA2a6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a$\xC6\x84`\x02a8\x9BV[a$\xD1\x90`\x01a8\xB2V[\x90P[`\x01\x81\x11\x15a%IWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a%\x05Wa%\x05a6'V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a%\x1BWa%\x1Ba6'V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a%B\x81a8\xC5V[\x90Pa$\xD4V[P\x83\x15a\x06\xB3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x06\x8CV[`\0` \x82\x84\x03\x12\x15a%\xAAW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x06\xB3W`\0\x80\xFD[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@R\x90V[`@Qa\x01`\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Qa\x01\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\x0EWa&\x0Ea%\xD6V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&\xA4Wa&\xA4a%\xD6V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a&\xC5Wa&\xC5a%\xD6V[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a&\xE0W`\0\x80\xFD[\x815a&\xF3a&\xEE\x82a&\xACV[a&|V[\x80\x82\x82R` \x82\x01\x91P` ``\x84\x02\x86\x01\x01\x92P\x85\x83\x11\x15a'\x15W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW``\x81\x88\x03\x12\x15a'2W`\0\x80\xFD[a':a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\xFF\x81\x16\x81\x14a'\\W`\0\x80\xFD[`@\x82\x01R\x83R` \x90\x92\x01\x91``\x01a'\x1AV[P\x95\x94PPPPPV[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a'\x95Wa'\x95a%\xD6V[P`\x1F\x83\x01`\x1F\x19\x16` \x01a'\xAA\x81a&|V[\x91PP\x82\x81R\x83\x83\x83\x01\x11\x15a'\xBFW`\0\x80\xFD[\x82\x82` \x83\x017`\0` \x84\x83\x01\x01R\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a'\xE7W`\0\x80\xFD[\x815a'\xF5a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\x17W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a(:W`\0\x80\xFD[\x86\x01`?\x81\x01\x88\x13a(KW`\0\x80\xFD[a(]\x88` \x83\x015`@\x84\x01a'{V[\x84RP` \x92\x83\x01\x92\x01a(\x1CV[`\0\x82`\x1F\x83\x01\x12a(}W`\0\x80\xFD[\x815a(\x8Ba&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a(\xADW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805\x83R` \x92\x83\x01\x92\x01a(\xB2V[`\0\x82`\x1F\x83\x01\x12a(\xDBW`\0\x80\xFD[\x815a(\xE9a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\x0BW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a).W`\0\x80\xFD[a)=\x88` \x83\x8A\x01\x01a(lV[\x84RP` \x92\x83\x01\x92\x01a)\x10V[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a!\xA6W`\0\x80\xFD[`\0\x82`\x1F\x83\x01\x12a)rW`\0\x80\xFD[\x815a)\x80a&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a)\xA2W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805a)\xBA\x81a)LV[\x83R` \x92\x83\x01\x92\x01a)\xA7V[\x805\x80\x15\x15\x81\x14a)\xD8W`\0\x80\xFD[\x91\x90PV[`\0a\x01`\x82\x84\x03\x12\x15a)\xF0W`\0\x80\xFD[a)\xF8a&\x14V[\x825\x81R\x90P` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x17W`\0\x80\xFD[a*#\x84\x82\x85\x01a'\xD6V[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*BW`\0\x80\xFD[a*N\x84\x82\x85\x01a(\xCAV[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*mW`\0\x80\xFD[a*y\x84\x82\x85\x01a)aV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x98W`\0\x80\xFD[a*\xA4\x84\x82\x85\x01a(\xCAV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xC3W`\0\x80\xFD[a*\xCF\x84\x82\x85\x01a(lV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a*\xEEW`\0\x80\xFD[a*\xFA\x84\x82\x85\x01a'\xD6V[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\x19W`\0\x80\xFD[a+%\x84\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+EW`\0\x80\xFD[a+Q\x84\x82\x85\x01a(\xCAV[a\x01\0\x83\x01RPa+ea\x01 \x83\x01a)\xC8V[a\x01 \x82\x01Ra+xa\x01@\x83\x01a)\xC8V[a\x01@\x82\x01R\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15a+\x97W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xADW`\0\x80\xFD[\x83\x01``\x81\x86\x03\x12\x15a+\xBFW`\0\x80\xFD[a+\xC7a%\xECV[\x815\x81R` \x80\x83\x015\x90\x82\x01R`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a+\xEEW`\0\x80\xFD[a+\xFA\x87\x82\x85\x01a&\xCFV[`@\x83\x01RP\x92PP` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[a,(\x85\x82\x86\x01a)\xDDV[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80`\0`\x80\x86\x88\x03\x12\x15a,JW`\0\x80\xFD[\x855a,U\x81a)LV[\x94P` \x86\x015a,e\x81a)LV[\x93P`@\x86\x015\x92P``\x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x87W`\0\x80\xFD[\x86\x01`\x1F\x81\x01\x88\x13a,\x98W`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a,\xAEW`\0\x80\xFD[\x88` \x82\x84\x01\x01\x11\x15a,\xC0W`\0\x80\xFD[\x95\x98\x94\x97P\x92\x95PPP` \x01\x91\x90V[`\0` \x82\x84\x03\x12\x15a,\xE3W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a,\xFDW`\0\x80\xFD[\x825\x91P` \x83\x015a-\x0F\x81a)LV[\x80\x91PP\x92P\x92\x90PV[`\0\x82`\x1F\x83\x01\x12a-+W`\0\x80\xFD[a\x06\xB3\x83\x835` \x85\x01a'{V[`\0` \x82\x84\x03\x12\x15a-LW`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a-bW`\0\x80\xFD[\x82\x01a\x01\x80\x81\x85\x03\x12\x15a-uW`\0\x80\xFD[a-}a&7V[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\x9AW`\0\x80\xFD[a-\xA6\x86\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xC5W`\0\x80\xFD[a-\xD1\x86\x82\x85\x01a'\xD6V[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a-\xF0W`\0\x80\xFD[a-\xFC\x86\x82\x85\x01a(\xCAV[``\x83\x01RP`\x80\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x1BW`\0\x80\xFD[a.'\x86\x82\x85\x01a)aV[`\x80\x83\x01RP`\xA0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.FW`\0\x80\xFD[a.R\x86\x82\x85\x01a(\xCAV[`\xA0\x83\x01RP`\xC0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.qW`\0\x80\xFD[a.}\x86\x82\x85\x01a(lV[`\xC0\x83\x01RP`\xE0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\x9CW`\0\x80\xFD[a.\xA8\x86\x82\x85\x01a'\xD6V[`\xE0\x83\x01RPa\x01\0\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xC8W`\0\x80\xFD[a.\xD4\x86\x82\x85\x01a'\xD6V[a\x01\0\x83\x01RPa\x01 \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a.\xF5W`\0\x80\xFD[a/\x01\x86\x82\x85\x01a(\xCAV[a\x01 \x83\x01RPa/\x15a\x01@\x83\x01a)\xC8V[a\x01@\x82\x01Ra/(a\x01`\x83\x01a)\xC8V[a\x01`\x82\x01R\x94\x93PPPPV[`\0\x82`\x1F\x83\x01\x12a/GW`\0\x80\xFD[\x815a/Ua&\xEE\x82a&\xACV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15a/wW`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15a'qW\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a/\x9AW`\0\x80\xFD[a/\xA9\x88` \x83\x8A\x01\x01a-\x1AV[\x84RP` \x92\x83\x01\x92\x01a/|V[`\0\x80`@\x83\x85\x03\x12\x15a/\xCBW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a/\xE8W`\0\x80\xFD[a,(\x85\x82\x86\x01a/6V[`\0\x80`@\x83\x85\x03\x12\x15a0\x07W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x1DW`\0\x80\xFD[\x83\x01`\xA0\x81\x86\x03\x12\x15a0/W`\0\x80\xFD[a07a&ZV[\x815\x81R` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0TW`\0\x80\xFD[a0`\x87\x82\x85\x01a-\x1AV[` \x83\x01RP`@\x82\x81\x015\x90\x82\x01R``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a0\x89W`\0\x80\xFD[a0\x95\x87\x82\x85\x01a&\xCFV[``\x83\x01RP`\x80\x82\x015\x91Pa0\xAB\x82a)LV[`\x80\x81\x01\x91\x90\x91R\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a,\x1CW`\0\x80\xFD[`\x03\x81\x10a0\xECWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x04\x95\x82\x84a0\xCEV[`\0\x80`\0\x80`\0\x80`\0\x80`\0a\x01 \x8A\x8C\x03\x12\x15a1\x1DW`\0\x80\xFD[\x895\x98P` \x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1:W`\0\x80\xFD[a1F\x8C\x82\x8D\x01a-\x1AV[\x98PP`@\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1bW`\0\x80\xFD[a1n\x8C\x82\x8D\x01a(lV[\x97PP``\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\x8AW`\0\x80\xFD[a1\x96\x8C\x82\x8D\x01a'\xD6V[\x96PP`\x80\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xB2W`\0\x80\xFD[a1\xBE\x8C\x82\x8D\x01a'\xD6V[\x95PP`\xA0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a1\xDAW`\0\x80\xFD[a1\xE6\x8C\x82\x8D\x01a(\xCAV[\x94PP`\xC0\x8A\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x02W`\0\x80\xFD[a2\x0E\x8C\x82\x8D\x01a/6V[\x93PPa2\x1D`\xE0\x8B\x01a)\xC8V[\x91Pa2,a\x01\0\x8B\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98P\x92\x95\x98V[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15a2XW`\0\x80\xFD[\x885\x97P` \x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2uW`\0\x80\xFD[a2\x81\x8B\x82\x8C\x01a-\x1AV[\x97PP`@\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\x9DW`\0\x80\xFD[a2\xA9\x8B\x82\x8C\x01a(lV[\x96PP``\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xC5W`\0\x80\xFD[a2\xD1\x8B\x82\x8C\x01a'\xD6V[\x95PP`\x80\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a2\xEDW`\0\x80\xFD[a2\xF9\x8B\x82\x8C\x01a'\xD6V[\x94PP`\xA0\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a3\x15W`\0\x80\xFD[a3!\x8B\x82\x8C\x01a(\xCAV[\x93PPa30`\xC0\x8A\x01a)\xC8V[\x91Pa3>`\xE0\x8A\x01a)\xC8V[\x90P\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[`\0` \x82\x84\x03\x12\x15a3_W`\0\x80\xFD[\x815a\x06\xB3\x81a)LV[`\0` \x82\x84\x03\x12\x15a3|W`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xB3` \x83\x01\x84a0\xCEV[`\0` \x82\x84\x03\x12\x15a3\xA9W`\0\x80\xFD[\x81Qa\x06\xB3\x81a)LV[` \x80\x82R`Z\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rymain wallets, who are you?`0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\0[\x83\x81\x10\x15a4OW\x81\x81\x01Q\x83\x82\x01R` \x01a47V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra4p\x81` \x86\x01` \x86\x01a44V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[\x82\x81R`@` \x82\x01R`\0a\x05\xFB`@\x83\x01\x84a4XV[` \x80\x82R`6\x90\x82\x01R\x7FPKPHelper: ipfs cid and scope ar`@\x82\x01Ru\x0EL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`S\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`5\x90\x82\x01R\x7FPKPHelper: address and scope arr`@\x82\x01Rt\x0C/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`[\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`;\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01Rz\r,\x84\x0C.NL/$\r\x8C\xAD\xCC\xEE\x8D\x0Ed\r\xAE\xAEn\x84\r\xAC.\x8Cm`+\x1B``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fpubkey array lengths must match\0``\x82\x01R`\x80\x01\x90V[` \x80\x82R`?\x90\x82\x01R`\0\x80Q` a8\xDD\x839\x81Q\x91R`@\x82\x01R\x7Fscopes array lengths must match\0``\x82\x01R`\x80\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81Q\x80\x84R` \x84\x01\x93P` \x83\x01`\0[\x82\x81\x10\x15a6oW\x81Q\x86R` \x95\x86\x01\x95\x90\x91\x01\x90`\x01\x01a6QV[P\x93\x94\x93PPPPV[\x83\x81R``` \x82\x01R`\0a6\x92``\x83\x01\x85a4XV[\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[\x96\x95PPPPPPV[\x83\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R```@\x82\x01\x81\x90R`\0\x90a6\xD8\x90\x83\x01\x84a6=V[\x95\x94PPPPPV[\x83\x81R``` \x82\x01R\x82Q``\x82\x01R`\0` \x84\x01Q```\x80\x84\x01Ra7\r`\xC0\x84\x01\x82a4XV[\x90P`@\x85\x01Q`_\x19\x84\x83\x03\x01`\xA0\x85\x01Ra7*\x82\x82a4XV[\x91PP\x82\x81\x03`@\x84\x01Ra6\xA4\x81\x85a6=V[`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x81R\x91\x90\x92\x16` \x82\x01R`@\x81\x01\x91\x90\x91R``\x01\x90V[\x86\x81R\x85` \x82\x01R`\xC0`@\x82\x01R`\0a7\x82`\xC0\x83\x01\x87a4XV[``\x83\x01\x86\x90R\x82\x81\x03`\x80\x84\x01R\x84Q\x80\x82R` \x80\x87\x01\x92\x01\x90`\0[\x81\x81\x10\x15a7\xDEW\x83Q\x80Q\x84R` \x81\x01Q` \x85\x01R`\xFF`@\x82\x01Q\x16`@\x85\x01RP``\x83\x01\x92P` \x84\x01\x93P`\x01\x81\x01\x90Pa7\xA1V[PP`\x01`\x01`\xA0\x1B\x03\x85\x16`\xA0\x85\x01R\x91Pa7\xF8\x90PV[\x97\x96PPPPPPPV[v\x02\x0B\x1B\x1B+\x9B\x9A\x1B{s\xA3\x93{a\xD1\x03\x0B\x1B\x1B{\xABs\xA1`M\x1B\x81R`\0\x83Qa85\x81`\x17\x85\x01` \x88\x01a44V[p\x01\x03K\x99\x03kK\x9B\x9BKs9\x03\x93{c)`}\x1B`\x17\x91\x84\x01\x91\x82\x01R\x83Qa8f\x81`(\x84\x01` \x88\x01a44V[\x01`(\x01\x94\x93PPPPV[` \x81R`\0a\x06\xB3` \x83\x01\x84a4XV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x04\x95Wa\x04\x95a8\x85V[\x80\x82\x01\x80\x82\x11\x15a\x04\x95Wa\x04\x95a8\x85V[`\0\x81a8\xD4Wa8\xD4a8\x85V[P`\0\x19\x01\x90V\xFEPKPHelper: auth method type and \xA2dipfsX\"\x12 n\xD3\xA9v]n{\x1D\x8Fu`\xE6\xB2v\x01r\xCEl\xF0\xF5`Q\x8A\x13/\xC0\xCD\x9F\x1AX\xB8\xF8dsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static PKPHELPER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __DEPLOYED_BYTECODE, diff --git a/rust/lit-core/lit-blockchain/src/contracts/pkpnft_metadata.rs b/rust/lit-core/lit-blockchain/src/contracts/pkpnft_metadata.rs index 206405a6..b8ff1989 100644 --- a/rust/lit-core/lit-blockchain/src/contracts/pkpnft_metadata.rs +++ b/rust/lit-core/lit-blockchain/src/contracts/pkpnft_metadata.rs @@ -269,13 +269,13 @@ pub mod pkpnft_metadata { __abi, ); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15`\x0FW`\0\x80\xFD[P`@Qa\x1C}8\x03\x80a\x1C}\x839\x81\x01`@\x81\x90R`,\x91`vV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x84\x16`\x01`\x01`\xA0\x1B\x03\x19\x82\x16\x81\x17\x83U\x83\x92\x91`\x01`\x01`\xA8\x1B\x03\x19\x16\x17`\x01`\xA0\x1B\x83`\x02\x81\x11\x15`kW`k`\xBDV[\x02\x17\x90UPPP`\xD3V[`\0\x80`@\x83\x85\x03\x12\x15`\x88W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14`\x9EW`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x03\x81\x10`\xB2W`\0\x80\xFD[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[a\x1B\x9B\x80a\0\xE2`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0xW`\x005`\xE0\x1C\x80cE\x1D\x89\xFA\x14a\0}W\x80cP\xD1{^\x14a\0\xA6W\x80cQ\x9A!\x8E\x14a\0\xD1W\x80c\x85^\xEC\"\x14a\0\xE6W\x80c\x90\0\xFE\xE1\x14a\0\xF9W\x80c\x95\x04b\xEE\x14a\x01\x0CW\x80c\x9D\xCA\x002\x14a\x01\x1FW\x80c\xB6:vw\x14a\x01@W[`\0\x80\xFD[a\0\x90a\0\x8B6`\x04a\x0F\xB0V[a\x01SV[`@Qa\0\x9D\x91\x90a\x10\x10V[`@Q\x80\x91\x03\x90\xF3[`\0Ta\0\xB9\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\x9DV[a\0\xE4a\0\xDF6`\x04a\x10CV[a\x03\x0CV[\0[a\0\xE4a\0\xF46`\x04a\x10\\V[a\x04VV[a\0\xE4a\x01\x076`\x04a\x10\\V[a\x05\x89V[a\0\x90a\x01\x1A6`\x04a\x10\xCEV[a\x06\xB7V[`\0Ta\x013\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\x9D\x91\x90a\x11JV[a\0\xE4a\x01N6`\x04a\x10CV[a\x06\xF3V[```\0\x82Q`\x02a\x01e\x91\x90a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x01|Wa\x01|a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x01\xA6W` \x82\x01\x81\x806\x837\x01\x90P[P`@\x80Q\x80\x82\x01\x90\x91R`\x10\x81Ro\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B` \x82\x01R\x90\x91P`\0[\x84Q\x81\x10\x15a\x02\xE2W\x81\x82Q\x86\x83\x81Q\x81\x10a\x01\xF2Wa\x01\xF2a\x11\x85V[\x01` \x01Qa\x02\x04\x91\x90`\xF8\x1Ca\x11\xB1V[\x81Q\x81\x10a\x02\x14Wa\x02\x14a\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02/\x83`\x02a\x11nV[\x81Q\x81\x10a\x02?Wa\x02?a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP\x81\x82Q\x86\x83\x81Q\x81\x10a\x02kWa\x02ka\x11\x85V[\x01` \x01Qa\x02}\x91\x90`\xF8\x1Ca\x11\xC5V[\x81Q\x81\x10a\x02\x8DWa\x02\x8Da\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02\xA8\x83`\x02a\x11nV[a\x02\xB3\x90`\x01a\x11\xD9V[\x81Q\x81\x10a\x02\xC3Wa\x02\xC3a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x01\x01a\x01\xD4V[P\x81`@Q` \x01a\x02\xF4\x91\x90a\x12\x08V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92PPP\x91\x90PV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x03^W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\x82\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x03\xB1\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xCEW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xF2\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x04+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@Q\x80\x91\x03\x90\xFD[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x01\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[PPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xA8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xCC\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x04\xFB\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05\x18W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05<\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x05lW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x01` R`@\x90 a\x05\x84\x82\x82a\x13vV[PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x05\xDBW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\xFF\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x06.\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06KW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06o\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x9FW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x02` R`@\x90 a\x05\x84\x82\x82a\x13vV[```\0a\x06\xC6\x85\x85\x85a\x080V[\x90P\x80`@Q` \x01a\x06\xD9\x91\x90a\x144V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP[\x93\x92PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07EW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07i\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07\x98\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xB5W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xD9\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\tW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x02\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[```\0`@Q\x80a\x04\x80\x01`@R\x80a\x04V\x81R` \x01a\x16\xD0a\x04V\x919\x90P`\0a\x08]\x85a\x01SV[\x90P`\0a\x08j\x85a\n\x84V[\x90P`\0a\x08w\x88a\n\xA0V[`\0\x89\x81R`\x01` R`@\x81 \x80T\x92\x93P\x90\x91a\x08\x95\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x08\xC1\x90a\x12\xEEV[\x80\x15a\t\x0EW\x80`\x1F\x10a\x08\xE3Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\x0EV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x08\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P`\0`\x02`\0\x8B\x81R` \x01\x90\x81R` \x01`\0 \x80Ta\t5\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\ta\x90a\x12\xEEV[\x80\x15a\t\xAEW\x80`\x1F\x10a\t\x83Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\xAEV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\t\x91W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x81Q`\0\x14\x80\x15a\t\xC6WP\x80Q\x15\x15[\x15a\t\xF2W\x82`@Q` \x01a\t\xDC\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91Pa\nFV[\x81Q\x15\x80\x15\x90a\n\x01WP\x80Q\x15[\x15a\n\rWP\x84a\nFV[\x81Q\x15\x80\x15a\n\x1BWP\x80Q\x15[\x15a\nFW\x82`@Q` \x01a\n1\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P\x85\x90P[a\nv\x82\x82\x87\x87\x87`@Q` \x01a\nb\x95\x94\x93\x92\x91\x90a\x14\xAAV[`@Q` \x81\x83\x03\x03\x81R\x90`@Ra\x0B2V[\x9A\x99PPPPPPPPPPV[``a\n\x9A`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14a\x0C\x91V[\x92\x91PPV[```\0a\n\xAD\x83a\x0E,V[`\x01\x01\x90P`\0\x81`\x01`\x01`@\x1B\x03\x81\x11\x15a\n\xCCWa\n\xCCa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\n\xF6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P\x81\x81\x01` \x01[`\0\x19\x01o\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B`\n\x86\x06\x1A\x81S`\n\x85\x04\x94P\x84a\x0B\0WP\x93\x92PPPV[``\x81Q`\0\x03a\x0BQWPP`@\x80Q` \x81\x01\x90\x91R`\0\x81R\x90V[`\0`@Q\x80``\x01`@R\x80`@\x81R` \x01a\x1B&`@\x919\x90P`\0`\x03\x84Q`\x02a\x0B\x80\x91\x90a\x11\xD9V[a\x0B\x8A\x91\x90a\x11\xB1V[a\x0B\x95\x90`\x04a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xACWa\x0B\xACa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0B\xD6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x01\x82\x01` \x82\x01\x85\x86Q\x87\x01` \x81\x01\x80Q`\0\x82R[\x82\x84\x10\x15a\x0CLW`\x03\x84\x01\x93P\x83Q`?\x81`\x12\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x0C\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x06\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81\x16\x87\x01Q\x86SP`\x01\x85\x01\x94Pa\x0B\xF1V[\x90RPP\x85Q`\x03\x90\x06`\x01\x81\x14a\x0CkW`\x02\x81\x14a\x0C~Wa\x0C\x86V[`=`\x01\x83\x03S`=`\x02\x83\x03Sa\x0C\x86V[`=`\x01\x83\x03S[P\x91\x95\x94PPPPPV[```\0a\x0C\xA0\x83`\x02a\x11nV[a\x0C\xAB\x90`\x02a\x11\xD9V[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0C\xC2Wa\x0C\xC2a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0C\xECW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\x07Wa\r\x07a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r6Wa\r6a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\rZ\x84`\x02a\x11nV[a\re\x90`\x01a\x11\xD9V[\x90P[`\x01\x81\x11\x15a\r\xDDWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\r\x99Wa\r\x99a\x11\x85V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\r\xAFWa\r\xAFa\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\r\xD6\x81a\x16\xB8V[\x90Pa\rhV[P\x83\x15a\x06\xECW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x04\"V[`\0\x80r\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x10a\x0EkWr\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x04\x92P`@\x01[i\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x10a\x0E\x95Wi\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x04\x92P` \x01[f#\x86\xF2o\xC1\0\0\x83\x10a\x0E\xB3Wf#\x86\xF2o\xC1\0\0\x83\x04\x92P`\x10\x01[c\x05\xF5\xE1\0\x83\x10a\x0E\xCBWc\x05\xF5\xE1\0\x83\x04\x92P`\x08\x01[a'\x10\x83\x10a\x0E\xDFWa'\x10\x83\x04\x92P`\x04\x01[`d\x83\x10a\x0E\xF1W`d\x83\x04\x92P`\x02\x01[`\n\x83\x10a\n\x9AW`\x01\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a\x0F2Wa\x0F2a\x0F\x02V[P`@Q`\x1F\x19`\x1F\x85\x01\x81\x16`?\x01\x16\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a\x0F`Wa\x0F`a\x0F\x02V[`@R\x83\x81R\x90P\x80\x82\x84\x01\x85\x10\x15a\x0FxW`\0\x80\xFD[\x83\x83` \x83\x017`\0` \x85\x83\x01\x01RP\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a\x0F\xA1W`\0\x80\xFD[a\x06\xEC\x83\x835` \x85\x01a\x0F\x18V[`\0` \x82\x84\x03\x12\x15a\x0F\xC2W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0F\xD8W`\0\x80\xFD[a\x0F\xE4\x84\x82\x85\x01a\x0F\x90V[\x94\x93PPPPV[`\0[\x83\x81\x10\x15a\x10\x07W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0F\xEFV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x10/\x81`@\x85\x01` \x87\x01a\x0F\xECV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x10UW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x10oW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x10\x8CW`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a\x10\x9DW`\0\x80\xFD[a\x10\xAC\x85\x825` \x84\x01a\x0F\x18V[\x91PP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x10\xCBW`\0\x80\xFD[PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x10\xE3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x11\0W`\0\x80\xFD[a\x11\x0C\x86\x82\x87\x01a\x0F\x90V[\x92PP`@\x84\x015a\x11\x1D\x81a\x10\xB6V[\x80\x91PP\x92P\x92P\x92V[`\x03\x81\x10a\x11FWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\n\x9A\x82\x84a\x11(V[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\n\x9AWa\n\x9Aa\x11XV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a\x11\xC0Wa\x11\xC0a\x11\x9BV[P\x04\x90V[`\0\x82a\x11\xD4Wa\x11\xD4a\x11\x9BV[P\x06\x90V[\x80\x82\x01\x80\x82\x11\x15a\n\x9AWa\n\x9Aa\x11XV[`\0\x81Qa\x11\xFE\x81\x85` \x86\x01a\x0F\xECV[\x92\x90\x92\x01\x92\x91PPV[a\x06\x0F`\xF3\x1B\x81R`\0\x82Qa\x12%\x81`\x02\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x02\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x12DW`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xEC` \x83\x01\x84a\x11(V[`\0` \x82\x84\x03\x12\x15a\x12qW`\0\x80\xFD[\x81Qa\x06\xEC\x81a\x10\xB6V[` \x80\x82R`L\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rkmain wallets`\xA0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x13\x02W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x13\"WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x05\x84W\x80`\0R` `\0 `\x1F\x84\x01`\x05\x1C\x81\x01` \x85\x10\x15a\x13OWP\x80[`\x1F\x84\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a\x13oW`\0\x81U`\x01\x01a\x13[V[PPPPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\x13\x8FWa\x13\x8Fa\x0F\x02V[a\x13\xA3\x81a\x13\x9D\x84Ta\x12\xEEV[\x84a\x13(V[` `\x1F\x82\x11`\x01\x81\x14a\x13\xD7W`\0\x83\x15a\x13\xBFWP\x84\x82\x01Q[`\0\x19`\x03\x85\x90\x1B\x1C\x19\x16`\x01\x84\x90\x1B\x17\x84Ua\x13oV[`\0\x84\x81R` \x81 `\x1F\x19\x85\x16\x91[\x82\x81\x10\x15a\x14\x07W\x87\x85\x01Q\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01a\x13\xE7V[P\x84\x82\x10\x15a\x14%W\x86\x84\x01Q`\0\x19`\x03\x87\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPP`\x01\x90\x81\x1B\x01\x90UPV[\x7Fdata:application/json;base64,\0\0\0\x81R`\0\x82Qa\x14l\x81`\x1D\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x1D\x01\x92\x91PPV[hLit PKP #`\xB8\x1B\x81R`\0\x82Qa\x14\x9D\x81`\t\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\t\x01\x92\x91PPV[h=\x9170\xB6\xB2\x91\x1D\x11`\xB9\x1B\x81R\x85Q`\0\x90a\x14\xCF\x81`\t\x85\x01` \x8B\x01a\x0F\xECV[\x7F\", \"description\": \"This NFT enti`\t\x91\x84\x01\x91\x82\x01R\x7Ftles the holder to use a Lit Pro`)\x82\x01R\x7Ftocol PKP, and to grant access t`I\x82\x01R\x7Fo other users and Lit Actions to`i\x82\x01R\x7F use this PKP\",\"image_data\": \"\0\0`\x89\x82\x01R\x86Qa\x15\xA4\x81`\xA7\x84\x01` \x8B\x01a\x0F\xECV[`\t\x81\x83\x01\x01\x91PP\x7F\",\"attributes\": [{\"trait_type\": `\x9E\x82\x01Rw\x11(:\xB164\xB1\x90%\xB2\xBC\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`A\x1B`\xBE\x82\x01Ra\x16\xACa\x16\x9Ca\x16\x96a\x16[a\x16Ua\x16\x10`\xD6\x87\x01\x8Ca\x11\xECV[\x7F\"}, {\"trait_type\": \"ETH Wallet A\x81Rr2292\xB9\xB9\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`i\x1B` \x82\x01R`3\x01\x90V[\x89a\x11\xECV[\x7F\"}, {\"trait_type\": \"Token ID\", \"\x81Rh;0\xB6:\xB2\x91\x1D\x10\x11`\xB9\x1B` \x82\x01R`)\x01\x90V[\x86a\x11\xECV[c\"}]}`\xE0\x1B\x81R`\x04\x01\x90V[\x98\x97PPPPPPPPV[`\0\x81a\x16\xC7Wa\x16\xC7a\x11XV[P`\0\x19\x01\x90V\xFEABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\xA2dipfsX\"\x12 \x8F\x13\x99\xB0\x85\xBF\xFD\xE0ex\xF1\xDD\x04\xAD6!~\xEDG\xFB\xA0mu\xA3\x1F\\\xE9\xE6qQx\x82dsolcC\0\x08\x1C\x003"; + const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15`\x0FW`\0\x80\xFD[P`@Qa\x1C}8\x03\x80a\x1C}\x839\x81\x01`@\x81\x90R`,\x91`vV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x84\x16`\x01`\x01`\xA0\x1B\x03\x19\x82\x16\x81\x17\x83U\x83\x92\x91`\x01`\x01`\xA8\x1B\x03\x19\x16\x17`\x01`\xA0\x1B\x83`\x02\x81\x11\x15`kW`k`\xBDV[\x02\x17\x90UPPP`\xD3V[`\0\x80`@\x83\x85\x03\x12\x15`\x88W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14`\x9EW`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x03\x81\x10`\xB2W`\0\x80\xFD[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[a\x1B\x9B\x80a\0\xE2`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0xW`\x005`\xE0\x1C\x80cE\x1D\x89\xFA\x14a\0}W\x80cP\xD1{^\x14a\0\xA6W\x80cQ\x9A!\x8E\x14a\0\xD1W\x80c\x85^\xEC\"\x14a\0\xE6W\x80c\x90\0\xFE\xE1\x14a\0\xF9W\x80c\x95\x04b\xEE\x14a\x01\x0CW\x80c\x9D\xCA\x002\x14a\x01\x1FW\x80c\xB6:vw\x14a\x01@W[`\0\x80\xFD[a\0\x90a\0\x8B6`\x04a\x0F\xB0V[a\x01SV[`@Qa\0\x9D\x91\x90a\x10\x10V[`@Q\x80\x91\x03\x90\xF3[`\0Ta\0\xB9\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\x9DV[a\0\xE4a\0\xDF6`\x04a\x10CV[a\x03\x0CV[\0[a\0\xE4a\0\xF46`\x04a\x10\\V[a\x04VV[a\0\xE4a\x01\x076`\x04a\x10\\V[a\x05\x89V[a\0\x90a\x01\x1A6`\x04a\x10\xCEV[a\x06\xB7V[`\0Ta\x013\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\x9D\x91\x90a\x11JV[a\0\xE4a\x01N6`\x04a\x10CV[a\x06\xF3V[```\0\x82Q`\x02a\x01e\x91\x90a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x01|Wa\x01|a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x01\xA6W` \x82\x01\x81\x806\x837\x01\x90P[P`@\x80Q\x80\x82\x01\x90\x91R`\x10\x81Ro\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B` \x82\x01R\x90\x91P`\0[\x84Q\x81\x10\x15a\x02\xE2W\x81\x82Q\x86\x83\x81Q\x81\x10a\x01\xF2Wa\x01\xF2a\x11\x85V[\x01` \x01Qa\x02\x04\x91\x90`\xF8\x1Ca\x11\xB1V[\x81Q\x81\x10a\x02\x14Wa\x02\x14a\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02/\x83`\x02a\x11nV[\x81Q\x81\x10a\x02?Wa\x02?a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP\x81\x82Q\x86\x83\x81Q\x81\x10a\x02kWa\x02ka\x11\x85V[\x01` \x01Qa\x02}\x91\x90`\xF8\x1Ca\x11\xC5V[\x81Q\x81\x10a\x02\x8DWa\x02\x8Da\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02\xA8\x83`\x02a\x11nV[a\x02\xB3\x90`\x01a\x11\xD9V[\x81Q\x81\x10a\x02\xC3Wa\x02\xC3a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x01\x01a\x01\xD4V[P\x81`@Q` \x01a\x02\xF4\x91\x90a\x12\x08V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92PPP\x91\x90PV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x03^W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\x82\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x03\xB1\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xCEW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xF2\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x04+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@Q\x80\x91\x03\x90\xFD[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x01\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[PPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xA8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xCC\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x04\xFB\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05\x18W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05<\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x05lW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x01` R`@\x90 a\x05\x84\x82\x82a\x13vV[PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x05\xDBW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\xFF\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x06.\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06KW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06o\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x9FW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x02` R`@\x90 a\x05\x84\x82\x82a\x13vV[```\0a\x06\xC6\x85\x85\x85a\x080V[\x90P\x80`@Q` \x01a\x06\xD9\x91\x90a\x144V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP[\x93\x92PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07EW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07i\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07\x98\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xB5W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xD9\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\tW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x02\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[```\0`@Q\x80a\x04\x80\x01`@R\x80a\x04V\x81R` \x01a\x16\xD0a\x04V\x919\x90P`\0a\x08]\x85a\x01SV[\x90P`\0a\x08j\x85a\n\x84V[\x90P`\0a\x08w\x88a\n\xA0V[`\0\x89\x81R`\x01` R`@\x81 \x80T\x92\x93P\x90\x91a\x08\x95\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x08\xC1\x90a\x12\xEEV[\x80\x15a\t\x0EW\x80`\x1F\x10a\x08\xE3Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\x0EV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x08\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P`\0`\x02`\0\x8B\x81R` \x01\x90\x81R` \x01`\0 \x80Ta\t5\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\ta\x90a\x12\xEEV[\x80\x15a\t\xAEW\x80`\x1F\x10a\t\x83Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\xAEV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\t\x91W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x81Q`\0\x14\x80\x15a\t\xC6WP\x80Q\x15\x15[\x15a\t\xF2W\x82`@Q` \x01a\t\xDC\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91Pa\nFV[\x81Q\x15\x80\x15\x90a\n\x01WP\x80Q\x15[\x15a\n\rWP\x84a\nFV[\x81Q\x15\x80\x15a\n\x1BWP\x80Q\x15[\x15a\nFW\x82`@Q` \x01a\n1\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P\x85\x90P[a\nv\x82\x82\x87\x87\x87`@Q` \x01a\nb\x95\x94\x93\x92\x91\x90a\x14\xAAV[`@Q` \x81\x83\x03\x03\x81R\x90`@Ra\x0B2V[\x9A\x99PPPPPPPPPPV[``a\n\x9A`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14a\x0C\x91V[\x92\x91PPV[```\0a\n\xAD\x83a\x0E,V[`\x01\x01\x90P`\0\x81`\x01`\x01`@\x1B\x03\x81\x11\x15a\n\xCCWa\n\xCCa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\n\xF6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P\x81\x81\x01` \x01[`\0\x19\x01o\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B`\n\x86\x06\x1A\x81S`\n\x85\x04\x94P\x84a\x0B\0WP\x93\x92PPPV[``\x81Q`\0\x03a\x0BQWPP`@\x80Q` \x81\x01\x90\x91R`\0\x81R\x90V[`\0`@Q\x80``\x01`@R\x80`@\x81R` \x01a\x1B&`@\x919\x90P`\0`\x03\x84Q`\x02a\x0B\x80\x91\x90a\x11\xD9V[a\x0B\x8A\x91\x90a\x11\xB1V[a\x0B\x95\x90`\x04a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xACWa\x0B\xACa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0B\xD6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x01\x82\x01` \x82\x01\x85\x86Q\x87\x01` \x81\x01\x80Q`\0\x82R[\x82\x84\x10\x15a\x0CLW`\x03\x84\x01\x93P\x83Q`?\x81`\x12\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x0C\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x06\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81\x16\x87\x01Q\x86SP`\x01\x85\x01\x94Pa\x0B\xF1V[\x90RPP\x85Q`\x03\x90\x06`\x01\x81\x14a\x0CkW`\x02\x81\x14a\x0C~Wa\x0C\x86V[`=`\x01\x83\x03S`=`\x02\x83\x03Sa\x0C\x86V[`=`\x01\x83\x03S[P\x91\x95\x94PPPPPV[```\0a\x0C\xA0\x83`\x02a\x11nV[a\x0C\xAB\x90`\x02a\x11\xD9V[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0C\xC2Wa\x0C\xC2a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0C\xECW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\x07Wa\r\x07a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r6Wa\r6a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\rZ\x84`\x02a\x11nV[a\re\x90`\x01a\x11\xD9V[\x90P[`\x01\x81\x11\x15a\r\xDDWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\r\x99Wa\r\x99a\x11\x85V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\r\xAFWa\r\xAFa\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\r\xD6\x81a\x16\xB8V[\x90Pa\rhV[P\x83\x15a\x06\xECW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x04\"V[`\0\x80r\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x10a\x0EkWr\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x04\x92P`@\x01[i\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x10a\x0E\x95Wi\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x04\x92P` \x01[f#\x86\xF2o\xC1\0\0\x83\x10a\x0E\xB3Wf#\x86\xF2o\xC1\0\0\x83\x04\x92P`\x10\x01[c\x05\xF5\xE1\0\x83\x10a\x0E\xCBWc\x05\xF5\xE1\0\x83\x04\x92P`\x08\x01[a'\x10\x83\x10a\x0E\xDFWa'\x10\x83\x04\x92P`\x04\x01[`d\x83\x10a\x0E\xF1W`d\x83\x04\x92P`\x02\x01[`\n\x83\x10a\n\x9AW`\x01\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a\x0F2Wa\x0F2a\x0F\x02V[P`@Q`\x1F\x19`\x1F\x85\x01\x81\x16`?\x01\x16\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a\x0F`Wa\x0F`a\x0F\x02V[`@R\x83\x81R\x90P\x80\x82\x84\x01\x85\x10\x15a\x0FxW`\0\x80\xFD[\x83\x83` \x83\x017`\0` \x85\x83\x01\x01RP\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a\x0F\xA1W`\0\x80\xFD[a\x06\xEC\x83\x835` \x85\x01a\x0F\x18V[`\0` \x82\x84\x03\x12\x15a\x0F\xC2W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0F\xD8W`\0\x80\xFD[a\x0F\xE4\x84\x82\x85\x01a\x0F\x90V[\x94\x93PPPPV[`\0[\x83\x81\x10\x15a\x10\x07W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0F\xEFV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x10/\x81`@\x85\x01` \x87\x01a\x0F\xECV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x10UW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x10oW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x10\x8CW`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a\x10\x9DW`\0\x80\xFD[a\x10\xAC\x85\x825` \x84\x01a\x0F\x18V[\x91PP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x10\xCBW`\0\x80\xFD[PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x10\xE3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x11\0W`\0\x80\xFD[a\x11\x0C\x86\x82\x87\x01a\x0F\x90V[\x92PP`@\x84\x015a\x11\x1D\x81a\x10\xB6V[\x80\x91PP\x92P\x92P\x92V[`\x03\x81\x10a\x11FWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\n\x9A\x82\x84a\x11(V[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\n\x9AWa\n\x9Aa\x11XV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a\x11\xC0Wa\x11\xC0a\x11\x9BV[P\x04\x90V[`\0\x82a\x11\xD4Wa\x11\xD4a\x11\x9BV[P\x06\x90V[\x80\x82\x01\x80\x82\x11\x15a\n\x9AWa\n\x9Aa\x11XV[`\0\x81Qa\x11\xFE\x81\x85` \x86\x01a\x0F\xECV[\x92\x90\x92\x01\x92\x91PPV[a\x06\x0F`\xF3\x1B\x81R`\0\x82Qa\x12%\x81`\x02\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x02\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x12DW`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xEC` \x83\x01\x84a\x11(V[`\0` \x82\x84\x03\x12\x15a\x12qW`\0\x80\xFD[\x81Qa\x06\xEC\x81a\x10\xB6V[` \x80\x82R`L\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rkmain wallets`\xA0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x13\x02W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x13\"WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x05\x84W\x80`\0R` `\0 `\x1F\x84\x01`\x05\x1C\x81\x01` \x85\x10\x15a\x13OWP\x80[`\x1F\x84\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a\x13oW`\0\x81U`\x01\x01a\x13[V[PPPPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\x13\x8FWa\x13\x8Fa\x0F\x02V[a\x13\xA3\x81a\x13\x9D\x84Ta\x12\xEEV[\x84a\x13(V[` `\x1F\x82\x11`\x01\x81\x14a\x13\xD7W`\0\x83\x15a\x13\xBFWP\x84\x82\x01Q[`\0\x19`\x03\x85\x90\x1B\x1C\x19\x16`\x01\x84\x90\x1B\x17\x84Ua\x13oV[`\0\x84\x81R` \x81 `\x1F\x19\x85\x16\x91[\x82\x81\x10\x15a\x14\x07W\x87\x85\x01Q\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01a\x13\xE7V[P\x84\x82\x10\x15a\x14%W\x86\x84\x01Q`\0\x19`\x03\x87\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPP`\x01\x90\x81\x1B\x01\x90UPV[\x7Fdata:application/json;base64,\0\0\0\x81R`\0\x82Qa\x14l\x81`\x1D\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x1D\x01\x92\x91PPV[hLit PKP #`\xB8\x1B\x81R`\0\x82Qa\x14\x9D\x81`\t\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\t\x01\x92\x91PPV[h=\x9170\xB6\xB2\x91\x1D\x11`\xB9\x1B\x81R\x85Q`\0\x90a\x14\xCF\x81`\t\x85\x01` \x8B\x01a\x0F\xECV[\x7F\", \"description\": \"This NFT enti`\t\x91\x84\x01\x91\x82\x01R\x7Ftles the holder to use a Lit Pro`)\x82\x01R\x7Ftocol PKP, and to grant access t`I\x82\x01R\x7Fo other users and Lit Actions to`i\x82\x01R\x7F use this PKP\",\"image_data\": \"\0\0`\x89\x82\x01R\x86Qa\x15\xA4\x81`\xA7\x84\x01` \x8B\x01a\x0F\xECV[`\t\x81\x83\x01\x01\x91PP\x7F\",\"attributes\": [{\"trait_type\": `\x9E\x82\x01Rw\x11(:\xB164\xB1\x90%\xB2\xBC\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`A\x1B`\xBE\x82\x01Ra\x16\xACa\x16\x9Ca\x16\x96a\x16[a\x16Ua\x16\x10`\xD6\x87\x01\x8Ca\x11\xECV[\x7F\"}, {\"trait_type\": \"ETH Wallet A\x81Rr2292\xB9\xB9\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`i\x1B` \x82\x01R`3\x01\x90V[\x89a\x11\xECV[\x7F\"}, {\"trait_type\": \"Token ID\", \"\x81Rh;0\xB6:\xB2\x91\x1D\x10\x11`\xB9\x1B` \x82\x01R`)\x01\x90V[\x86a\x11\xECV[c\"}]}`\xE0\x1B\x81R`\x04\x01\x90V[\x98\x97PPPPPPPPV[`\0\x81a\x16\xC7Wa\x16\xC7a\x11XV[P`\0\x19\x01\x90V\xFEABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\xA2dipfsX\"\x12 \x11\x9F>\xFF\x15\xD9\xF5\xEA\x1C\x05_7\x90\x172\x96\x03\x0EY\x97>*\xD6`\xE8q\x1AU\xE2\xF03\x13dsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static PKPNFTMETADATA_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __BYTECODE, ); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0xW`\x005`\xE0\x1C\x80cE\x1D\x89\xFA\x14a\0}W\x80cP\xD1{^\x14a\0\xA6W\x80cQ\x9A!\x8E\x14a\0\xD1W\x80c\x85^\xEC\"\x14a\0\xE6W\x80c\x90\0\xFE\xE1\x14a\0\xF9W\x80c\x95\x04b\xEE\x14a\x01\x0CW\x80c\x9D\xCA\x002\x14a\x01\x1FW\x80c\xB6:vw\x14a\x01@W[`\0\x80\xFD[a\0\x90a\0\x8B6`\x04a\x0F\xB0V[a\x01SV[`@Qa\0\x9D\x91\x90a\x10\x10V[`@Q\x80\x91\x03\x90\xF3[`\0Ta\0\xB9\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\x9DV[a\0\xE4a\0\xDF6`\x04a\x10CV[a\x03\x0CV[\0[a\0\xE4a\0\xF46`\x04a\x10\\V[a\x04VV[a\0\xE4a\x01\x076`\x04a\x10\\V[a\x05\x89V[a\0\x90a\x01\x1A6`\x04a\x10\xCEV[a\x06\xB7V[`\0Ta\x013\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\x9D\x91\x90a\x11JV[a\0\xE4a\x01N6`\x04a\x10CV[a\x06\xF3V[```\0\x82Q`\x02a\x01e\x91\x90a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x01|Wa\x01|a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x01\xA6W` \x82\x01\x81\x806\x837\x01\x90P[P`@\x80Q\x80\x82\x01\x90\x91R`\x10\x81Ro\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B` \x82\x01R\x90\x91P`\0[\x84Q\x81\x10\x15a\x02\xE2W\x81\x82Q\x86\x83\x81Q\x81\x10a\x01\xF2Wa\x01\xF2a\x11\x85V[\x01` \x01Qa\x02\x04\x91\x90`\xF8\x1Ca\x11\xB1V[\x81Q\x81\x10a\x02\x14Wa\x02\x14a\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02/\x83`\x02a\x11nV[\x81Q\x81\x10a\x02?Wa\x02?a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP\x81\x82Q\x86\x83\x81Q\x81\x10a\x02kWa\x02ka\x11\x85V[\x01` \x01Qa\x02}\x91\x90`\xF8\x1Ca\x11\xC5V[\x81Q\x81\x10a\x02\x8DWa\x02\x8Da\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02\xA8\x83`\x02a\x11nV[a\x02\xB3\x90`\x01a\x11\xD9V[\x81Q\x81\x10a\x02\xC3Wa\x02\xC3a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x01\x01a\x01\xD4V[P\x81`@Q` \x01a\x02\xF4\x91\x90a\x12\x08V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92PPP\x91\x90PV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x03^W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\x82\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x03\xB1\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xCEW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xF2\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x04+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@Q\x80\x91\x03\x90\xFD[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x01\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[PPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xA8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xCC\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x04\xFB\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05\x18W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05<\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x05lW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x01` R`@\x90 a\x05\x84\x82\x82a\x13vV[PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x05\xDBW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\xFF\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x06.\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06KW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06o\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x9FW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x02` R`@\x90 a\x05\x84\x82\x82a\x13vV[```\0a\x06\xC6\x85\x85\x85a\x080V[\x90P\x80`@Q` \x01a\x06\xD9\x91\x90a\x144V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP[\x93\x92PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07EW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07i\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07\x98\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xB5W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xD9\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\tW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x02\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[```\0`@Q\x80a\x04\x80\x01`@R\x80a\x04V\x81R` \x01a\x16\xD0a\x04V\x919\x90P`\0a\x08]\x85a\x01SV[\x90P`\0a\x08j\x85a\n\x84V[\x90P`\0a\x08w\x88a\n\xA0V[`\0\x89\x81R`\x01` R`@\x81 \x80T\x92\x93P\x90\x91a\x08\x95\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x08\xC1\x90a\x12\xEEV[\x80\x15a\t\x0EW\x80`\x1F\x10a\x08\xE3Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\x0EV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x08\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P`\0`\x02`\0\x8B\x81R` \x01\x90\x81R` \x01`\0 \x80Ta\t5\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\ta\x90a\x12\xEEV[\x80\x15a\t\xAEW\x80`\x1F\x10a\t\x83Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\xAEV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\t\x91W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x81Q`\0\x14\x80\x15a\t\xC6WP\x80Q\x15\x15[\x15a\t\xF2W\x82`@Q` \x01a\t\xDC\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91Pa\nFV[\x81Q\x15\x80\x15\x90a\n\x01WP\x80Q\x15[\x15a\n\rWP\x84a\nFV[\x81Q\x15\x80\x15a\n\x1BWP\x80Q\x15[\x15a\nFW\x82`@Q` \x01a\n1\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P\x85\x90P[a\nv\x82\x82\x87\x87\x87`@Q` \x01a\nb\x95\x94\x93\x92\x91\x90a\x14\xAAV[`@Q` \x81\x83\x03\x03\x81R\x90`@Ra\x0B2V[\x9A\x99PPPPPPPPPPV[``a\n\x9A`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14a\x0C\x91V[\x92\x91PPV[```\0a\n\xAD\x83a\x0E,V[`\x01\x01\x90P`\0\x81`\x01`\x01`@\x1B\x03\x81\x11\x15a\n\xCCWa\n\xCCa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\n\xF6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P\x81\x81\x01` \x01[`\0\x19\x01o\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B`\n\x86\x06\x1A\x81S`\n\x85\x04\x94P\x84a\x0B\0WP\x93\x92PPPV[``\x81Q`\0\x03a\x0BQWPP`@\x80Q` \x81\x01\x90\x91R`\0\x81R\x90V[`\0`@Q\x80``\x01`@R\x80`@\x81R` \x01a\x1B&`@\x919\x90P`\0`\x03\x84Q`\x02a\x0B\x80\x91\x90a\x11\xD9V[a\x0B\x8A\x91\x90a\x11\xB1V[a\x0B\x95\x90`\x04a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xACWa\x0B\xACa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0B\xD6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x01\x82\x01` \x82\x01\x85\x86Q\x87\x01` \x81\x01\x80Q`\0\x82R[\x82\x84\x10\x15a\x0CLW`\x03\x84\x01\x93P\x83Q`?\x81`\x12\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x0C\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x06\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81\x16\x87\x01Q\x86SP`\x01\x85\x01\x94Pa\x0B\xF1V[\x90RPP\x85Q`\x03\x90\x06`\x01\x81\x14a\x0CkW`\x02\x81\x14a\x0C~Wa\x0C\x86V[`=`\x01\x83\x03S`=`\x02\x83\x03Sa\x0C\x86V[`=`\x01\x83\x03S[P\x91\x95\x94PPPPPV[```\0a\x0C\xA0\x83`\x02a\x11nV[a\x0C\xAB\x90`\x02a\x11\xD9V[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0C\xC2Wa\x0C\xC2a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0C\xECW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\x07Wa\r\x07a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r6Wa\r6a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\rZ\x84`\x02a\x11nV[a\re\x90`\x01a\x11\xD9V[\x90P[`\x01\x81\x11\x15a\r\xDDWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\r\x99Wa\r\x99a\x11\x85V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\r\xAFWa\r\xAFa\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\r\xD6\x81a\x16\xB8V[\x90Pa\rhV[P\x83\x15a\x06\xECW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x04\"V[`\0\x80r\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x10a\x0EkWr\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x04\x92P`@\x01[i\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x10a\x0E\x95Wi\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x04\x92P` \x01[f#\x86\xF2o\xC1\0\0\x83\x10a\x0E\xB3Wf#\x86\xF2o\xC1\0\0\x83\x04\x92P`\x10\x01[c\x05\xF5\xE1\0\x83\x10a\x0E\xCBWc\x05\xF5\xE1\0\x83\x04\x92P`\x08\x01[a'\x10\x83\x10a\x0E\xDFWa'\x10\x83\x04\x92P`\x04\x01[`d\x83\x10a\x0E\xF1W`d\x83\x04\x92P`\x02\x01[`\n\x83\x10a\n\x9AW`\x01\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a\x0F2Wa\x0F2a\x0F\x02V[P`@Q`\x1F\x19`\x1F\x85\x01\x81\x16`?\x01\x16\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a\x0F`Wa\x0F`a\x0F\x02V[`@R\x83\x81R\x90P\x80\x82\x84\x01\x85\x10\x15a\x0FxW`\0\x80\xFD[\x83\x83` \x83\x017`\0` \x85\x83\x01\x01RP\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a\x0F\xA1W`\0\x80\xFD[a\x06\xEC\x83\x835` \x85\x01a\x0F\x18V[`\0` \x82\x84\x03\x12\x15a\x0F\xC2W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0F\xD8W`\0\x80\xFD[a\x0F\xE4\x84\x82\x85\x01a\x0F\x90V[\x94\x93PPPPV[`\0[\x83\x81\x10\x15a\x10\x07W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0F\xEFV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x10/\x81`@\x85\x01` \x87\x01a\x0F\xECV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x10UW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x10oW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x10\x8CW`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a\x10\x9DW`\0\x80\xFD[a\x10\xAC\x85\x825` \x84\x01a\x0F\x18V[\x91PP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x10\xCBW`\0\x80\xFD[PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x10\xE3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x11\0W`\0\x80\xFD[a\x11\x0C\x86\x82\x87\x01a\x0F\x90V[\x92PP`@\x84\x015a\x11\x1D\x81a\x10\xB6V[\x80\x91PP\x92P\x92P\x92V[`\x03\x81\x10a\x11FWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\n\x9A\x82\x84a\x11(V[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\n\x9AWa\n\x9Aa\x11XV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a\x11\xC0Wa\x11\xC0a\x11\x9BV[P\x04\x90V[`\0\x82a\x11\xD4Wa\x11\xD4a\x11\x9BV[P\x06\x90V[\x80\x82\x01\x80\x82\x11\x15a\n\x9AWa\n\x9Aa\x11XV[`\0\x81Qa\x11\xFE\x81\x85` \x86\x01a\x0F\xECV[\x92\x90\x92\x01\x92\x91PPV[a\x06\x0F`\xF3\x1B\x81R`\0\x82Qa\x12%\x81`\x02\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x02\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x12DW`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xEC` \x83\x01\x84a\x11(V[`\0` \x82\x84\x03\x12\x15a\x12qW`\0\x80\xFD[\x81Qa\x06\xEC\x81a\x10\xB6V[` \x80\x82R`L\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rkmain wallets`\xA0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x13\x02W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x13\"WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x05\x84W\x80`\0R` `\0 `\x1F\x84\x01`\x05\x1C\x81\x01` \x85\x10\x15a\x13OWP\x80[`\x1F\x84\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a\x13oW`\0\x81U`\x01\x01a\x13[V[PPPPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\x13\x8FWa\x13\x8Fa\x0F\x02V[a\x13\xA3\x81a\x13\x9D\x84Ta\x12\xEEV[\x84a\x13(V[` `\x1F\x82\x11`\x01\x81\x14a\x13\xD7W`\0\x83\x15a\x13\xBFWP\x84\x82\x01Q[`\0\x19`\x03\x85\x90\x1B\x1C\x19\x16`\x01\x84\x90\x1B\x17\x84Ua\x13oV[`\0\x84\x81R` \x81 `\x1F\x19\x85\x16\x91[\x82\x81\x10\x15a\x14\x07W\x87\x85\x01Q\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01a\x13\xE7V[P\x84\x82\x10\x15a\x14%W\x86\x84\x01Q`\0\x19`\x03\x87\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPP`\x01\x90\x81\x1B\x01\x90UPV[\x7Fdata:application/json;base64,\0\0\0\x81R`\0\x82Qa\x14l\x81`\x1D\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x1D\x01\x92\x91PPV[hLit PKP #`\xB8\x1B\x81R`\0\x82Qa\x14\x9D\x81`\t\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\t\x01\x92\x91PPV[h=\x9170\xB6\xB2\x91\x1D\x11`\xB9\x1B\x81R\x85Q`\0\x90a\x14\xCF\x81`\t\x85\x01` \x8B\x01a\x0F\xECV[\x7F\", \"description\": \"This NFT enti`\t\x91\x84\x01\x91\x82\x01R\x7Ftles the holder to use a Lit Pro`)\x82\x01R\x7Ftocol PKP, and to grant access t`I\x82\x01R\x7Fo other users and Lit Actions to`i\x82\x01R\x7F use this PKP\",\"image_data\": \"\0\0`\x89\x82\x01R\x86Qa\x15\xA4\x81`\xA7\x84\x01` \x8B\x01a\x0F\xECV[`\t\x81\x83\x01\x01\x91PP\x7F\",\"attributes\": [{\"trait_type\": `\x9E\x82\x01Rw\x11(:\xB164\xB1\x90%\xB2\xBC\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`A\x1B`\xBE\x82\x01Ra\x16\xACa\x16\x9Ca\x16\x96a\x16[a\x16Ua\x16\x10`\xD6\x87\x01\x8Ca\x11\xECV[\x7F\"}, {\"trait_type\": \"ETH Wallet A\x81Rr2292\xB9\xB9\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`i\x1B` \x82\x01R`3\x01\x90V[\x89a\x11\xECV[\x7F\"}, {\"trait_type\": \"Token ID\", \"\x81Rh;0\xB6:\xB2\x91\x1D\x10\x11`\xB9\x1B` \x82\x01R`)\x01\x90V[\x86a\x11\xECV[c\"}]}`\xE0\x1B\x81R`\x04\x01\x90V[\x98\x97PPPPPPPPV[`\0\x81a\x16\xC7Wa\x16\xC7a\x11XV[P`\0\x19\x01\x90V\xFEABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\xA2dipfsX\"\x12 \x8F\x13\x99\xB0\x85\xBF\xFD\xE0ex\xF1\xDD\x04\xAD6!~\xEDG\xFB\xA0mu\xA3\x1F\\\xE9\xE6qQx\x82dsolcC\0\x08\x1C\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0xW`\x005`\xE0\x1C\x80cE\x1D\x89\xFA\x14a\0}W\x80cP\xD1{^\x14a\0\xA6W\x80cQ\x9A!\x8E\x14a\0\xD1W\x80c\x85^\xEC\"\x14a\0\xE6W\x80c\x90\0\xFE\xE1\x14a\0\xF9W\x80c\x95\x04b\xEE\x14a\x01\x0CW\x80c\x9D\xCA\x002\x14a\x01\x1FW\x80c\xB6:vw\x14a\x01@W[`\0\x80\xFD[a\0\x90a\0\x8B6`\x04a\x0F\xB0V[a\x01SV[`@Qa\0\x9D\x91\x90a\x10\x10V[`@Q\x80\x91\x03\x90\xF3[`\0Ta\0\xB9\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\x9DV[a\0\xE4a\0\xDF6`\x04a\x10CV[a\x03\x0CV[\0[a\0\xE4a\0\xF46`\x04a\x10\\V[a\x04VV[a\0\xE4a\x01\x076`\x04a\x10\\V[a\x05\x89V[a\0\x90a\x01\x1A6`\x04a\x10\xCEV[a\x06\xB7V[`\0Ta\x013\x90`\x01`\xA0\x1B\x90\x04`\xFF\x16\x81V[`@Qa\0\x9D\x91\x90a\x11JV[a\0\xE4a\x01N6`\x04a\x10CV[a\x06\xF3V[```\0\x82Q`\x02a\x01e\x91\x90a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x01|Wa\x01|a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x01\xA6W` \x82\x01\x81\x806\x837\x01\x90P[P`@\x80Q\x80\x82\x01\x90\x91R`\x10\x81Ro\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B` \x82\x01R\x90\x91P`\0[\x84Q\x81\x10\x15a\x02\xE2W\x81\x82Q\x86\x83\x81Q\x81\x10a\x01\xF2Wa\x01\xF2a\x11\x85V[\x01` \x01Qa\x02\x04\x91\x90`\xF8\x1Ca\x11\xB1V[\x81Q\x81\x10a\x02\x14Wa\x02\x14a\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02/\x83`\x02a\x11nV[\x81Q\x81\x10a\x02?Wa\x02?a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP\x81\x82Q\x86\x83\x81Q\x81\x10a\x02kWa\x02ka\x11\x85V[\x01` \x01Qa\x02}\x91\x90`\xF8\x1Ca\x11\xC5V[\x81Q\x81\x10a\x02\x8DWa\x02\x8Da\x11\x85V[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x83a\x02\xA8\x83`\x02a\x11nV[a\x02\xB3\x90`\x01a\x11\xD9V[\x81Q\x81\x10a\x02\xC3Wa\x02\xC3a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x01\x01a\x01\xD4V[P\x81`@Q` \x01a\x02\xF4\x91\x90a\x12\x08V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x92PPP\x91\x90PV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x03^W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\x82\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x03\xB1\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xCEW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xF2\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x04+W`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@Q\x80\x91\x03\x90\xFD[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x01\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[PPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x04\xA8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xCC\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x04\xFB\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05\x18W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05<\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x05lW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x01` R`@\x90 a\x05\x84\x82\x82a\x13vV[PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x05\xDBW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\xFF\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x06.\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06KW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06o\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x06\x9FW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`\0\x82\x81R`\x02` R`@\x90 a\x05\x84\x82\x82a\x13vV[```\0a\x06\xC6\x85\x85\x85a\x080V[\x90P\x80`@Q` \x01a\x06\xD9\x91\x90a\x144V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP[\x93\x92PPPV[`\0T`@\x80Qc\tw\xA8\x07`\xE4\x1B\x81R\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91c\x8E\x8D\xFD\x16\x91\x83\x91c\x97z\x80p\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\x07EW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07i\x91\x90a\x122V[`\0T`@Q`\xE0\x84\x90\x1B`\x01`\x01`\xE0\x1B\x03\x19\x16\x81Ra\x07\x98\x92\x91`\x01`\xA0\x1B\x90\x04`\xFF\x16\x90`\x04\x01a\x12KV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xB5W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xD9\x91\x90a\x12_V[`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\tW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x04\"\x90a\x12|V[`@\x80Q` \x80\x82\x01\x83R`\0\x80\x83R\x84\x81R`\x02\x90\x91R\x91\x90\x91 \x90a\x04R\x90\x82a\x13vV[```\0`@Q\x80a\x04\x80\x01`@R\x80a\x04V\x81R` \x01a\x16\xD0a\x04V\x919\x90P`\0a\x08]\x85a\x01SV[\x90P`\0a\x08j\x85a\n\x84V[\x90P`\0a\x08w\x88a\n\xA0V[`\0\x89\x81R`\x01` R`@\x81 \x80T\x92\x93P\x90\x91a\x08\x95\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x08\xC1\x90a\x12\xEEV[\x80\x15a\t\x0EW\x80`\x1F\x10a\x08\xE3Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\x0EV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x08\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P`\0`\x02`\0\x8B\x81R` \x01\x90\x81R` \x01`\0 \x80Ta\t5\x90a\x12\xEEV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\ta\x90a\x12\xEEV[\x80\x15a\t\xAEW\x80`\x1F\x10a\t\x83Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\xAEV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\t\x91W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x81Q`\0\x14\x80\x15a\t\xC6WP\x80Q\x15\x15[\x15a\t\xF2W\x82`@Q` \x01a\t\xDC\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91Pa\nFV[\x81Q\x15\x80\x15\x90a\n\x01WP\x80Q\x15[\x15a\n\rWP\x84a\nFV[\x81Q\x15\x80\x15a\n\x1BWP\x80Q\x15[\x15a\nFW\x82`@Q` \x01a\n1\x91\x90a\x14yV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P\x85\x90P[a\nv\x82\x82\x87\x87\x87`@Q` \x01a\nb\x95\x94\x93\x92\x91\x90a\x14\xAAV[`@Q` \x81\x83\x03\x03\x81R\x90`@Ra\x0B2V[\x9A\x99PPPPPPPPPPV[``a\n\x9A`\x01`\x01`\xA0\x1B\x03\x83\x16`\x14a\x0C\x91V[\x92\x91PPV[```\0a\n\xAD\x83a\x0E,V[`\x01\x01\x90P`\0\x81`\x01`\x01`@\x1B\x03\x81\x11\x15a\n\xCCWa\n\xCCa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\n\xF6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P\x81\x81\x01` \x01[`\0\x19\x01o\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B`\n\x86\x06\x1A\x81S`\n\x85\x04\x94P\x84a\x0B\0WP\x93\x92PPPV[``\x81Q`\0\x03a\x0BQWPP`@\x80Q` \x81\x01\x90\x91R`\0\x81R\x90V[`\0`@Q\x80``\x01`@R\x80`@\x81R` \x01a\x1B&`@\x919\x90P`\0`\x03\x84Q`\x02a\x0B\x80\x91\x90a\x11\xD9V[a\x0B\x8A\x91\x90a\x11\xB1V[a\x0B\x95\x90`\x04a\x11nV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0B\xACWa\x0B\xACa\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0B\xD6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x01\x82\x01` \x82\x01\x85\x86Q\x87\x01` \x81\x01\x80Q`\0\x82R[\x82\x84\x10\x15a\x0CLW`\x03\x84\x01\x93P\x83Q`?\x81`\x12\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x0C\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81`\x06\x1C\x16\x87\x01Q\x86S`\x01\x86\x01\x95P`?\x81\x16\x87\x01Q\x86SP`\x01\x85\x01\x94Pa\x0B\xF1V[\x90RPP\x85Q`\x03\x90\x06`\x01\x81\x14a\x0CkW`\x02\x81\x14a\x0C~Wa\x0C\x86V[`=`\x01\x83\x03S`=`\x02\x83\x03Sa\x0C\x86V[`=`\x01\x83\x03S[P\x91\x95\x94PPPPPV[```\0a\x0C\xA0\x83`\x02a\x11nV[a\x0C\xAB\x90`\x02a\x11\xD9V[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0C\xC2Wa\x0C\xC2a\x0F\x02V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0C\xECW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P`\x03`\xFC\x1B\x81`\0\x81Q\x81\x10a\r\x07Wa\r\x07a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x0F`\xFB\x1B\x81`\x01\x81Q\x81\x10a\r6Wa\r6a\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\0a\rZ\x84`\x02a\x11nV[a\re\x90`\x01a\x11\xD9V[\x90P[`\x01\x81\x11\x15a\r\xDDWo\x18\x18\x99\x19\x9A\x1A\x9B\x1B\x9C\x1C\xB0\xB11\xB22\xB3`\x81\x1B\x85`\x0F\x16`\x10\x81\x10a\r\x99Wa\r\x99a\x11\x85V[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\r\xAFWa\r\xAFa\x11\x85V[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x94\x90\x94\x1C\x93a\r\xD6\x81a\x16\xB8V[\x90Pa\rhV[P\x83\x15a\x06\xECW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FStrings: hex length insufficient`D\x82\x01R`d\x01a\x04\"V[`\0\x80r\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x10a\x0EkWr\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01`@\x1B\x83\x04\x92P`@\x01[i\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x10a\x0E\x95Wi\x04\xEE-mA[\x85\xAC\xEF\x81` \x1B\x83\x04\x92P` \x01[f#\x86\xF2o\xC1\0\0\x83\x10a\x0E\xB3Wf#\x86\xF2o\xC1\0\0\x83\x04\x92P`\x10\x01[c\x05\xF5\xE1\0\x83\x10a\x0E\xCBWc\x05\xF5\xE1\0\x83\x04\x92P`\x08\x01[a'\x10\x83\x10a\x0E\xDFWa'\x10\x83\x04\x92P`\x04\x01[`d\x83\x10a\x0E\xF1W`d\x83\x04\x92P`\x02\x01[`\n\x83\x10a\n\x9AW`\x01\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`\x01`\x01`@\x1B\x03\x84\x11\x15a\x0F2Wa\x0F2a\x0F\x02V[P`@Q`\x1F\x19`\x1F\x85\x01\x81\x16`?\x01\x16\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a\x0F`Wa\x0F`a\x0F\x02V[`@R\x83\x81R\x90P\x80\x82\x84\x01\x85\x10\x15a\x0FxW`\0\x80\xFD[\x83\x83` \x83\x017`\0` \x85\x83\x01\x01RP\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a\x0F\xA1W`\0\x80\xFD[a\x06\xEC\x83\x835` \x85\x01a\x0F\x18V[`\0` \x82\x84\x03\x12\x15a\x0F\xC2W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0F\xD8W`\0\x80\xFD[a\x0F\xE4\x84\x82\x85\x01a\x0F\x90V[\x94\x93PPPPV[`\0[\x83\x81\x10\x15a\x10\x07W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0F\xEFV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x10/\x81`@\x85\x01` \x87\x01a\x0F\xECV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x10UW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x10oW`\0\x80\xFD[\x825\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x10\x8CW`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a\x10\x9DW`\0\x80\xFD[a\x10\xAC\x85\x825` \x84\x01a\x0F\x18V[\x91PP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x10\xCBW`\0\x80\xFD[PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x10\xE3W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x11\0W`\0\x80\xFD[a\x11\x0C\x86\x82\x87\x01a\x0F\x90V[\x92PP`@\x84\x015a\x11\x1D\x81a\x10\xB6V[\x80\x91PP\x92P\x92P\x92V[`\x03\x81\x10a\x11FWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\n\x9A\x82\x84a\x11(V[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\n\x9AWa\n\x9Aa\x11XV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a\x11\xC0Wa\x11\xC0a\x11\x9BV[P\x04\x90V[`\0\x82a\x11\xD4Wa\x11\xD4a\x11\x9BV[P\x06\x90V[\x80\x82\x01\x80\x82\x11\x15a\n\x9AWa\n\x9Aa\x11XV[`\0\x81Qa\x11\xFE\x81\x85` \x86\x01a\x0F\xECV[\x92\x90\x92\x01\x92\x91PPV[a\x06\x0F`\xF3\x1B\x81R`\0\x82Qa\x12%\x81`\x02\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x02\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x12DW`\0\x80\xFD[PQ\x91\x90PV[\x82\x81R`@\x81\x01a\x06\xEC` \x83\x01\x84a\x11(V[`\0` \x82\x84\x03\x12\x15a\x12qW`\0\x80\xFD[\x81Qa\x06\xEC\x81a\x10\xB6V[` \x80\x82R`L\x90\x82\x01R\x7FPKPHelper: only the Domain Walle`@\x82\x01R\x7Ft registry is allowed to mint do``\x82\x01Rkmain wallets`\xA0\x1B`\x80\x82\x01R`\xA0\x01\x90V[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x13\x02W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x13\"WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x05\x84W\x80`\0R` `\0 `\x1F\x84\x01`\x05\x1C\x81\x01` \x85\x10\x15a\x13OWP\x80[`\x1F\x84\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a\x13oW`\0\x81U`\x01\x01a\x13[V[PPPPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\x13\x8FWa\x13\x8Fa\x0F\x02V[a\x13\xA3\x81a\x13\x9D\x84Ta\x12\xEEV[\x84a\x13(V[` `\x1F\x82\x11`\x01\x81\x14a\x13\xD7W`\0\x83\x15a\x13\xBFWP\x84\x82\x01Q[`\0\x19`\x03\x85\x90\x1B\x1C\x19\x16`\x01\x84\x90\x1B\x17\x84Ua\x13oV[`\0\x84\x81R` \x81 `\x1F\x19\x85\x16\x91[\x82\x81\x10\x15a\x14\x07W\x87\x85\x01Q\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01a\x13\xE7V[P\x84\x82\x10\x15a\x14%W\x86\x84\x01Q`\0\x19`\x03\x87\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPP`\x01\x90\x81\x1B\x01\x90UPV[\x7Fdata:application/json;base64,\0\0\0\x81R`\0\x82Qa\x14l\x81`\x1D\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\x1D\x01\x92\x91PPV[hLit PKP #`\xB8\x1B\x81R`\0\x82Qa\x14\x9D\x81`\t\x85\x01` \x87\x01a\x0F\xECV[\x91\x90\x91\x01`\t\x01\x92\x91PPV[h=\x9170\xB6\xB2\x91\x1D\x11`\xB9\x1B\x81R\x85Q`\0\x90a\x14\xCF\x81`\t\x85\x01` \x8B\x01a\x0F\xECV[\x7F\", \"description\": \"This NFT enti`\t\x91\x84\x01\x91\x82\x01R\x7Ftles the holder to use a Lit Pro`)\x82\x01R\x7Ftocol PKP, and to grant access t`I\x82\x01R\x7Fo other users and Lit Actions to`i\x82\x01R\x7F use this PKP\",\"image_data\": \"\0\0`\x89\x82\x01R\x86Qa\x15\xA4\x81`\xA7\x84\x01` \x8B\x01a\x0F\xECV[`\t\x81\x83\x01\x01\x91PP\x7F\",\"attributes\": [{\"trait_type\": `\x9E\x82\x01Rw\x11(:\xB164\xB1\x90%\xB2\xBC\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`A\x1B`\xBE\x82\x01Ra\x16\xACa\x16\x9Ca\x16\x96a\x16[a\x16Ua\x16\x10`\xD6\x87\x01\x8Ca\x11\xECV[\x7F\"}, {\"trait_type\": \"ETH Wallet A\x81Rr2292\xB9\xB9\x91\x16\x10\x11;0\xB6:\xB2\x91\x1D\x10\x11`i\x1B` \x82\x01R`3\x01\x90V[\x89a\x11\xECV[\x7F\"}, {\"trait_type\": \"Token ID\", \"\x81Rh;0\xB6:\xB2\x91\x1D\x10\x11`\xB9\x1B` \x82\x01R`)\x01\x90V[\x86a\x11\xECV[c\"}]}`\xE0\x1B\x81R`\x04\x01\x90V[\x98\x97PPPPPPPPV[`\0\x81a\x16\xC7Wa\x16\xC7a\x11XV[P`\0\x19\x01\x90V\xFEABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\xA2dipfsX\"\x12 \x11\x9F>\xFF\x15\xD9\xF5\xEA\x1C\x05_7\x90\x172\x96\x03\x0EY\x97>*\xD6`\xE8q\x1AU\xE2\xF03\x13dsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static PKPNFTMETADATA_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __DEPLOYED_BYTECODE, diff --git a/rust/lit-core/lit-blockchain/src/contracts/pubkey_router.rs b/rust/lit-core/lit-blockchain/src/contracts/pubkey_router.rs index 985e3f9d..aef08800 100644 --- a/rust/lit-core/lit-blockchain/src/contracts/pubkey_router.rs +++ b/rust/lit-core/lit-blockchain/src/contracts/pubkey_router.rs @@ -671,6 +671,7 @@ pub mod pubkey_router { ::ethers::core::abi::ethabi::ParamType::Bytes, ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), + ::ethers::core::abi::ethabi::ParamType::String, ], ), internal_type: ::core::option::Option::Some( @@ -781,6 +782,7 @@ pub mod pubkey_router { ::ethers::core::abi::ethabi::ParamType::Bytes, ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), + ::ethers::core::abi::ethabi::ParamType::String, ], ), internal_type: ::core::option::Option::Some( @@ -868,6 +870,13 @@ pub mod pubkey_router { ::std::borrow::ToOwned::to_owned("bytes32"), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("keySetIdentifier"), + kind: ::ethers::core::abi::ethabi::ParamType::String, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("string"), + ), + }, ], outputs: ::std::vec![], constant: ::core::option::Option::None, @@ -924,6 +933,13 @@ pub mod pubkey_router { ::std::borrow::ToOwned::to_owned("bytes32"), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("keySetIdentifier"), + kind: ::ethers::core::abi::ethabi::ParamType::String, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("string"), + ), + }, ], outputs: ::std::vec![], constant: ::core::option::Option::None, @@ -1202,6 +1218,11 @@ pub mod pubkey_router { ), indexed: false, }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("keySetIdentifier"), + kind: ::ethers::core::abi::ethabi::ParamType::String, + indexed: false, + }, ], anonymous: false, }, @@ -1952,7 +1973,7 @@ pub mod pubkey_router { .method_hash([249, 93, 113, 177], new_resolver_address) .expect("method not found (this should never happen)") } - ///Calls the contract's `setRoutingData` (0x0fccbd62) function + ///Calls the contract's `setRoutingData` (0xff463de6) function pub fn set_routing_data( &self, token_id: ::ethers::core::types::U256, @@ -1960,21 +1981,23 @@ pub mod pubkey_router { staking_contract_address: ::ethers::core::types::Address, key_type: ::ethers::core::types::U256, derived_key_id: [u8; 32], + key_set_identifier: ::std::string::String, ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash( - [15, 204, 189, 98], + [255, 70, 61, 230], ( token_id, pubkey, staking_contract_address, key_type, derived_key_id, + key_set_identifier, ), ) .expect("method not found (this should never happen)") } - ///Calls the contract's `setRoutingDataAsAdmin` (0x6e289d8e) function + ///Calls the contract's `setRoutingDataAsAdmin` (0x6c095735) function pub fn set_routing_data_as_admin( &self, token_id: ::ethers::core::types::U256, @@ -1982,11 +2005,19 @@ pub mod pubkey_router { staking_contract: ::ethers::core::types::Address, key_type: ::ethers::core::types::U256, derived_key_id: [u8; 32], + key_set_identifier: ::std::string::String, ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash( - [110, 40, 157, 142], - (token_id, pubkey, staking_contract, key_type, derived_key_id), + [108, 9, 87, 53], + ( + token_id, + pubkey, + staking_contract, + key_type, + derived_key_id, + key_set_identifier, + ), ) .expect("method not found (this should never happen)") } @@ -2974,7 +3005,7 @@ pub mod pubkey_router { )] #[ethevent( name = "PubkeyRoutingDataSet", - abi = "PubkeyRoutingDataSet(uint256,bytes,address,uint256,bytes32)" + abi = "PubkeyRoutingDataSet(uint256,bytes,address,uint256,bytes32,string)" )] pub struct PubkeyRoutingDataSetFilter { #[ethevent(indexed)] @@ -2983,6 +3014,7 @@ pub mod pubkey_router { pub staking_contract: ::ethers::core::types::Address, pub key_type: ::ethers::core::types::U256, pub derived_key_id: [u8; 32], + pub key_set_identifier: ::std::string::String, } #[derive( Clone, @@ -3560,7 +3592,7 @@ pub mod pubkey_router { pub struct SetContractResolverCall { pub new_resolver_address: ::ethers::core::types::Address, } - ///Container type for all input parameters for the `setRoutingData` function with signature `setRoutingData(uint256,bytes,address,uint256,bytes32)` and selector `0x0fccbd62` + ///Container type for all input parameters for the `setRoutingData` function with signature `setRoutingData(uint256,bytes,address,uint256,bytes32,string)` and selector `0xff463de6` #[derive( Clone, ::ethers::contract::EthCall, @@ -3575,7 +3607,7 @@ pub mod pubkey_router { )] #[ethcall( name = "setRoutingData", - abi = "setRoutingData(uint256,bytes,address,uint256,bytes32)" + abi = "setRoutingData(uint256,bytes,address,uint256,bytes32,string)" )] pub struct SetRoutingDataCall { pub token_id: ::ethers::core::types::U256, @@ -3583,8 +3615,9 @@ pub mod pubkey_router { pub staking_contract_address: ::ethers::core::types::Address, pub key_type: ::ethers::core::types::U256, pub derived_key_id: [u8; 32], + pub key_set_identifier: ::std::string::String, } - ///Container type for all input parameters for the `setRoutingDataAsAdmin` function with signature `setRoutingDataAsAdmin(uint256,bytes,address,uint256,bytes32)` and selector `0x6e289d8e` + ///Container type for all input parameters for the `setRoutingDataAsAdmin` function with signature `setRoutingDataAsAdmin(uint256,bytes,address,uint256,bytes32,string)` and selector `0x6c095735` #[derive( Clone, ::ethers::contract::EthCall, @@ -3599,7 +3632,7 @@ pub mod pubkey_router { )] #[ethcall( name = "setRoutingDataAsAdmin", - abi = "setRoutingDataAsAdmin(uint256,bytes,address,uint256,bytes32)" + abi = "setRoutingDataAsAdmin(uint256,bytes,address,uint256,bytes32,string)" )] pub struct SetRoutingDataAsAdminCall { pub token_id: ::ethers::core::types::U256, @@ -3607,6 +3640,7 @@ pub mod pubkey_router { pub staking_contract: ::ethers::core::types::Address, pub key_type: ::ethers::core::types::U256, pub derived_key_id: [u8; 32], + pub key_set_identifier: ::std::string::String, } ///Container type for all input parameters for the `setTrustedForwarder` function with signature `setTrustedForwarder(address)` and selector `0xda742228` #[derive( @@ -4541,7 +4575,7 @@ pub mod pubkey_router { pub pubkey: ::ethers::core::types::Bytes, pub eth_address: ::ethers::core::types::Address, } - ///`PubkeyRoutingData(bytes,uint256,bytes32)` + ///`PubkeyRoutingData(bytes,uint256,bytes32,string)` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -4558,5 +4592,6 @@ pub mod pubkey_router { pub pubkey: ::ethers::core::types::Bytes, pub key_type: ::ethers::core::types::U256, pub derived_key_id: [u8; 32], + pub key_set_identifier: ::std::string::String, } } diff --git a/rust/lit-core/lit-blockchain/src/contracts/staking.rs b/rust/lit-core/lit-blockchain/src/contracts/staking.rs index 36b9c836..468d1106 100644 --- a/rust/lit-core/lit-blockchain/src/contracts/staking.rs +++ b/rust/lit-core/lit-blockchain/src/contracts/staking.rs @@ -1708,11 +1708,7 @@ pub mod staking { ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ), ), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Address, - ), - ), + ::ethers::core::abi::ethabi::ParamType::Bytes, ], ), internal_type: ::core::option::Option::Some( @@ -1727,30 +1723,6 @@ pub mod staking { }, ], ), - ( - ::std::borrow::ToOwned::to_owned("getKeyTypes"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("getKeyTypes"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[]"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), ( ::std::borrow::ToOwned::to_owned("getKickedValidators"), ::std::vec![ @@ -3542,11 +3514,6 @@ pub mod staking { kind: ::ethers::core::abi::ethabi::ParamType::Tuple( ::std::vec![ ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - ), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), @@ -4170,11 +4137,7 @@ pub mod staking { ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ), ), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Address, - ), - ), + ::ethers::core::abi::ethabi::ParamType::Bytes, ], ), ), @@ -4831,6 +4794,7 @@ pub mod staking { ::ethers::core::abi::ethabi::ParamType::Bool, ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Bool, + ::ethers::core::abi::ethabi::ParamType::String, ], ), internal_type: ::core::option::Option::Some( @@ -5121,11 +5085,6 @@ pub mod staking { kind: ::ethers::core::abi::ethabi::ParamType::Tuple( ::std::vec![ ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - ), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), @@ -5428,11 +5387,7 @@ pub mod staking { ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ), ), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Address, - ), - ), + ::ethers::core::abi::ethabi::ParamType::Bytes, ], ), internal_type: ::core::option::Option::Some( @@ -5687,6 +5642,7 @@ pub mod staking { ::ethers::core::abi::ethabi::ParamType::Bool, ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Bool, + ::ethers::core::abi::ethabi::ParamType::String, ], ), internal_type: ::core::option::Option::Some( @@ -6419,96 +6375,6 @@ pub mod staking { }, ], ), - ( - ::std::borrow::ToOwned::to_owned("ConfigSet"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("ConfigSet"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newTokenRewardPerTokenPerEpoch", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("newKeyTypes"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newMinimumValidatorCount", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newMaxConcurrentRequests", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newMaxPresignCount", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newMinPresignCount", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newPeerCheckingIntervalSecs", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newMaxPresignConcurrency", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned( - "newRpcHealthcheckEnabled", - ), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - indexed: false, - }, - ], - anonymous: false, - }, - ], - ), ( ::std::borrow::ToOwned::to_owned("CountOfflinePhaseData"), ::std::vec![ @@ -9383,17 +9249,6 @@ pub mod staking { .method_hash([163, 5, 229, 254], identifier) .expect("method not found (this should never happen)") } - ///Calls the contract's `getKeyTypes` (0xf1b877a8) function - pub fn get_key_types( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::std::vec::Vec<::ethers::core::types::U256>, - > { - self.0 - .method_hash([241, 184, 119, 168], ()) - .expect("method not found (this should never happen)") - } ///Calls the contract's `getKickedValidators` (0x4b6afbbb) function pub fn get_kicked_validators( &self, @@ -10373,13 +10228,13 @@ pub mod staking { .method_hash([68, 14, 141, 34], (reason, config)) .expect("method not found (this should never happen)") } - ///Calls the contract's `setConfig` (0x077b0d40) function + ///Calls the contract's `setConfig` (0xd94c412d) function pub fn set_config( &self, new_config: GlobalConfig, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([7, 123, 13, 64], (new_config,)) + .method_hash([217, 76, 65, 45], (new_config,)) .expect("method not found (this should never happen)") } ///Calls the contract's `setContractResolver` (0xf95d71b1) function @@ -10461,13 +10316,13 @@ pub mod staking { .method_hash([44, 128, 181, 73], (ip, ipv_6, port, operator_address)) .expect("method not found (this should never happen)") } - ///Calls the contract's `setKeySet` (0x74d0be87) function + ///Calls the contract's `setKeySet` (0x774d0151) function pub fn set_key_set( &self, update: KeySetConfig, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([116, 208, 190, 135], (update,)) + .method_hash([119, 77, 1, 81], (update,)) .expect("method not found (this should never happen)") } ///Calls the contract's `setLitActionConfig` (0xe7d1f9a1) function @@ -10529,14 +10384,14 @@ pub mod staking { .method_hash([116, 162, 44, 81], (realm_id, permitted_validators_on)) .expect("method not found (this should never happen)") } - ///Calls the contract's `setRealmConfig` (0x7d35690f) function + ///Calls the contract's `setRealmConfig` (0x006d27b6) function pub fn set_realm_config( &self, realm_id: ::ethers::core::types::U256, new_config: RealmConfig, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([125, 53, 105, 15], (realm_id, new_config)) + .method_hash([0, 109, 39, 182], (realm_id, new_config)) .expect("method not found (this should never happen)") } ///Calls the contract's `setTokenTotalSupplyStandIn` (0xe941a733) function @@ -10761,16 +10616,6 @@ pub mod staking { > { self.0.event() } - ///Gets the contract's `ConfigSet` event - pub fn config_set_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - ConfigSetFilter, - > { - self.0.event() - } ///Gets the contract's `CountOfflinePhaseData` event pub fn count_offline_phase_data_filter( &self, @@ -14107,33 +13952,6 @@ pub mod staking { Eq, Hash )] - #[ethevent( - name = "ConfigSet", - abi = "ConfigSet(uint256,uint256[],uint256,uint256,uint256,uint256,uint256,uint256,bool)" - )] - pub struct ConfigSetFilter { - pub new_token_reward_per_token_per_epoch: ::ethers::core::types::U256, - pub new_key_types: ::std::vec::Vec<::ethers::core::types::U256>, - pub new_minimum_validator_count: ::ethers::core::types::U256, - pub new_max_concurrent_requests: ::ethers::core::types::U256, - pub new_max_presign_count: ::ethers::core::types::U256, - pub new_min_presign_count: ::ethers::core::types::U256, - pub new_peer_checking_interval_secs: ::ethers::core::types::U256, - pub new_max_presign_concurrency: ::ethers::core::types::U256, - pub new_rpc_healthcheck_enabled: bool, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] #[ethevent(name = "CountOfflinePhaseData", abi = "CountOfflinePhaseData(uint256)")] pub struct CountOfflinePhaseDataFilter { pub data_type: ::ethers::core::types::U256, @@ -14785,7 +14603,6 @@ pub mod staking { AttestedWalletRegisteredFilter(AttestedWalletRegisteredFilter), ClearOfflinePhaseDataFilter(ClearOfflinePhaseDataFilter), ComplaintConfigSetFilter(ComplaintConfigSetFilter), - ConfigSetFilter(ConfigSetFilter), CountOfflinePhaseDataFilter(CountOfflinePhaseDataFilter), DebugEventFilter(DebugEventFilter), DevopsAdminSetFilter(DevopsAdminSetFilter), @@ -14838,9 +14655,6 @@ pub mod staking { if let Ok(decoded) = ComplaintConfigSetFilter::decode_log(log) { return Ok(StakingEvents::ComplaintConfigSetFilter(decoded)); } - if let Ok(decoded) = ConfigSetFilter::decode_log(log) { - return Ok(StakingEvents::ConfigSetFilter(decoded)); - } if let Ok(decoded) = CountOfflinePhaseDataFilter::decode_log(log) { return Ok(StakingEvents::CountOfflinePhaseDataFilter(decoded)); } @@ -14964,7 +14778,6 @@ pub mod staking { Self::ComplaintConfigSetFilter(element) => { ::core::fmt::Display::fmt(element, f) } - Self::ConfigSetFilter(element) => ::core::fmt::Display::fmt(element, f), Self::CountOfflinePhaseDataFilter(element) => { ::core::fmt::Display::fmt(element, f) } @@ -15083,11 +14896,6 @@ pub mod staking { Self::ComplaintConfigSetFilter(value) } } - impl ::core::convert::From for StakingEvents { - fn from(value: ConfigSetFilter) -> Self { - Self::ConfigSetFilter(value) - } - } impl ::core::convert::From for StakingEvents { fn from(value: CountOfflinePhaseDataFilter) -> Self { Self::CountOfflinePhaseDataFilter(value) @@ -16176,21 +15984,6 @@ pub mod staking { pub struct GetKeySetCall { pub identifier: ::std::string::String, } - ///Container type for all input parameters for the `getKeyTypes` function with signature `getKeyTypes()` and selector `0xf1b877a8` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "getKeyTypes", abi = "getKeyTypes()")] - pub struct GetKeyTypesCall; ///Container type for all input parameters for the `getKickedValidators` function with signature `getKickedValidators(uint256)` and selector `0x4b6afbbb` #[derive( Clone, @@ -17891,7 +17684,7 @@ pub mod staking { pub reason: ::ethers::core::types::U256, pub config: ComplaintConfig, } - ///Container type for all input parameters for the `setConfig` function with signature `setConfig((uint256,uint256[],uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x077b0d40` + ///Container type for all input parameters for the `setConfig` function with signature `setConfig((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0xd94c412d` #[derive( Clone, ::ethers::contract::EthCall, @@ -17901,7 +17694,7 @@ pub mod staking { )] #[ethcall( name = "setConfig", - abi = "setConfig((uint256,uint256[],uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" + abi = "setConfig((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" )] pub struct SetConfigCall { pub new_config: GlobalConfig, @@ -18055,7 +17848,7 @@ pub mod staking { pub port: u32, pub operator_address: ::ethers::core::types::Address, } - ///Container type for all input parameters for the `setKeySet` function with signature `setKeySet((uint32,uint32,bool,string,string,uint256[],uint256[],uint256[],address[]))` and selector `0x74d0be87` + ///Container type for all input parameters for the `setKeySet` function with signature `setKeySet((uint32,uint32,bool,string,string,uint256[],uint256[],uint256[],bytes))` and selector `0x774d0151` #[derive( Clone, ::ethers::contract::EthCall, @@ -18070,7 +17863,7 @@ pub mod staking { )] #[ethcall( name = "setKeySet", - abi = "setKeySet((uint32,uint32,bool,string,string,uint256[],uint256[],uint256[],address[]))" + abi = "setKeySet((uint32,uint32,bool,string,string,uint256[],uint256[],uint256[],bytes))" )] pub struct SetKeySetCall { pub update: KeySetConfig, @@ -18200,7 +17993,7 @@ pub mod staking { pub realm_id: ::ethers::core::types::U256, pub permitted_validators_on: bool, } - ///Container type for all input parameters for the `setRealmConfig` function with signature `setRealmConfig(uint256,(uint256,uint256,uint256,uint256,uint256,bool,uint256,bool))` and selector `0x7d35690f` + ///Container type for all input parameters for the `setRealmConfig` function with signature `setRealmConfig(uint256,(uint256,uint256,uint256,uint256,uint256,bool,uint256,bool,string))` and selector `0x006d27b6` #[derive( Clone, ::ethers::contract::EthCall, @@ -18215,7 +18008,7 @@ pub mod staking { )] #[ethcall( name = "setRealmConfig", - abi = "setRealmConfig(uint256,(uint256,uint256,uint256,uint256,uint256,bool,uint256,bool))" + abi = "setRealmConfig(uint256,(uint256,uint256,uint256,uint256,uint256,bool,uint256,bool,string))" )] pub struct SetRealmConfigCall { pub realm_id: ::ethers::core::types::U256, @@ -18616,7 +18409,6 @@ pub mod staking { GetDelegatedStakersWithUnfreezingStakesCountCall, ), GetKeySet(GetKeySetCall), - GetKeyTypes(GetKeyTypesCall), GetKickedValidators(GetKickedValidatorsCall), GetLastStakeRecord(GetLastStakeRecordCall), GetLitCirc(GetLitCircCall), @@ -18997,11 +18789,6 @@ pub mod staking { ) { return Ok(Self::GetKeySet(decoded)); } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::GetKeyTypes(decoded)); - } if let Ok(decoded) = ::decode( data, ) { @@ -19776,9 +19563,6 @@ pub mod staking { Self::GetKeySet(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::GetKeyTypes(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } Self::GetKickedValidators(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -20261,7 +20045,6 @@ pub mod staking { ::core::fmt::Display::fmt(element, f) } Self::GetKeySet(element) => ::core::fmt::Display::fmt(element, f), - Self::GetKeyTypes(element) => ::core::fmt::Display::fmt(element, f), Self::GetKickedValidators(element) => { ::core::fmt::Display::fmt(element, f) } @@ -20791,11 +20574,6 @@ pub mod staking { Self::GetKeySet(value) } } - impl ::core::convert::From for StakingCalls { - fn from(value: GetKeyTypesCall) -> Self { - Self::GetKeyTypes(value) - } - } impl ::core::convert::From for StakingCalls { fn from(value: GetKickedValidatorsCall) -> Self { Self::GetKickedValidators(value) @@ -21841,20 +21619,6 @@ pub mod staking { Hash )] pub struct GetKeySetReturn(pub KeySetConfig); - ///Container type for all return fields from the `getKeyTypes` function with signature `getKeyTypes()` and selector `0xf1b877a8` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct GetKeyTypesReturn(pub ::std::vec::Vec<::ethers::core::types::U256>); ///Container type for all return fields from the `getKickedValidators` function with signature `getKickedValidators(uint256)` and selector `0x4b6afbbb` #[derive( Clone, @@ -23152,7 +22916,7 @@ pub mod staking { pub start_time: ::ethers::core::types::U256, pub last_advance_vote_time: ::ethers::core::types::U256, } - ///`GlobalConfig(uint256,uint256[],uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)` + ///`GlobalConfig(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -23167,7 +22931,6 @@ pub mod staking { )] pub struct GlobalConfig { pub token_reward_per_token_per_epoch: ::ethers::core::types::U256, - pub key_types: ::std::vec::Vec<::ethers::core::types::U256>, pub minimum_validator_count: ::ethers::core::types::U256, pub reward_epoch_duration: ::ethers::core::types::U256, pub max_time_lock: ::ethers::core::types::U256, @@ -23189,7 +22952,7 @@ pub mod staking { pub min_threshold_to_clamp_at: ::ethers::core::types::U256, pub vote_to_advance_time_out: ::ethers::core::types::U256, } - ///`KeySetConfig(uint32,uint32,bool,string,string,uint256[],uint256[],uint256[],address[])` + ///`KeySetConfig(uint32,uint32,bool,string,string,uint256[],uint256[],uint256[],bytes)` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -23211,7 +22974,7 @@ pub mod staking { pub realms: ::std::vec::Vec<::ethers::core::types::U256>, pub curves: ::std::vec::Vec<::ethers::core::types::U256>, pub counts: ::std::vec::Vec<::ethers::core::types::U256>, - pub recovery_party_members: ::std::vec::Vec<::ethers::core::types::Address>, + pub recovery_session_id: ::ethers::core::types::Bytes, } ///`LitActionConfig(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)` #[derive( @@ -23257,7 +23020,7 @@ pub mod staking { pub node_address: ::ethers::core::types::Address, pub pub_key: UncompressedK256Key, } - ///`RealmConfig(uint256,uint256,uint256,uint256,uint256,bool,uint256,bool)` + ///`RealmConfig(uint256,uint256,uint256,uint256,uint256,bool,uint256,bool,string)` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -23279,6 +23042,7 @@ pub mod staking { pub rpc_healthcheck_enabled: bool, pub min_epoch_for_rewards: ::ethers::core::types::U256, pub permitted_validators_on: bool, + pub default_key_set: ::std::string::String, } ///`RewardEpoch(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)` #[derive( diff --git a/rust/lit-core/lit-blockchain/src/lib.rs b/rust/lit-core/lit-blockchain/src/lib.rs index db167624..adc074c7 100644 --- a/rust/lit-core/lit-blockchain/src/lib.rs +++ b/rust/lit-core/lit-blockchain/src/lib.rs @@ -7,3 +7,9 @@ pub mod contracts; pub mod error; pub mod resolver; pub mod util; + +use ethers::prelude::*; +use k256::ecdsa::SigningKey; +use std::sync::Arc; + +pub type SignerProvider = SignerMiddleware>, Wallet>; diff --git a/rust/lit-core/lit-blockchain/src/resolver/contract/mod.rs b/rust/lit-core/lit-blockchain/src/resolver/contract/mod.rs index f6731fd4..8ba1621f 100644 --- a/rust/lit-core/lit-blockchain/src/resolver/contract/mod.rs +++ b/rust/lit-core/lit-blockchain/src/resolver/contract/mod.rs @@ -19,7 +19,6 @@ use lit_core::config::LitConfig; #[allow(unused_imports)] use lit_core::config::envs::LitEnv; -use crate::ReleaseRegister; use crate::config::LitBlockchainConfig; use crate::contracts::allowlist::Allowlist; use crate::contracts::backup_recovery::BackupRecovery; @@ -48,6 +47,7 @@ use crate::resolver::contract::config::SubnetConfig; use crate::resolver::rpc::{RPC_RESOLVER, RpcResolver}; use crate::util::ether::middleware::EIP2771GasRelayerMiddleware; use crate::util::ether::transaction_receipt_to_serde; +use crate::{ReleaseRegister, SignerProvider}; pub mod config; @@ -272,7 +272,7 @@ impl ContractResolver { pub async fn staking_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { Staking::load_with_signer( cfg, *self.resolve(cfg, STAKING_CONTRACT).await?.address(), @@ -282,17 +282,13 @@ impl ContractResolver { pub async fn staking_contract_with_signer_override( &self, cfg: &LitConfig, address: H160, wallet_key: Option<&str>, - ) -> Result>, Wallet>>> { + ) -> Result> { Staking::load_with_signer(cfg, address, wallet_key) } pub async fn staking_contract_with_gas_relay( &self, cfg: &LitConfig, meta_signer_key: impl Into, - ) -> Result< - Staking< - EIP2771GasRelayerMiddleware>, Wallet>>, - >, - > { + ) -> Result>> { Staking::load_with_gas_relay( cfg, *self.resolve(cfg, STAKING_CONTRACT).await?.address(), @@ -315,8 +311,7 @@ impl ContractResolver { pub async fn resolver_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> - { + ) -> Result> { ContractResolverContract::load_with_signer( cfg, *self.resolve(cfg, CONTRACT_RESOLVER_CONTRACT).await?.address(), @@ -334,7 +329,7 @@ impl ContractResolver { pub async fn release_register_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { ReleaseRegister::load_with_signer( cfg, *self.resolve(cfg, RELEASE_REGISTER_CONTRACT).await?.address(), @@ -352,7 +347,7 @@ impl ContractResolver { pub async fn multisender_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { Multisender::load_with_signer( cfg, *self.resolve(cfg, MULTI_SENDER_CONTRACT).await?.address(), @@ -368,7 +363,7 @@ impl ContractResolver { pub async fn lit_token_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { LITToken::load_with_signer( cfg, *self.resolve(cfg, LIT_TOKEN_CONTRACT).await?.address(), @@ -386,7 +381,7 @@ impl ContractResolver { pub async fn pub_key_router_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { PubkeyRouter::load_with_signer( cfg, *self.resolve(cfg, PUB_KEY_ROUTER_CONTRACT).await?.address(), @@ -396,11 +391,7 @@ impl ContractResolver { pub async fn pub_key_router_contract_with_gas_relay( &self, cfg: &LitConfig, meta_signer_key: impl Into, - ) -> Result< - PubkeyRouter< - EIP2771GasRelayerMiddleware>, Wallet>>, - >, - > { + ) -> Result>> { PubkeyRouter::load_with_gas_relay( cfg, *self.resolve(cfg, PUB_KEY_ROUTER_CONTRACT).await?.address(), @@ -418,7 +409,7 @@ impl ContractResolver { pub async fn pkp_nft_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { PKPNFT::load_with_signer( cfg, *self.resolve(cfg, PKP_NFT_CONTRACT).await?.address(), @@ -428,11 +419,7 @@ impl ContractResolver { pub async fn pkp_nft_contract_with_gas_relay( &self, cfg: &LitConfig, meta_signer_key: impl Into, - ) -> Result< - PKPNFT< - EIP2771GasRelayerMiddleware>, Wallet>>, - >, - > { + ) -> Result>> { PKPNFT::load_with_gas_relay( cfg, *self.resolve(cfg, PKP_NFT_CONTRACT).await?.address(), @@ -449,7 +436,7 @@ impl ContractResolver { pub async fn pkp_helper_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { PKPHelper::load_with_signer( cfg, *self.resolve(cfg, PKP_HELPER_CONTRACT).await?.address(), @@ -467,7 +454,7 @@ impl ContractResolver { pub async fn pkp_permissions_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { PKPPermissions::load_with_signer( cfg, *self.resolve(cfg, PKP_PERMISSIONS_CONTRACT).await?.address(), @@ -477,11 +464,7 @@ impl ContractResolver { pub async fn pkp_permissions_contract_with_gas_relay( &self, cfg: &LitConfig, meta_signer_key: impl Into, - ) -> Result< - PKPPermissions< - EIP2771GasRelayerMiddleware>, Wallet>>, - >, - > { + ) -> Result>> { PKPPermissions::load_with_gas_relay( cfg, *self.resolve(cfg, PKP_PERMISSIONS_CONTRACT).await?.address(), @@ -501,7 +484,7 @@ impl ContractResolver { pub async fn pkp_nft_metadata_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { PKPNFTMetadata::load_with_signer( cfg, *self.resolve(cfg, PKP_NFT_METADATA_CONTRACT).await?.address(), @@ -517,7 +500,7 @@ impl ContractResolver { pub async fn allowlist_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { Allowlist::load_with_signer( cfg, *self.resolve(cfg, ALLOWLIST_CONTRACT).await?.address(), @@ -534,7 +517,7 @@ impl ContractResolver { pub async fn backup_recovery_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { BackupRecovery::load_with_signer( cfg, *self.resolve(cfg, BACKUP_RECOVERY_CONTRACT).await?.address(), @@ -544,7 +527,7 @@ impl ContractResolver { pub async fn backup_recovery_contract_with_signer_override( &self, cfg: &LitConfig, address: Address, private_key_bytes: &str, - ) -> Result>, Wallet>>> { + ) -> Result> { BackupRecovery::load_with_signer(cfg, address, Some(private_key_bytes)) } @@ -555,7 +538,7 @@ impl ContractResolver { pub async fn ledger_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { Ledger::load_with_signer( cfg, *self.resolve(cfg, LEDGER_CONTRACT).await?.address(), @@ -565,11 +548,7 @@ impl ContractResolver { pub async fn ledger_contract_with_gas_relay( &self, cfg: &LitConfig, meta_signer_key: impl Into, - ) -> Result< - Ledger< - EIP2771GasRelayerMiddleware>, Wallet>>, - >, - > { + ) -> Result>> { Ledger::load_with_gas_relay( cfg, *self.resolve(cfg, LEDGER_CONTRACT).await?.address(), @@ -591,7 +570,7 @@ impl ContractResolver { pub async fn payment_delegation_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { PaymentDelegation::load_with_signer( cfg, *self.resolve(cfg, PAYMENT_DELEGATION_CONTRACT).await?.address(), @@ -606,7 +585,7 @@ impl ContractResolver { pub async fn price_feed_contract_with_signer( &self, cfg: &LitConfig, - ) -> Result>, Wallet>>> { + ) -> Result> { PriceFeed::load_with_signer( cfg, *self.resolve(cfg, PRICE_FEED_CONTRACT).await?.address(), @@ -616,11 +595,7 @@ impl ContractResolver { pub async fn price_feed_contract_with_gas_relay( &self, cfg: &LitConfig, meta_signer_key: impl Into, - ) -> Result< - PriceFeed< - EIP2771GasRelayerMiddleware>, Wallet>>, - >, - > { + ) -> Result>> { PriceFeed::load_with_gas_relay( cfg, *self.resolve(cfg, PRICE_FEED_CONTRACT).await?.address(), diff --git a/rust/lit-core/lit-blockchain/src/resolver/rpc/mod.rs b/rust/lit-core/lit-blockchain/src/resolver/rpc/mod.rs index 2f20ea8b..5f814d6b 100644 --- a/rust/lit-core/lit-blockchain/src/resolver/rpc/mod.rs +++ b/rust/lit-core/lit-blockchain/src/resolver/rpc/mod.rs @@ -52,7 +52,7 @@ impl<'a> StandardRpcHealthcheckPoller<'a> { } } -impl<'a> RpcHealthcheckPoller for StandardRpcHealthcheckPoller<'a> { +impl RpcHealthcheckPoller for StandardRpcHealthcheckPoller<'_> { fn get_latencies(&self) -> &ArcSwap> { &self.latencies } @@ -392,16 +392,16 @@ impl RpcResolver { } fn create_provider(rpc_entry: &RpcEntry) -> Result>> { - let http_cache = HTTP_CLIENT.get_or_init(|| scc::HashIndex::default()); + let http_cache = HTTP_CLIENT.get_or_init(scc::HashIndex::default); - let guard = scc::ebr::Guard::new(); + let guard = scc::Guard::new(); let provider = match http_cache.peek(rpc_entry.url(), &guard) { Some(provider) => provider.clone(), None => { let provider = Arc::new(rpc_provider(rpc_entry)?); - http_cache - .insert(rpc_entry.url().to_owned(), provider.clone()) - .map_err(|_| unexpected_err("how does it already exist?", None))?; + // If it already exists, we'll temporarily have two providers which is okay + // Once this one goes out of scope, it will be dropped freeing resources + let _ = http_cache.insert_sync(rpc_entry.url().to_owned(), provider.clone()); provider } }; diff --git a/rust/lit-core/lit-blockchain/src/util/ether.rs b/rust/lit-core/lit-blockchain/src/util/ether.rs index 136c4c1e..e6ce91ae 100644 --- a/rust/lit-core/lit-blockchain/src/util/ether.rs +++ b/rust/lit-core/lit-blockchain/src/util/ether.rs @@ -189,15 +189,18 @@ pub mod middleware { let typed_tx: Eip1559TransactionRequest = match typed_tx { TypedTransaction::Legacy(legacy_tx) => { // Map to Eip1559TransactionRequest - let mut eip1559_tx = Eip1559TransactionRequest::default(); - eip1559_tx.from = legacy_tx.from; - eip1559_tx.to = legacy_tx.to; - eip1559_tx.value = legacy_tx.value; - eip1559_tx.gas = legacy_tx.gas; - eip1559_tx.nonce = legacy_tx.nonce; - eip1559_tx.data = legacy_tx.data; - eip1559_tx.chain_id = legacy_tx.chain_id; - eip1559_tx + Eip1559TransactionRequest { + from: legacy_tx.from, + to: legacy_tx.to, + value: legacy_tx.value, + gas: legacy_tx.gas, + nonce: legacy_tx.nonce, + data: legacy_tx.data, + chain_id: legacy_tx.chain_id, + access_list: Default::default(), + max_priority_fee_per_gas: Default::default(), + max_fee_per_gas: Default::default(), + } } TypedTransaction::Eip1559(tx) => tx, _ => return Err(EIP2771GasRelayerMiddlewareError::UnsupportedTransactionType), @@ -240,10 +243,10 @@ pub mod middleware { .0, ), value: alloy::primitives::U256::from_limbs( - U256::from(typed_tx.value.unwrap_or(U256::from(0))).0, + typed_tx.value.unwrap_or_else(U256::zero).0, ), gas: alloy::primitives::U256::from_limbs(gas.0), - nonce: alloy::primitives::U256::from_limbs(U256::from(nonce).0), + nonce: alloy::primitives::U256::from_limbs(nonce.0), data: alloy::primitives::Bytes::from( typed_tx .data diff --git a/rust/lit-core/lit-blockchain/src/util/mod.rs b/rust/lit-core/lit-blockchain/src/util/mod.rs index a0db13cf..37550094 100644 --- a/rust/lit-core/lit-blockchain/src/util/mod.rs +++ b/rust/lit-core/lit-blockchain/src/util/mod.rs @@ -59,9 +59,9 @@ where stringified_error.strip_prefix("Contract call reverted with data: "); if let Some(revert_bytes_str) = maybe_revert_bytes_str { // Check if the length of the string is even and >0. - if revert_bytes_str.len() % 2 == 0 && revert_bytes_str.len() > 0 { + if revert_bytes_str.len() % 2 == 0 && !revert_bytes_str.is_empty() { // Convert to bytes - let revert_bytes = match Bytes::from_hex(revert_bytes_str) { + match Bytes::from_hex(revert_bytes_str) { Ok(bytes) => bytes, Err(conversion_err) => { return format!( @@ -69,9 +69,7 @@ where conversion_err ); } - }; - - revert_bytes + } } else { return format!("Contract Error is not a revert error: {:?}", e); } diff --git a/rust/lit-core/lit-core/src/error/code.rs b/rust/lit-core/lit-core/src/error/code.rs index 0bb406a7..b91c7be5 100644 --- a/rust/lit-core/lit-core/src/error/code.rs +++ b/rust/lit-core/lit-core/src/error/code.rs @@ -14,7 +14,7 @@ use crate::types::Description; pub type ArcCode = Arc; pub trait Code: Display + Debug + Description { - fn code(&self) -> Cow; + fn code(&self) -> Cow<'_, str>; fn kind(&self) -> Option; fn http_status(&self) -> Option; } @@ -22,10 +22,10 @@ pub trait Code: Display + Debug + Description { #[allow(dead_code)] #[derive(Clone, Debug, Display, ErrorCode, Description)] pub(crate) enum EC { - /// A fatal error occured in the lit core system + /// A fatal error occurred in the lit core system #[code(kind = Unexpected, http_status = 500)] CoreFatal, - /// An unexpected internal server error occured. + /// An unexpected internal server error occurred. #[code(kind = Unexpected, http_status = 500)] CoreUnexpected, } @@ -67,7 +67,7 @@ impl Description for StaticCode { } impl Code for StaticCode { - fn code(&self) -> Cow { + fn code(&self) -> Cow<'_, str> { Cow::from(self.code.clone()) } diff --git a/rust/lit-core/lit-core/src/error/mod.rs b/rust/lit-core/lit-core/src/error/mod.rs index a716229c..78d49332 100644 --- a/rust/lit-core/lit-core/src/error/mod.rs +++ b/rust/lit-core/lit-core/src/error/mod.rs @@ -129,11 +129,7 @@ impl Error { where K: Into, { - let mut fields = match self.inner.fields.take() { - Some(v) => v, - None => HashMap::new(), - }; - + let mut fields = self.inner.fields.take().unwrap_or_default(); fields.insert(key.into(), value); self.inner.fields = Some(fields); self @@ -777,7 +773,7 @@ mod tests { assert_eq!( err, - "lit_core::Error { kind: Unexpected, code: CoreFatal, msg: \"fatal-1\", source: lit_core::Error { kind: SevSnp, msg: \"sev-snp\", source: lit_core::Error { kind: Generic, source: \"first\", caller: { file: \"lit-core/src/error/mod.rs:772:19\" } }, caller: { file: \"lit-core/src/error/mod.rs:773:19\" } }, caller: { file: \"lit-core/src/error/mod.rs:774:19\" } }" + "lit_core::Error { kind: Unexpected, code: CoreFatal, msg: \"fatal-1\", source: lit_core::Error { kind: SevSnp, msg: \"sev-snp\", source: lit_core::Error { kind: Generic, source: \"first\", caller: { file: \"lit-core/src/error/mod.rs:768:19\" } }, caller: { file: \"lit-core/src/error/mod.rs:769:19\" } }, caller: { file: \"lit-core/src/error/mod.rs:770:19\" } }" ); } @@ -785,7 +781,10 @@ mod tests { fn ec_description_test() { let code = EC::CoreFatal; - assert_eq!(code.description(), Some("A fatal error occured in the lit core system".into())); + assert_eq!( + code.description(), + Some("A fatal error occurred in the lit core system".into()) + ); assert_eq!(code.kind(), Some(Kind::Unexpected)); assert_eq!(code.http_status(), Some(500)); } diff --git a/rust/lit-core/lit-core/src/error/public.rs b/rust/lit-core/lit-core/src/error/public.rs index f5de5047..95333149 100644 --- a/rust/lit-core/lit-core/src/error/public.rs +++ b/rust/lit-core/lit-core/src/error/public.rs @@ -180,7 +180,7 @@ mod tests { assert_eq!(public.error_kind, Kind::SevSnp); assert_eq!(public.error_code, Some("CoreFatal".into())); assert_eq!(public.status, 500); - assert_eq!(public.message, Some("A fatal error occured in the lit core system".into())); + assert_eq!(public.message, Some("A fatal error occurred in the lit core system".into())); assert_eq!(public.correlation_id, None); assert_eq!(public.details, Vec::::new()); @@ -202,7 +202,7 @@ mod tests { assert_eq!( json, - "{\"details\":[\"Some juicy details\",\"Some more\"],\"errorCode\":\"CoreFatal\",\"errorKind\":\"SevSnp\",\"message\":\"A fatal error occured in the lit core system\",\"status\":500}" + "{\"details\":[\"Some juicy details\",\"Some more\"],\"errorCode\":\"CoreFatal\",\"errorKind\":\"SevSnp\",\"message\":\"A fatal error occurred in the lit core system\",\"status\":500}" ); } @@ -241,7 +241,7 @@ mod tests { assert_eq!( format!("{:?}", new_err), - "upstream::Error { kind: SevSnp, code: CoreFatal, source: \"lit_core::PublicError { error_kind: SevSnp, error_code: \\\"CoreFatal\\\", message: \\\"A fatal error occured in the lit core system\\\", details: [\\\"Some juicy details\\\", \\\"Some more\\\"] }\" }" + "upstream::Error { kind: SevSnp, code: CoreFatal, source: \"lit_core::PublicError { error_kind: SevSnp, error_code: \\\"CoreFatal\\\", message: \\\"A fatal error occurred in the lit core system\\\", details: [\\\"Some juicy details\\\", \\\"Some more\\\"] }\" }" ); } } diff --git a/rust/lit-core/lit-core/src/error/serializer.rs b/rust/lit-core/lit-core/src/error/serializer.rs index 37776587..7edcda64 100644 --- a/rust/lit-core/lit-core/src/error/serializer.rs +++ b/rust/lit-core/lit-core/src/error/serializer.rs @@ -4,7 +4,6 @@ use serde::ser::SerializeStruct; use serde::{Serialize, Serializer}; /// NB: This is intended for structured logging and not to send as a HTTP response object. - impl Serialize for Error { fn serialize(&self, serializer: S) -> Result where @@ -78,7 +77,7 @@ mod tests { assert_eq!( json, - "{\"pkg\":\"lit_core\",\"kind\":\"Unexpected\",\"code\":\"CoreFatal\",\"msg\":\"fatal-1\",\"source\":{\"pkg\":\"lit_core\",\"kind\":\"SevSnp\",\"msg\":\"sev-snp\",\"source\":{\"pkg\":\"lit_core\",\"kind\":\"Generic\",\"source\":\"first\",\"caller\":{\"file\":\"lit-core/src/error/serializer.rs:73:19\"}},\"caller\":{\"file\":\"lit-core/src/error/serializer.rs:74:19\"}},\"caller\":{\"file\":\"lit-core/src/error/serializer.rs:75:19\"}}" + "{\"pkg\":\"lit_core\",\"kind\":\"Unexpected\",\"code\":\"CoreFatal\",\"msg\":\"fatal-1\",\"source\":{\"pkg\":\"lit_core\",\"kind\":\"SevSnp\",\"msg\":\"sev-snp\",\"source\":{\"pkg\":\"lit_core\",\"kind\":\"Generic\",\"source\":\"first\",\"caller\":{\"file\":\"lit-core/src/error/serializer.rs:72:19\"}},\"caller\":{\"file\":\"lit-core/src/error/serializer.rs:73:19\"}},\"caller\":{\"file\":\"lit-core/src/error/serializer.rs:74:19\"}}" ); } } diff --git a/rust/lit-core/lit-core/src/error/unexpected.rs b/rust/lit-core/lit-core/src/error/unexpected.rs index 6eb9d6ed..5e8eab91 100644 --- a/rust/lit-core/lit-core/src/error/unexpected.rs +++ b/rust/lit-core/lit-core/src/error/unexpected.rs @@ -69,16 +69,14 @@ where { match self { Ok(v) => Ok(v), - Err(e) => { - return Err(Error::new( - Some(Kind::Unexpected), - err_pkg_name(), - Some(format!("unexpected err in Result: {}", msg.as_ref())), - None, - Some(e), - Some(Location::caller()), - )); - } + Err(e) => Err(Error::new( + Some(Kind::Unexpected), + err_pkg_name(), + Some(format!("unexpected err in Result: {}", msg.as_ref())), + None, + Some(e), + Some(Location::caller()), + )), } } @@ -91,16 +89,14 @@ where { match self { Ok(v) => Ok(v), - Err(e) => { - return Err(Error::new( - Some(Kind::Unexpected), - err_pkg_name(), - Some(format!("unexpected err in Result: {}", msg.as_ref())), - Some(Arc::new(code)), - Some(e), - Some(Location::caller()), - )); - } + Err(e) => Err(Error::new( + Some(Kind::Unexpected), + err_pkg_name(), + Some(format!("unexpected err in Result: {}", msg.as_ref())), + Some(Arc::new(code)), + Some(e), + Some(Location::caller()), + )), } } } diff --git a/rust/lit-core/lit-core/src/logging/kv.rs b/rust/lit-core/lit-core/src/logging/kv.rs index 9ef0537f..864a775d 100644 --- a/rust/lit-core/lit-core/src/logging/kv.rs +++ b/rust/lit-core/lit-core/src/logging/kv.rs @@ -32,7 +32,7 @@ impl<'a, 'kvs> Visitor<'kvs> for InlineKVVisitor<'a> { pub struct FieldCollectorKVVisitor<'a>(pub &'a mut Map); -impl<'a, 'kvs> Visitor<'kvs> for FieldCollectorKVVisitor<'a> { +impl<'kvs> Visitor<'kvs> for FieldCollectorKVVisitor<'_> { fn visit_pair(&mut self, key: Key<'kvs>, value: Value<'kvs>) -> Result<(), KVError> { let value = if let Some(err) = value.to_borrowed_error() { if let Some(err) = err.downcast_ref::() { @@ -55,7 +55,7 @@ impl<'a, 'kvs> Visitor<'kvs> for FieldCollectorKVVisitor<'a> { } } -impl<'a> tracing::field::Visit for FieldCollectorKVVisitor<'a> { +impl tracing::field::Visit for FieldCollectorKVVisitor<'_> { fn record_f64(&mut self, field: &tracing::field::Field, value: f64) { if let Ok(value) = serde_json::to_value(value) { self.0.insert(field.name().to_string(), value); diff --git a/rust/lit-core/lit-core/src/utils/backtrace.rs b/rust/lit-core/lit-core/src/utils/backtrace.rs index 8ee97ad8..2e50933a 100644 --- a/rust/lit-core/lit-core/src/utils/backtrace.rs +++ b/rust/lit-core/lit-core/src/utils/backtrace.rs @@ -4,7 +4,7 @@ use std::panic::PanicHookInfo; pub fn backtrace_to_vec(backtrace: &Backtrace) -> Vec { let backtrace_str = format!("{backtrace}"); let backtrace: Vec = - backtrace_str.split('\n').map(|s| s.trim().to_string()).filter(|s| !s.eq("")).collect(); + backtrace_str.split('\n').map(|s| s.trim().to_string()).filter(|s| !s.is_empty()).collect(); backtrace } diff --git a/rust/lit-core/lit-core/src/utils/env.rs b/rust/lit-core/lit-core/src/utils/env.rs index db09dfe1..8d11e8b8 100644 --- a/rust/lit-core/lit-core/src/utils/env.rs +++ b/rust/lit-core/lit-core/src/utils/env.rs @@ -40,7 +40,7 @@ pub fn parse_env(reader: &mut BufReader) -> Result(), + &std::mem::take(&mut substitution_name), &mut output, ); if c == '$' { @@ -273,7 +273,7 @@ fn parse_value( substitution_mode = SubstitutionMode::None; apply_substitution( substitution_data, - &substitution_name.drain(..).collect::(), + &std::mem::take(&mut substitution_name), &mut output, ); } else { @@ -317,11 +317,7 @@ fn parse_value( if value_length == 0 { 0 } else { value_length - 1 }, )) } else { - apply_substitution( - substitution_data, - &substitution_name.drain(..).collect::(), - &mut output, - ); + apply_substitution(substitution_data, &std::mem::take(&mut substitution_name), &mut output); Ok(output) } } diff --git a/rust/lit-core/lit-core/src/utils/tar.rs b/rust/lit-core/lit-core/src/utils/tar.rs index 48fbf949..04724470 100644 --- a/rust/lit-core/lit-core/src/utils/tar.rs +++ b/rust/lit-core/lit-core/src/utils/tar.rs @@ -134,8 +134,7 @@ pub fn write_tar_gz(dir_to_pack: impl AsRef, output: impl Write) -> Result } let encoder = flate2::write::GzEncoder::new(output, flate2::Compression::default()); let mut builder = tar_file::Builder::new(encoder); - let name = - dir_to_pack.file_name().map(|p| PathBuf::from(p)).unwrap_or_else(|| PathBuf::from("")); + let name = dir_to_pack.file_name().map(PathBuf::from).unwrap_or_else(|| PathBuf::from("")); builder.append_dir_all(name, dir_to_pack).map_err(|e| { io_err(e, Some(format!("Unable to append directory {} to tar file", dir_to_pack.display()))) })?; diff --git a/rust/lit-core/lit-fast-ecdsa/Cargo.toml b/rust/lit-core/lit-fast-ecdsa/Cargo.toml index 71dfdba1..7dbe6d73 100644 --- a/rust/lit-core/lit-fast-ecdsa/Cargo.toml +++ b/rust/lit-core/lit-fast-ecdsa/Cargo.toml @@ -7,31 +7,27 @@ version = "0.2.0" [features] default = ["presign"] -presign = ["vsss-rs/std", "lit-poly"] +presign = ["lit-poly"] [dependencies] digest = "0.10" ecdsa = { version = "0.16", features = ["arithmetic", "digest", "hazmat"] } -elliptic-curve.workspace = true elliptic-curve-tools.workspace = true hex.workspace = true lit-poly = { git = "https://github.com/LIT-Protocol/lit-poly.git", optional = true } -hd-keys-curves-wasm = { git = "https://github.com/LIT-Protocol/hd-keys-curves-wasm.git", rev = "5e0dcc1a6d8d08f2328d4716dca806db87f93748", default-features = false, features = ["k256", "p256", "p384"] } +hd-keys-curves-wasm = { workspace = true, features = ["k256", "p256", "p384"] } +lit-rust-crypto = { workspace = true, features = ["k256", "p256", "p384", "serde", "vsss-rs"] } rand.workspace = true serde.workspace = true sha2.workspace = true subtle = "2.6" thiserror.workspace = true -vsss-rs.workspace = true zeroize.workspace = true [dev-dependencies] -criterion = "0.5" -k256.workspace = true -p256.workspace = true -p384.workspace = true +criterion = "0.7" rand_chacha.workspace = true -rstest = "0.24" +rstest = "0.26" serde_json.workspace = true [[bench]] diff --git a/rust/lit-core/lit-fast-ecdsa/benches/k256.rs b/rust/lit-core/lit-fast-ecdsa/benches/k256.rs index c9cd6302..04a1c285 100644 --- a/rust/lit-core/lit-fast-ecdsa/benches/k256.rs +++ b/rust/lit-core/lit-fast-ecdsa/benches/k256.rs @@ -9,6 +9,7 @@ use lit_fast_ecdsa::{ SignatureShare, }; use lit_poly::DensePrimeField; +use lit_rust_crypto::k256; use rand::SeedableRng; use rand::seq::SliceRandom; use std::collections::BTreeSet; diff --git a/rust/lit-core/lit-fast-ecdsa/benches/p256.rs b/rust/lit-core/lit-fast-ecdsa/benches/p256.rs index c62b5ac5..1d9de774 100644 --- a/rust/lit-core/lit-fast-ecdsa/benches/p256.rs +++ b/rust/lit-core/lit-fast-ecdsa/benches/p256.rs @@ -9,6 +9,7 @@ use lit_fast_ecdsa::{ SignatureShare, }; use lit_poly::DensePrimeField; +use lit_rust_crypto::p256; use rand::SeedableRng; use rand::seq::SliceRandom; use std::collections::BTreeSet; diff --git a/rust/lit-core/lit-fast-ecdsa/src/error.rs b/rust/lit-core/lit-fast-ecdsa/src/error.rs index da5c2629..db78a639 100644 --- a/rust/lit-core/lit-fast-ecdsa/src/error.rs +++ b/rust/lit-core/lit-fast-ecdsa/src/error.rs @@ -1,3 +1,4 @@ +use lit_rust_crypto::vsss_rs; use thiserror::Error; /// Error type for this crate @@ -54,8 +55,7 @@ pub enum EcdsaError { /// Invalid round 3 payload error #[error("Invalid round 3 payload")] InvalidRound3Payload, - /// Invalid round 4 payload error - /// Insufficient shares error + /// Insufficient round 1 payloads error #[error("Insufficient round 1 payloads received")] InsufficientRound1Payloads, /// Invalid ID in commitment or share error @@ -67,7 +67,6 @@ pub enum EcdsaError { /// Insufficient round 3 payloads error #[error("Insufficient round 3 payloads received")] InsufficientRound3Payloads, - /// Invalid round 4 payload error /// Invalid computed pre-signature big R error #[error("Invalid computed pre-signature big R")] InvalidBigR, diff --git a/rust/lit-core/lit-fast-ecdsa/src/presign.rs b/rust/lit-core/lit-fast-ecdsa/src/presign.rs index 785abc24..9b955153 100644 --- a/rust/lit-core/lit-fast-ecdsa/src/presign.rs +++ b/rust/lit-core/lit-fast-ecdsa/src/presign.rs @@ -18,14 +18,14 @@ use ecdsa::{ elliptic_curve::{CurveArithmetic, Field, Group, group::GroupEncoding}, }; use hd_keys_curves_wasm::{HDDerivable, HDDeriver}; +use lit_rust_crypto::vsss_rs::{ + DefaultShare, IdentifierPrimeField, ShareVerifierGroup, ValuePrimeField, VecFeldmanVerifierSet, +}; use std::{ fmt::{self, Debug, Formatter}, ops::Add, }; use subtle::ConstantTimeEq; -use vsss_rs::{ - DefaultShare, IdentifierPrimeField, ShareVerifierGroup, ValuePrimeField, VecFeldmanVerifierSet, -}; use zeroize::ZeroizeOnDrop; use crate::utils::{calc_min_threshold, lagrange}; diff --git a/rust/lit-core/lit-fast-ecdsa/src/presign/data.rs b/rust/lit-core/lit-fast-ecdsa/src/presign/data.rs index b7fe5a83..9c303b53 100644 --- a/rust/lit-core/lit-fast-ecdsa/src/presign/data.rs +++ b/rust/lit-core/lit-fast-ecdsa/src/presign/data.rs @@ -416,6 +416,8 @@ mod tests { #[test] fn serde_tests() { + use lit_rust_crypto::k256; + let round_data = RoundPayload::Round1(Round1Payload { ordinal: 1, id: k256::Scalar::from(2u64), diff --git a/rust/lit-core/lit-fast-ecdsa/src/presign/round1.rs b/rust/lit-core/lit-fast-ecdsa/src/presign/round1.rs index 680dc5c1..c1c1607c 100644 --- a/rust/lit-core/lit-fast-ecdsa/src/presign/round1.rs +++ b/rust/lit-core/lit-fast-ecdsa/src/presign/round1.rs @@ -7,7 +7,7 @@ use ecdsa::{ }, }; use hd_keys_curves_wasm::HDDerivable; -use vsss_rs::{FeldmanVerifierSet, ParticipantIdGeneratorType, feldman}; +use lit_rust_crypto::vsss_rs::{FeldmanVerifierSet, ParticipantIdGeneratorType, feldman}; use super::*; use crate::*; diff --git a/rust/lit-core/lit-fast-ecdsa/src/tests/full.rs b/rust/lit-core/lit-fast-ecdsa/src/tests/full.rs index 40eaa2bb..dd2903a5 100644 --- a/rust/lit-core/lit-fast-ecdsa/src/tests/full.rs +++ b/rust/lit-core/lit-fast-ecdsa/src/tests/full.rs @@ -13,6 +13,7 @@ use ecdsa::{ }; use hd_keys_curves_wasm::{HDDerivable, HDDeriver}; use lit_poly::DensePrimeField; +use lit_rust_crypto::{k256, p256, p384}; use rand::seq::SliceRandom; use rstest::*; use std::{collections::HashMap, ops::Add, time::Instant}; diff --git a/rust/lit-core/lit-fast-ecdsa/src/tests/sign.rs b/rust/lit-core/lit-fast-ecdsa/src/tests/sign.rs index 2c0b3c34..14e7e040 100644 --- a/rust/lit-core/lit-fast-ecdsa/src/tests/sign.rs +++ b/rust/lit-core/lit-fast-ecdsa/src/tests/sign.rs @@ -4,8 +4,8 @@ use crate::{ }; use ecdsa::elliptic_curve::{NonZeroScalar, rand_core::SeedableRng}; use ecdsa::signature::Verifier; -use hd_keys_curves_wasm::k256; use lit_poly::DensePrimeField; +use lit_rust_crypto::k256; #[test] fn lowest_threshold_trusted_dealer() { diff --git a/rust/lit-core/lit-fast-ecdsa/src/utils.rs b/rust/lit-core/lit-fast-ecdsa/src/utils.rs index accbb8a3..dc424e02 100644 --- a/rust/lit-core/lit-fast-ecdsa/src/utils.rs +++ b/rust/lit-core/lit-fast-ecdsa/src/utils.rs @@ -118,6 +118,8 @@ impl ParticipantList { #[test] fn test_lagrange() { + use lit_rust_crypto::k256; + let participants: [NonZeroScalar; 3] = [ NonZeroScalar::new(k256::Scalar::ONE).unwrap(), NonZeroScalar::new(k256::Scalar::from(2u32)).unwrap(), diff --git a/rust/lit-core/lit-logging/src/lib.rs b/rust/lit-core/lit-logging/src/lib.rs index 24d5bdf2..a0499497 100644 --- a/rust/lit-core/lit-logging/src/lib.rs +++ b/rust/lit-core/lit-logging/src/lib.rs @@ -116,7 +116,7 @@ impl fmt::Display for Padded { } } -pub fn colored_level(style: &mut Style, level: Level) -> StyledValue<&'static str> { +pub fn colored_level(style: &mut Style, level: Level) -> StyledValue<'_, &'static str> { match level { Level::Trace => style.set_color(Color::Magenta).value("TRACE"), Level::Debug => style.set_color(Color::Blue).value("DEBUG"), diff --git a/rust/lit-core/lit-observability/src/channels.rs b/rust/lit-core/lit-observability/src/channels.rs index f8a620cb..311c0fd9 100644 --- a/rust/lit-core/lit-observability/src/channels.rs +++ b/rust/lit-core/lit-observability/src/channels.rs @@ -55,7 +55,7 @@ where /// Send a value to the channel and inject tracing context into the metadata of the message. #[instrument(level = "debug", name = "traced_send_async", skip_all)] - pub fn send_async(&self, data: T) -> SendFut> { + pub fn send_async(&self, data: T) -> SendFut<'_, ChannelMsg> { // Inject tracing context into metadata. let mut metadata = HashMap::new(); let cx = tracing::Span::current().context(); @@ -130,7 +130,9 @@ where /// - recv span /// - consumer span /// - - pub async fn recv_async(&self) -> , tracing::Span)> as Future>::Output { + pub async fn recv_async( + &self, + ) -> , tracing::Span)> as Future>::Output { let recv_span = debug_span!("traced_recv_async"); let mut msg = self.inner.recv_async().instrument(recv_span.clone()).await?; diff --git a/rust/lit-core/lit-recovery/Cargo.toml b/rust/lit-core/lit-recovery/Cargo.toml index 96128065..359e5f3a 100644 --- a/rust/lit-core/lit-recovery/Cargo.toml +++ b/rust/lit-core/lit-recovery/Cargo.toml @@ -1,31 +1,24 @@ [package] name = "lit-recovery" -version = "0.2.0" +version = "0.3.0" edition.workspace = true [dependencies] arc-swap = "1.7" argon2 = "0.5" -blsful = "3.0.0" ciborium = { version = "0.2.0" } clap = { version = "4", features = ["derive"] } colored = "3" cryptex = { version = "1.8.2", features = ["file"] } -decaf377.workspace = true dirs = "6" -elliptic-curve.workspace = true ethers.workspace = true glob = "0.3.1" hex.workspace = true -ed448-goldilocks-plus.workspace = true -jubjub.workspace = true -k256.workspace = true lit-node-core = { path = "../../lit-node/lit-node-core" } lit-blockchain = { path = "../lit-blockchain", default-features = false } lit-core = { path = "../lit-core", default-features = false } +lit-rust-crypto = { workspace = true, features = ["default", "blst", "serde"] } path-clean = "1" -p256.workspace = true -p384.workspace = true rand.workspace = true reqwest = { version = "0.11", features = ["json", "blocking"] } rusqlite = { version = "0.32", features = ["bundled-sqlcipher-vendored-openssl"] } @@ -39,13 +32,12 @@ soteria-rs = { version = "0.3.1", features = ["signing"] } thiserror.workspace = true tiny-bip39 = { version = "2.0", default-features = false } tokio.workspace = true -verifiable-share-encryption = { version = "0.3.0", git = "https://github.com/LIT-Protocol/verifiable-share-encryption", rev = "7eddfbe736369db596d0f302c72f1d76b0fd332d" } -vsss-rs = { workspace = true, features = ["curve25519"] } +verifiable-share-encryption = { git = "https://github.com/LIT-Protocol/verifiable-share-encryption", branch = "pallas" } generic-array.workspace = true [dependencies.bulletproofs] -version = "4.0.0" +workspace = true features = [ "std", "ristretto25519", @@ -58,9 +50,8 @@ features = [ "ed448", "jubjub", "decaf377", + "pasta", ] -git = "https://github.com/LIT-Protocol/bulletproofs" -rev = "ddf11c2f593e71f24c9a3d64c56f62d82f2b5099" [target.'cfg(target_os = "windows")'.dependencies] winapi = { version = "0.3", features = ["dpapi", "errhandlingapi", "wincred", "winerror"] } diff --git a/rust/lit-core/lit-recovery/src/auth.rs b/rust/lit-core/lit-recovery/src/auth.rs index 9c98d46b..11f2a66b 100644 --- a/rust/lit-core/lit-recovery/src/auth.rs +++ b/rust/lit-core/lit-recovery/src/auth.rs @@ -1,5 +1,5 @@ use crate::eth::*; -use bulletproofs::k256::ecdsa::SigningKey; +use lit_rust_crypto::k256::ecdsa::SigningKey; use serde::Serialize; /// Borrowed from https://github.com/LIT-Protocol/lit-assets/blob/develop/rust/lit-node/src/auth/auth_material.rs#L161 diff --git a/rust/lit-core/lit-recovery/src/chain_manager.rs b/rust/lit-core/lit-recovery/src/chain_manager.rs index d6fc909a..97d3e958 100644 --- a/rust/lit-core/lit-recovery/src/chain_manager.rs +++ b/rust/lit-core/lit-recovery/src/chain_manager.rs @@ -5,7 +5,6 @@ use crate::{ config::RecoveryConfig, error::{Error, RecoveryResult}, }; -use bulletproofs::k256::{SecretKey, ecdsa::SigningKey}; use ethers::{ prelude::SignerMiddleware, providers::{Http, Provider}, @@ -17,6 +16,7 @@ use lit_blockchain::contracts::{ contract_resolver::ContractResolver, staking::{AddressMapping, Staking, Validator}, }; +use lit_rust_crypto::k256::{FieldBytes, SecretKey, ecdsa::SigningKey}; use reqwest::Url; @@ -47,7 +47,7 @@ impl ChainManager, Wallet>> { return Err(crate::Error::InvalidRequest(e.to_string())); } }; - let bytes = bulletproofs::k256::FieldBytes::from_slice(private_key); + let bytes = FieldBytes::from_slice(private_key); let sk = match SecretKey::from_bytes(bytes) { Ok(key) => key, Err(e) => { @@ -55,7 +55,7 @@ impl ChainManager, Wallet>> { } }; let chain_id = cfg.get_chain_id_or_default(); - let env = cfg.get_env_or_default(); + let env = cfg.get_env_or_default() as u8; println!("using chain id: {}", chain_id); println!("using contract resolver address: {}", resolver_address.clone()); @@ -261,7 +261,7 @@ fn _build_rpc_client(cfg: &RecoveryConfig) -> Result, Error> { }; let provider = Provider::new(Http::new_with_client(url, client)); - Ok(provider as Provider) + Ok(provider) } #[derive(Debug)] diff --git a/rust/lit-core/lit-recovery/src/config.rs b/rust/lit-core/lit-recovery/src/config.rs index be975e7d..2c6d34f4 100644 --- a/rust/lit-core/lit-recovery/src/config.rs +++ b/rust/lit-core/lit-recovery/src/config.rs @@ -2,12 +2,81 @@ use crate::{ consts::{ CONTRACT_CHRONICLE_CHAIN_ID, CONTRACT_CHRONICLE_RPC_URL, CONTRACT_RESOLVER_ENVIRONMENT, }, - error::RecoveryResult, + error::{Error, RecoveryResult}, }; use serde::{Deserialize, Serialize}; +use std::fmt::{self, Display, Formatter}; use std::io::Write; use std::path::PathBuf; +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Ord, PartialOrd)] +#[repr(u8)] +pub enum ChainEnvironment { + #[default] + Develop = 0, + Staging = 1, + Production = 2, +} + +impl Display for ChainEnvironment { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!( + f, + "{}", + match self { + ChainEnvironment::Develop => "develop", + ChainEnvironment::Staging => "staging", + ChainEnvironment::Production => "production", + } + ) + } +} + +impl std::str::FromStr for ChainEnvironment { + type Err = Error; + + fn from_str(s: &str) -> Result { + match s { + "develop" => Ok(ChainEnvironment::Develop), + "staging" => Ok(ChainEnvironment::Staging), + "production" => Ok(ChainEnvironment::Production), + _ => Err(Error::General(format!("invalid chain environment: {}", s))), + } + } +} + +impl TryFrom for ChainEnvironment { + type Error = Error; + + fn try_from(value: u8) -> Result { + match value { + 0 => Ok(ChainEnvironment::Develop), + 1 => Ok(ChainEnvironment::Staging), + 2 => Ok(ChainEnvironment::Production), + _ => Err(Error::General(format!("Invalid chain environment: {}", value))), + } + } +} + +impl serde::Serialize for ChainEnvironment { + fn serialize(&self, s: S) -> Result + where + S: serde::Serializer, + { + s.serialize_u8(*self as u8) + } +} + +impl<'de> serde::Deserialize<'de> for ChainEnvironment { + fn deserialize(d: D) -> Result + where + D: serde::Deserializer<'de>, + { + let c = u8::deserialize(d)?.try_into().map_err(serde::de::Error::custom)?; + Ok(c) + } +} + #[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)] pub struct RecoveryConfig { pub resolver_address: Option, @@ -16,24 +85,22 @@ pub struct RecoveryConfig { // 0 - develop // 1 - staging // 2 - production - pub environment: Option, + pub environment: Option, } impl TryFrom for RecoveryConfig { + type Error = Error; + fn try_from(value: String) -> Result { - let conf = - serde_json::from_str(value.as_str()).map_err(crate::error::Error::InvalidJsonFormat)?; + let conf = serde_json::from_str(value.as_str()).map_err(Error::InvalidJsonFormat)?; Ok(conf) } - - type Error = crate::error::Error; } impl RecoveryConfig { #[allow(dead_code)] fn from_slice(v: &[u8]) -> RecoveryResult { - let conf: RecoveryConfig = - serde_json::from_slice(v).map_err(crate::error::Error::InvalidJsonFormat)?; + let conf: RecoveryConfig = serde_json::from_slice(v).map_err(Error::InvalidJsonFormat)?; Ok(conf) } @@ -51,7 +118,7 @@ impl RecoveryConfig { if config_path.exists() { let conf = std::fs::read(config_path)?; if conf.is_empty() { - Err(crate::error::Error::General("Could not find config file on disk".to_string())) + Err(Error::General("Could not find config file on disk".to_string())) } else { let conf: RecoveryConfig = serde_json::from_slice(&conf)?; Ok(conf) @@ -59,9 +126,9 @@ impl RecoveryConfig { } else { let config = Self { resolver_address: None, - rpc_url: Some(crate::consts::CONTRACT_CHRONICLE_RPC_URL.into()), - chain_id: Some(crate::consts::CONTRACT_CHRONICLE_CHAIN_ID), - environment: Some(2), + rpc_url: Some(CONTRACT_CHRONICLE_RPC_URL.into()), + chain_id: Some(CONTRACT_CHRONICLE_CHAIN_ID), + environment: Some(ChainEnvironment::Production), }; let conf = serde_json::to_vec(&config)?; let mut fd = std::fs::File::create(config_path.clone())?; @@ -84,7 +151,9 @@ impl RecoveryConfig { println!("Failed to create config directory: {}", e); println!( "Current directory: {}", - std::env::current_dir().unwrap().display() + std::env::current_dir() + .expect("to know the current directory") + .display() ); return Err(e.into()); } @@ -111,23 +180,16 @@ impl RecoveryConfig { } pub fn get_rpc_url_or_default(&self) -> String { - match self.rpc_url.clone() { - Some(url) => url, - None => CONTRACT_CHRONICLE_RPC_URL.into(), - } + self.rpc_url.clone().unwrap_or_else(|| CONTRACT_CHRONICLE_RPC_URL.into()) } pub fn get_chain_id_or_default(&self) -> u64 { - match self.chain_id { - Some(id) => id, - None => CONTRACT_CHRONICLE_CHAIN_ID, - } + self.chain_id.unwrap_or_else(|| CONTRACT_CHRONICLE_CHAIN_ID) } - pub fn get_env_or_default(&self) -> u8 { - match self.environment { - Some(env) => env, - None => CONTRACT_RESOLVER_ENVIRONMENT, - } + pub fn get_env_or_default(&self) -> ChainEnvironment { + self.environment.unwrap_or_else(|| { + CONTRACT_RESOLVER_ENVIRONMENT.try_into().expect("invalid environment") + }) } } diff --git a/rust/lit-core/lit-recovery/src/consts.rs b/rust/lit-core/lit-recovery/src/consts.rs index a3313d79..1e1a0131 100644 --- a/rust/lit-core/lit-recovery/src/consts.rs +++ b/rust/lit-core/lit-recovery/src/consts.rs @@ -31,6 +31,7 @@ pub const ED448: &str = "Ed448"; pub const JUBJUB: &str = "RedJubjub"; pub const DECAF377: &str = "RedDecaf377"; pub const BLS12381G1_SIGN: &str = "BLS12381G1Sign"; +pub const PALLAS: &str = "RedPallas"; pub const CONFIG_STORAGE: [&str; 2] = [concat!(".", env!("CARGO_PKG_NAME")), "config.json"]; @@ -46,4 +47,5 @@ pub const ED448_ENCRYPTION_KEY_FN: &str = "ed448_encryption_key"; pub const JUBJUB_ENCRYPTION_KEY_FN: &str = "jubjub_encryption_key"; pub const DECAF377_ENCRYPTION_KEY_FN: &str = "decaf377_encryption_key"; pub const BLS12381G1_ENCRYPTION_KEY_FN: &str = "bls12381g1_encryption_key"; +pub const PALLAS_ENCRYPTION_KEY_FN: &str = "pallas_encryption_key"; pub const SESSION_ID_FN: &str = "session_id"; diff --git a/rust/lit-core/lit-recovery/src/decryption.rs b/rust/lit-core/lit-recovery/src/decryption.rs index ffd371e2..ef27db95 100644 --- a/rust/lit-core/lit-recovery/src/decryption.rs +++ b/rust/lit-core/lit-recovery/src/decryption.rs @@ -1,3 +1,4 @@ +use crate::config::ChainEnvironment; use crate::io::writer; use crate::{ LitRecovery, RecoveryConfig, @@ -10,8 +11,8 @@ use crate::{ shares::{COLUMN_ENCRYPTION_KEY, ShareData, ShareDatabase}, }; use bulletproofs::BulletproofCurveArithmetic; -use bulletproofs::vsss_rs::{DefaultShare, IdentifierPrimeField}; use ethers::types::H160; +use lit_rust_crypto::vsss_rs::{DefaultShare, IdentifierPrimeField}; use serde::Serialize; use serde::de::DeserializeOwned; use std::collections::HashMap; @@ -366,7 +367,7 @@ fn get_protocol(cfg: &RecoveryConfig) -> &str { // compute the value based on `env`: match cfg.get_env_or_default() { - 0 => "http", + ChainEnvironment::Develop => "http", _ => "https", } } diff --git a/rust/lit-core/lit-recovery/src/download.rs b/rust/lit-core/lit-recovery/src/download.rs index f7dea3d4..088db057 100644 --- a/rust/lit-core/lit-recovery/src/download.rs +++ b/rust/lit-core/lit-recovery/src/download.rs @@ -1,13 +1,13 @@ -use bulletproofs::k256::{ - ecdsa::SigningKey, +use ethers::middleware::SignerMiddleware; +use ethers::providers::{Http, Provider}; +use ethers::signers::Wallet; +use lit_rust_crypto::{ elliptic_curve::{ Field, PrimeField, consts::U32, generic_array::GenericArray, group::GroupEncoding, ops::Reduce, point::AffineCoordinates, sec1::ToEncodedPoint, }, + k256::ecdsa::SigningKey, }; -use ethers::middleware::SignerMiddleware; -use ethers::providers::{Http, Provider}; -use ethers::signers::Wallet; use sha2::Digest; use std::io::Write; use std::time::{SystemTime, UNIX_EPOCH}; @@ -118,7 +118,7 @@ struct ContractProofK256 { impl ContractProofK256 { #[allow(dead_code)] pub fn generate(share: &[u8], participant_id: u8) -> RecoveryResult { - use bulletproofs::k256::*; + use lit_rust_crypto::k256::*; let mut repr = FieldBytes::default(); repr.copy_from_slice(share); @@ -200,7 +200,7 @@ struct ContractProofBls12381G1 { impl ContractProofBls12381G1 { #[allow(dead_code)] pub fn generate(share: &[u8], participant_id: u8) -> RecoveryResult { - use bulletproofs::blstrs_plus::*; + use lit_rust_crypto::blstrs_plus::*; let share_bytes = <[u8; 32]>::try_from(share).unwrap(); let share = Option::::from(Scalar::from_be_bytes(&share_bytes)) @@ -646,7 +646,7 @@ mod tests { #[ignore] #[test] fn test_contract_proof_k256() { - use bulletproofs::k256::*; + use lit_rust_crypto::k256::*; let share = Scalar::random(rand::rngs::OsRng); let res = ContractProofK256::generate(&share.to_bytes(), 1); @@ -666,7 +666,7 @@ mod tests { #[ignore] #[test] fn test_contract_proof_bls() { - use bulletproofs::blstrs_plus::*; + use lit_rust_crypto::blstrs_plus::*; let share = Scalar::random(rand::rngs::OsRng); let res = ContractProofBls12381G1::generate(&share.to_be_bytes(), 1); diff --git a/rust/lit-core/lit-recovery/src/eth.rs b/rust/lit-core/lit-recovery/src/eth.rs index eb52f095..5016a7ed 100644 --- a/rust/lit-core/lit-recovery/src/eth.rs +++ b/rust/lit-core/lit-recovery/src/eth.rs @@ -1,4 +1,4 @@ -use bulletproofs::k256::ecdsa::{RecoveryId, Signature, SigningKey, VerifyingKey}; +use lit_rust_crypto::k256::ecdsa::{RecoveryId, Signature, SigningKey, VerifyingKey}; use sha3::{Keccak256, digest::Digest}; pub trait EthereumAddress { diff --git a/rust/lit-core/lit-recovery/src/lib.rs b/rust/lit-core/lit-recovery/src/lib.rs index 23d548cf..6085db33 100644 --- a/rust/lit-core/lit-recovery/src/lib.rs +++ b/rust/lit-core/lit-recovery/src/lib.rs @@ -1,10 +1,10 @@ use crate::args::Commands; use crate::chain_manager::ChainManager; -use crate::config::RecoveryConfig; +use crate::config::{ChainEnvironment, RecoveryConfig}; use crate::consts::{ ADMIN_CONTRACT_EMAIL, BLS12381G1, BLS12381G1_SIGN, DECAF377, ED448, ED25519, JUBJUB, KEYRING_DB_KEY_NAME, KEYRING_KEY_NAME, LIT_BACKUP_NAME_PATTERN, LIT_BACKUP_SUFFIX, - LIT_NODE_DELETE_SHARE_ENDPOINT, LIT_NODE_DOWNLOAD_SHARE_ENDPOINT, NISTP256, NISTP384, + LIT_NODE_DELETE_SHARE_ENDPOINT, LIT_NODE_DOWNLOAD_SHARE_ENDPOINT, NISTP256, NISTP384, PALLAS, RISTRETTO25519, SECP256K1, }; use crate::decryption::{ @@ -20,18 +20,22 @@ use crate::shares::{ }; use arc_swap::ArcSwap; use bip39::Mnemonic; -use blsful::inner_types::{Group, PrimeCurveAffine}; -use bulletproofs::bls12_381_plus::elliptic_curve::bigint::U512; -use bulletproofs::bls12_381_plus::elliptic_curve::ops::Reduce; -use bulletproofs::blstrs_plus::Bls12381G1; -use bulletproofs::{Decaf377, Ed25519, JubJub, Ristretto25519, jubjub}; +use bulletproofs::{Decaf377, Ed25519, JubJub, Ristretto25519}; use colored::Colorize; use cryptex::DynKeyRing; -use ed448_goldilocks_plus::Ed448; use hex::FromHex; -use k256::Secp256k1; -use k256::ecdsa::VerifyingKey; use lit_blockchain::contracts::backup_recovery::NextStateDownloadable; +use lit_rust_crypto::{ + blsful::inner_types::{G1Projective, Group, PrimeCurveAffine}, + blstrs_plus::Bls12381G1, + decaf377, + ed448_goldilocks::{self, Ed448}, + elliptic_curve::{bigint::U512, ops::Reduce}, + group::{GroupEncoding, cofactor::CofactorGroup}, + jubjub, + k256::{self, Secp256k1, ecdsa::VerifyingKey}, + p256, p384, pallas, vsss_rs, +}; use rand::{Rng, RngCore, rngs::OsRng}; use serde::de::DeserializeOwned; use std::collections::{BTreeMap, HashMap}; @@ -39,7 +43,6 @@ use std::path::PathBuf; use std::sync::Arc; use tokio::io::AsyncReadExt; use tokio::sync::Mutex; -use vsss_rs::elliptic_curve::group::GroupEncoding; pub mod args; pub mod auth; @@ -107,7 +110,7 @@ impl Default for LitRecovery { resolver_address: None, rpc_url: Some(consts::CONTRACT_CHRONICLE_RPC_URL.into()), chain_id: Some(consts::CONTRACT_CHRONICLE_CHAIN_ID), - environment: Some(2), // production is 2 + environment: Some(ChainEnvironment::Production), })), config_path: None, keyring_file: None, @@ -287,6 +290,7 @@ impl LitRecovery { (JUBJUB.to_string(), 8), (DECAF377.to_string(), 9), (BLS12381G1_SIGN.to_string(), 10), + (PALLAS.to_string(), 11), ] .into_iter() .collect::>(); @@ -543,12 +547,18 @@ impl LitRecovery { ) .await? } + PALLAS => { + generate_and_send_decryption_shares_to_nodes::( + self, ciphertext_file, encryption_key, + ) + .await? + } _ => { println!( "Key type not supported! Please use either [{}]", [ BLS12381G1, SECP256K1, NISTP256, NISTP384, ED25519, RISTRETTO25519, - ED448, JUBJUB, DECAF377 + ED448, JUBJUB, DECAF377, PALLAS, ] .join(", ") ); @@ -572,12 +582,11 @@ impl LitRecovery { } Commands::SetConfig { address, chain_id, rpc_url, env } => { let config = self.config.load(); - let new_config = Arc::new(RecoveryConfig { resolver_address: Some(address.clone()), chain_id: Some(chain_id), rpc_url: Some(rpc_url.clone()), - environment: Some(env), + environment: Some(env.try_into().expect("a valid environment value")), ..config.as_ref().clone() }); @@ -658,12 +667,18 @@ impl LitRecovery { ) .await?; } + PALLAS => { + write_local_decrypt_share::( + self, ciphertext_file, encryption_key, share_file, output_share_file, + ) + .await?; + } _ => { println!( "Key type not supported! Please use either [{}]", [ BLS12381G1, SECP256K1, NISTP256, NISTP384, ED25519, RISTRETTO25519, - ED448, JUBJUB, DECAF377, BLS12381G1_SIGN, + ED448, JUBJUB, DECAF377, BLS12381G1_SIGN, PALLAS, ] .join(", ") ); @@ -720,7 +735,6 @@ impl LitRecovery { )?; } JUBJUB => { - use elliptic_curve::group::cofactor::CofactorGroup; // Jubjub uses a special generator for signing. Use this here pub const SPENDAUTHSIG_BASEPOINT_BYTES: [u8; 32] = [ 48, 181, 242, 170, 173, 50, 86, 48, 188, 221, 219, 206, 77, 103, 101, 109, @@ -748,12 +762,32 @@ impl LitRecovery { ciphertext_file, blinder, decrypted_share_files, output_file, None, )?; } + PALLAS => { + // Pallas uses a special generator for signing. Use this here + const SPENDAUTHSIG_BASEPOINT_BYTES: [u8; 32] = [ + 99, 201, 117, 184, 132, 114, 26, 141, 12, 161, 112, 123, 227, 12, 127, 12, + 95, 68, 95, 62, 124, 24, 141, 59, 6, 214, 241, 40, 179, 35, 85, 183, + ]; + let pt: pallas::Point = + pallas::Affine::from_bytes(&SPENDAUTHSIG_BASEPOINT_BYTES.into()) + .unwrap() + .into(); + + let blinder = read_blinder::(blinder, "pallas_blinder")?; + merge_decryption_shares::( + ciphertext_file, + blinder, + decrypted_share_files, + output_file, + Some(pt), + )?; + } _ => { println!( "Key type not supported! Please use either [{}]", [ BLS12381G1, SECP256K1, NISTP256, NISTP384, ED25519, RISTRETTO25519, - ED448, JUBJUB, DECAF377, BLS12381G1_SIGN, + ED448, JUBJUB, DECAF377, BLS12381G1_SIGN, PALLAS, ] .join(", ") ); @@ -847,16 +881,17 @@ impl LitRecovery { path.to_str().ok_or(Error::General("Failed to stringify path".into()))?; // Extract the tar files. - let mut bls_enc_key = blsful::inner_types::G1Projective::default(); + let mut bls_enc_key = G1Projective::default(); let mut secp256k1_enc_key = k256::AffinePoint::default(); let mut nistp256_enc_key = p256::AffinePoint::default(); let mut nistp384_enc_key = p384::AffinePoint::default(); let mut ed25519_enc_key = vsss_rs::curve25519::WrappedEdwards::default(); let mut ristretto25519_enc_key = vsss_rs::curve25519::WrappedRistretto::default(); - let mut ed448_enc_key = ed448_goldilocks_plus::EdwardsPoint::default(); + let mut ed448_enc_key = ed448_goldilocks::EdwardsPoint::default(); let mut jubjub_enc_key = jubjub::SubgroupPoint::IDENTITY; let mut decaf377_enc_key = decaf377::Element::IDENTITY; - let mut bls12381g1_sign_enc_key = blsful::inner_types::G1Projective::default(); + let mut bls12381g1_sign_enc_key = G1Projective::default(); + let mut pallas_enc_key = pallas::Point::default(); // extract each tar file, and check the public keys and session id // to ensure they match @@ -895,7 +930,7 @@ impl LitRecovery { bls_enc_key = read_from_disk(destination.clone(), consts::BLS_ENCRYPTION_KEY_FN).await?; } else { - let tmp_bls_enc_key: blsful::inner_types::G1Projective = + let tmp_bls_enc_key: G1Projective = read_from_disk(destination.clone(), consts::BLS_ENCRYPTION_KEY_FN).await?; if tmp_bls_enc_key != bls_enc_key { return Err(Error::General(format!( @@ -987,7 +1022,7 @@ impl LitRecovery { ed448_enc_key = read_from_disk(destination.clone(), consts::ED448_ENCRYPTION_KEY_FN).await?; } else { - let tmp_ed448_enc_key: ed448_goldilocks_plus::EdwardsPoint = + let tmp_ed448_enc_key: ed448_goldilocks::EdwardsPoint = read_from_disk(destination.clone(), consts::ED448_ENCRYPTION_KEY_FN).await?; if tmp_ed448_enc_key != ed448_enc_key { return Err(Error::General(format!( @@ -1033,7 +1068,7 @@ impl LitRecovery { read_from_disk(destination.clone(), consts::BLS12381G1_ENCRYPTION_KEY_FN) .await?; } else { - let tmp_bls12381g1_sign_enc_key: blsful::inner_types::G1Projective = + let tmp_bls12381g1_sign_enc_key: G1Projective = read_from_disk(destination.clone(), consts::BLS12381G1_ENCRYPTION_KEY_FN) .await?; if tmp_bls12381g1_sign_enc_key != bls12381g1_sign_enc_key { @@ -1045,6 +1080,21 @@ impl LitRecovery { ))); } } + if pallas_enc_key.is_identity().into() { + pallas_enc_key = + read_from_disk(destination.clone(), consts::PALLAS_ENCRYPTION_KEY_FN).await?; + } else { + let tmp_pallas_enc_key: pallas::Point = + read_from_disk(destination.clone(), consts::PALLAS_ENCRYPTION_KEY_FN).await?; + if tmp_pallas_enc_key != pallas_enc_key { + return Err(Error::General(format!( + "Pallas Encryption Key doesn't match the tar file {}. Expected '{}', Found in tar file '{}'", + file.display(), + hex::encode(tmp_pallas_enc_key.to_bytes()), + hex::encode(pallas_enc_key.to_bytes()), + ))); + } + } } // For each encrypted share in each encrypted folder, send decryption shares to the @@ -1060,6 +1110,7 @@ impl LitRecovery { println!("Total encrypted JubJub shares: {}", shares.jubjub.len()); println!("Total encrypted Decaf377 shares: {}", shares.decaf377.len()); println!("Total encrypted BLS12381G1_SIGN shares: {}", shares.bls12381g1_sign.len()); + println!("Total encrypted Pallas shares: {}", shares.pallas.len()); let mut upload_shares_by_staker_address = HashMap::new(); load_upload_shares::( @@ -1132,6 +1183,13 @@ impl LitRecovery { &mut upload_shares_by_staker_address, ) .await?; + load_upload_shares::( + self, + hex::encode(pallas_enc_key.to_bytes()), + &shares.pallas, + &mut upload_shares_by_staker_address, + ) + .await?; decryption::send_decryption_shares_to_nodes(self, &upload_shares_by_staker_address).await?; Ok(()) @@ -1149,6 +1207,7 @@ struct EncryptedKeyShares { jubjub: Vec, decaf377: Vec, bls12381g1_sign: Vec, + pallas: Vec, } fn fetch_tar_file_names(directory: PathBuf) -> RecoveryResult> { @@ -1167,6 +1226,7 @@ fn fetch_encrypted_key_share_paths(path: PathBuf) -> RecoveryResult RecoveryResult RecoveryResult bool { + (!pt.is_torsion_free() | pt.is_identity() | pt.is_small_order()).into() + } +} + +impl HashToCurve for Pallas { + fn hash_to_curve(msg: &Scalar) -> Point { + const DST: &str = "ECVRF-PALLAS-BLAKE2B512-SSWU_RO_\x0B"; + let bytes = msg.to_le_bytes(); + let hasher = Point::hash_to_curve(DST); + hasher(&bytes) + } +} + +impl NonceGeneration for Pallas { + fn generate_nonce(sk: &Scalar, alpha: &Scalar) -> Scalar { + let mut hasher = Blake2b512::default(); + hasher.update(&sk.to_le_bytes()); + let output = hasher.finalize_reset(); + hasher.update(&output[32..]); + hasher.update(&alpha.to_le_bytes()); + let bytes = hasher.finalize(); + Scalar::from_bytes_wide(&(bytes.into())) + } +} + +impl ChallengeGeneration for Pallas { + fn generate_challenge(points: &[Point]) -> Scalar { + const DST: &[u8] = b"ECVRF-PALLAS-BLAKE2B512-RO_CHALLENGE_GENERATION_"; + let mut hasher = Blake2b512::default(); + hasher.update(DST); + // Suite string + hasher.update([PALLAS_SUITE_STRING]); + // challenge_generation_domain_separator_front + hasher.update([0x02]); + + for point in points { + hasher.update(point.to_bytes()); + } + // challenge_generation_domain_separator_back + hasher.update([0x00]); + + let bytes = hasher.finalize(); + let ref_bytes = <&[u8; 64]>::try_from(bytes.as_slice()).unwrap(); + Scalar::from_bytes_wide(ref_bytes) + } +} + +impl ProofToHash for Pallas { + fn proof_to_hash(gamma: Point) -> Scalar { + const DST: &[u8] = b"ECVRF-PALLAS-BLAKE2B512-RO_PROOF_TO_HASH_"; + let mut hasher = Blake2b512::default(); + hasher.update(DST); + // Suite string + hasher.update([PALLAS_SUITE_STRING]); + // proof_to_hash_domain_separator_front + hasher.update([0x03]); + hasher.update(gamma.to_bytes()); + // proof_to_hash_domain_separator_back + hasher.update([0x00]); + + let bytes = hasher.finalize(); + let ref_bytes = <&[u8; 64]>::try_from(bytes.as_slice()).unwrap(); + Scalar::from_bytes_wide(ref_bytes) + } +} + +impl Coordinate for Pallas { + fn point_to_scalar(pt: Point) -> Scalar { + let mut bytes = [0u8; 64]; + bytes[..32].copy_from_slice(pt.to_bytes().as_ref()); + Scalar::from_bytes_wide(&bytes) + } +} + +impl VrfProver for Pallas {} +impl VrfVerifier for Pallas {} + +#[cfg(test)] +mod tests { + use super::*; + use lit_rust_crypto::ff::Field; + use rand::SeedableRng; + + #[test] + fn pallas_vrf() { + let mut rng = rand_chacha::ChaCha8Rng::from_seed([1u8; 32]); + + let sk = Scalar::random(&mut rng); + let message = Scalar::random(&mut rng); + let pk = Point::generator() * sk; + + let res = Pallas::vrf_prove(&sk, &message, None); + assert!(res.is_ok()); + let proof = res.unwrap(); + let res = Pallas::vrf_verify(pk, message, &proof, None); + assert!(res.is_ok()); + } + + #[test] + fn pallas_serde() { + let mut rng = rand_chacha::ChaCha8Rng::from_seed([1u8; 32]); + let sk = Scalar::random(&mut rng); + let message = Scalar::random(&mut rng); + + let proof = Pallas::vrf_prove(&sk, &message, None).unwrap(); + let proof_bytes = serde_bare::to_vec(&proof).expect("failed to serialize proof"); + let proof2: Proof = + serde_bare::from_slice(&proof_bytes).expect("failed to deserialize proof"); + assert_eq!(proof, proof2); + + let proof_json = serde_json::to_string(&proof).expect("failed to serialize proof"); + let proof2: Proof = + serde_json::from_str(&proof_json).expect("failed to deserialize proof"); + assert_eq!(proof, proof2); + } +} diff --git a/rust/lit-core/lit-vrf/src/impl/secp256k1.rs b/rust/lit-core/lit-vrf/src/impl/secp256k1.rs index be456391..60af52b9 100644 --- a/rust/lit-core/lit-vrf/src/impl/secp256k1.rs +++ b/rust/lit-core/lit-vrf/src/impl/secp256k1.rs @@ -1,13 +1,10 @@ -use bulletproofs::group::Group; -use elliptic_curve::{ - PrimeField, - bigint::U256, - group::GroupEncoding, +use lit_rust_crypto::{ + elliptic_curve::{bigint::U256, ops::Reduce, point::AffineCoordinates}, + ff::PrimeField, + group::{Group, GroupEncoding}, hash2curve::{ExpandMsgXmd, GroupDigest}, - ops::Reduce, - point::AffineCoordinates, + k256::{ProjectivePoint, Scalar, Secp256k1}, }; -use k256::{ProjectivePoint, Scalar, Secp256k1}; use rfc6979::consts::U32; use crate::*; @@ -98,7 +95,7 @@ impl VrfVerifier for Secp256k1 {} #[cfg(test)] mod tests { use super::*; - use elliptic_curve::Field; + use lit_rust_crypto::ff::Field; use rand::SeedableRng; #[test] diff --git a/rust/lit-core/lit-vrf/src/models.rs b/rust/lit-core/lit-vrf/src/models.rs index b7b4cb8f..593e89fb 100644 --- a/rust/lit-core/lit-vrf/src/models.rs +++ b/rust/lit-core/lit-vrf/src/models.rs @@ -1,6 +1,8 @@ use crate::*; -use elliptic_curve::{Field, Group, PrimeField, group::GroupEncoding, subtle::Choice}; use elliptic_curve_tools::{group, prime_field, prime_field_vec}; +use lit_rust_crypto::elliptic_curve::{ + Field, Group, PrimeField, group::GroupEncoding, subtle::Choice, +}; use serde::{Deserialize, Serialize}; use std::{ collections::{BTreeSet, HashMap}, @@ -448,6 +450,7 @@ where mod tests { use super::*; use k256::{ProjectivePoint, Scalar, Secp256k1}; + use lit_rust_crypto::{k256, vsss_rs}; use rand::SeedableRng; use rand_chacha::ChaCha8Rng; use vsss_rs::{DefaultShare, IdentifierPrimeField, ValuePrimeField, shamir}; diff --git a/rust/lit-core/lit-vrf/src/traits/challenge_generation.rs b/rust/lit-core/lit-vrf/src/traits/challenge_generation.rs index 2c700946..4596a35a 100644 --- a/rust/lit-core/lit-vrf/src/traits/challenge_generation.rs +++ b/rust/lit-core/lit-vrf/src/traits/challenge_generation.rs @@ -1,4 +1,4 @@ -use elliptic_curve::Group; +use lit_rust_crypto::group::Group; use crate::Handler; diff --git a/rust/lit-core/lit-vrf/src/traits/coordinate.rs b/rust/lit-core/lit-vrf/src/traits/coordinate.rs index ac8e21d4..689d1f86 100644 --- a/rust/lit-core/lit-vrf/src/traits/coordinate.rs +++ b/rust/lit-core/lit-vrf/src/traits/coordinate.rs @@ -1,5 +1,5 @@ use crate::Handler; -use elliptic_curve::Group; +use lit_rust_crypto::group::Group; /// Trait for extracting the x coordinate of a point on the curve. pub trait Coordinate: Handler { diff --git a/rust/lit-core/lit-vrf/src/traits/handler.rs b/rust/lit-core/lit-vrf/src/traits/handler.rs index 2a25b4ae..60876e51 100644 --- a/rust/lit-core/lit-vrf/src/traits/handler.rs +++ b/rust/lit-core/lit-vrf/src/traits/handler.rs @@ -1,4 +1,4 @@ -use elliptic_curve::{Group, group::GroupEncoding}; +use lit_rust_crypto::group::{Group, GroupEncoding}; /// Root trait to eliminate duplication in the other traits pub trait Handler { diff --git a/rust/lit-core/lit-vrf/src/traits/hash.rs b/rust/lit-core/lit-vrf/src/traits/hash.rs index 5a8de0c8..886fee26 100644 --- a/rust/lit-core/lit-vrf/src/traits/hash.rs +++ b/rust/lit-core/lit-vrf/src/traits/hash.rs @@ -1,4 +1,4 @@ -use elliptic_curve::Group; +use lit_rust_crypto::group::Group; use crate::Handler; diff --git a/rust/lit-core/lit-vrf/src/traits/hash_to_curve.rs b/rust/lit-core/lit-vrf/src/traits/hash_to_curve.rs index e0d59a29..7aeacee6 100644 --- a/rust/lit-core/lit-vrf/src/traits/hash_to_curve.rs +++ b/rust/lit-core/lit-vrf/src/traits/hash_to_curve.rs @@ -1,4 +1,4 @@ -use elliptic_curve::Group; +use lit_rust_crypto::group::Group; use crate::Handler; diff --git a/rust/lit-core/lit-vrf/src/traits/nonce_generation.rs b/rust/lit-core/lit-vrf/src/traits/nonce_generation.rs index c4eab5b0..11ac9da4 100644 --- a/rust/lit-core/lit-vrf/src/traits/nonce_generation.rs +++ b/rust/lit-core/lit-vrf/src/traits/nonce_generation.rs @@ -1,4 +1,4 @@ -use elliptic_curve::Group; +use lit_rust_crypto::group::Group; use crate::Handler; diff --git a/rust/lit-core/lit-vrf/src/traits/prover.rs b/rust/lit-core/lit-vrf/src/traits/prover.rs index d7a5a06b..eda32cb2 100644 --- a/rust/lit-core/lit-vrf/src/traits/prover.rs +++ b/rust/lit-core/lit-vrf/src/traits/prover.rs @@ -1,4 +1,4 @@ -use elliptic_curve::{Field, Group}; +use lit_rust_crypto::{ff::Field, group::Group}; use crate::{ ChallengeGeneration, Coordinate, HashToCurve, NonceGeneration, Proof, ProofToHash, VrfError, @@ -63,6 +63,7 @@ mod tests { use crate::VrfVerifier; use crate::utils::lagrange; use k256::{ProjectivePoint, Scalar, Secp256k1}; + use lit_rust_crypto::{k256, vsss_rs}; use rand::SeedableRng; use vsss_rs::{DefaultShare, IdentifierPrimeField, ValuePrimeField, shamir}; type SecretShare = DefaultShare, ValuePrimeField>; diff --git a/rust/lit-core/lit-vrf/src/traits/verifier.rs b/rust/lit-core/lit-vrf/src/traits/verifier.rs index a0cd83ad..7e12508f 100644 --- a/rust/lit-core/lit-vrf/src/traits/verifier.rs +++ b/rust/lit-core/lit-vrf/src/traits/verifier.rs @@ -1,4 +1,4 @@ -use elliptic_curve::{Field, Group, subtle::ConstantTimeEq}; +use lit_rust_crypto::elliptic_curve::{Field, Group, subtle::ConstantTimeEq}; use crate::{ ChallengeGeneration, Coordinate, HashToCurve, Proof, ProofToHash, VrfError, VrfResult, diff --git a/rust/lit-core/lit-vrf/src/utils.rs b/rust/lit-core/lit-vrf/src/utils.rs index 44d9ed1d..5e153012 100644 --- a/rust/lit-core/lit-vrf/src/utils.rs +++ b/rust/lit-core/lit-vrf/src/utils.rs @@ -1,4 +1,4 @@ -use elliptic_curve::PrimeField; +use lit_rust_crypto::ff::PrimeField; pub fn lagrange(xi: F, participants: &[F]) -> F { let mut num = F::ONE; diff --git a/rust/lit-core/rust-toolchain.toml b/rust/lit-core/rust-toolchain.toml index c8969b51..657737a9 100644 --- a/rust/lit-core/rust-toolchain.toml +++ b/rust/lit-core/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.86" +channel = "1.91" components = ['rustfmt', 'rust-src', 'clippy'] diff --git a/rust/lit-node/Cargo.lock b/rust/lit-node/Cargo.lock index bc9448e1..74ee7947 100644 --- a/rust/lit-node/Cargo.lock +++ b/rust/lit-node/Cargo.lock @@ -577,7 +577,7 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "itertools 0.14.0", + "itertools 0.13.0", "serde", "serde_json", "thiserror 2.0.16", @@ -2128,28 +2128,16 @@ dependencies = [ "typenum", ] -[[package]] -name = "bitvec" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" -dependencies = [ - "funty 1.1.0", - "radium 0.6.2", - "tap", - "wyz 0.2.0", -] - [[package]] name = "bitvec" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ - "funty 2.0.0", - "radium 0.7.0", + "funty", + "radium", "tap", - "wyz 0.5.1", + "wyz", ] [[package]] @@ -2495,25 +2483,15 @@ dependencies = [ [[package]] name = "bulletproofs" version = "4.0.0" -source = "git+https://github.com/LIT-Protocol/bulletproofs?rev=ddf11c2f593e71f24c9a3d64c56f62d82f2b5099#ddf11c2f593e71f24c9a3d64c56f62d82f2b5099" +source = "git+https://github.com/LIT-Protocol/bulletproofs?branch=pallas#2ee66a6e2770c73514942936950c0ca2dbbcd023" dependencies = [ "blake2", - "bls12_381_plus", - "blstrs_plus", "byteorder", - "curve25519-dalek-ml", "data-encoding", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", "digest 0.10.7", - "ed448-goldilocks-plus", - "elliptic-curve 0.13.8", "elliptic-curve-tools", - "group 0.13.0", - "jubjub-plus", - "k256 0.13.4", + "lit-rust-crypto", "merlin", - "p256", - "p384 0.13.1", "rand 0.8.5", "rand_core 0.6.4", "serde", @@ -2521,7 +2499,6 @@ dependencies = [ "sha3 0.10.8", "subtle", "thiserror 2.0.16", - "vsss-rs 5.1.0", "zeroize", ] @@ -3109,7 +3086,7 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ - "bitvec 1.0.1", + "bitvec", "coins-bip32", "hmac 0.12.1", "once_cell", @@ -4121,35 +4098,28 @@ dependencies = [ ] [[package]] -name = "decaf377" -version = "0.10.1" -source = "git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5#1c5755b2b90e1969d47ce89cf2d35078984a0ee5" +name = "decaf377-rdsa" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437967a34e0699b50b986a72ce6c4e2e5930bde85ec8f3749701f7e50d6d32b0" dependencies = [ - "ark-bls12-377", - "ark-ec", - "ark-ed-on-bls12-377", "ark-ff 0.4.2", "ark-serialize 0.4.2", - "ark-std 0.4.0", - "blake2", - "cfg-if 1.0.3", - "elliptic-curve 0.13.8", - "frost-dkg", - "gennaro-dkg", - "hashbrown 0.15.5", + "blake2b_simd 0.5.11", + "decaf377", + "digest 0.9.0", "hex", - "num-bigint", - "once_cell", "rand_core 0.6.4", - "serdect 0.3.0", - "subtle", + "serde", + "thiserror 1.0.69", "zeroize", ] [[package]] -name = "decaf377" +name = "decaf377_plus" version = "0.10.1" -source = "git+https://github.com/LIT-Protocol/decaf377.git#1c5755b2b90e1969d47ce89cf2d35078984a0ee5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "209f730dfc5f9d877c7549bebc93ea0ef4fe2915b4dbf5ffebc11e8b4c17c740" dependencies = [ "ark-bls12-377", "ark-ec", @@ -4161,34 +4131,16 @@ dependencies = [ "cfg-if 1.0.3", "elliptic-curve 0.13.8", "frost-dkg", - "gennaro-dkg", "hashbrown 0.15.5", "hex", "num-bigint", "once_cell", "rand_core 0.6.4", + "serdect 0.3.0", "subtle", "zeroize", ] -[[package]] -name = "decaf377-rdsa" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "437967a34e0699b50b986a72ce6c4e2e5930bde85ec8f3749701f7e50d6d32b0" -dependencies = [ - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "blake2b_simd 0.5.11", - "decaf377 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.9.0", - "hex", - "rand_core 0.6.4", - "serde", - "thiserror 1.0.69", - "zeroize", -] - [[package]] name = "deno_ast" version = "0.45.1" @@ -6296,28 +6248,13 @@ dependencies = [ "uuid 0.8.2", ] -[[package]] -name = "ethabi" -version = "16.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c98847055d934070b90e806e12d3936b787d0a115068981c1d8dfd5dfef5a5" -dependencies = [ - "ethereum-types 0.12.1", - "hex", - "serde", - "serde_json", - "sha3 0.9.1", - "thiserror 1.0.69", - "uint", -] - [[package]] name = "ethabi" version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ - "ethereum-types 0.14.1", + "ethereum-types", "hex", "once_cell", "regex", @@ -6328,19 +6265,6 @@ dependencies = [ "uint", ] -[[package]] -name = "ethbloom" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb684ac8fa8f6c5759f788862bb22ec6fe3cb392f6bfd08e3c64b603661e3f8" -dependencies = [ - "crunchy", - "fixed-hash 0.7.0", - "impl-rlp", - "impl-serde 0.3.2", - "tiny-keccak", -] - [[package]] name = "ethbloom" version = "0.13.0" @@ -6348,40 +6272,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" dependencies = [ "crunchy", - "fixed-hash 0.8.0", - "impl-codec 0.6.0", + "fixed-hash", + "impl-codec", "impl-rlp", - "impl-serde 0.4.0", + "impl-serde", "scale-info", "tiny-keccak", ] -[[package]] -name = "ethereum-types" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05136f7057fe789f06e6d41d07b34e6f70d8c86e5693b60f97aaa6553553bdaf" -dependencies = [ - "ethbloom 0.11.1", - "fixed-hash 0.7.0", - "impl-rlp", - "impl-serde 0.3.2", - "primitive-types 0.10.1", - "uint", -] - [[package]] name = "ethereum-types" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" dependencies = [ - "ethbloom 0.13.0", - "fixed-hash 0.8.0", - "impl-codec 0.6.0", + "ethbloom", + "fixed-hash", + "impl-codec", "impl-rlp", - "impl-serde 0.4.0", - "primitive-types 0.12.2", + "impl-serde", + "primitive-types", "scale-info", "uint", ] @@ -6485,7 +6395,7 @@ dependencies = [ "chrono", "const-hex", "elliptic-curve 0.13.8", - "ethabi 18.0.0", + "ethabi", "generic-array 0.14.7", "k256 0.13.4", "num_enum 0.7.4", @@ -6811,7 +6721,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "bitvec 1.0.1", + "bitvec", "rand_core 0.6.4", "subtle", ] @@ -6854,18 +6764,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - [[package]] name = "fixed-hash" version = "0.8.0" @@ -7009,8 +6907,8 @@ dependencies = [ [[package]] name = "frost-core" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#613ae60ad77a8a5cf973c4a8c7be2c20e9b13d89" dependencies = [ "byteorder", "const-crc32-nostd", @@ -7032,26 +6930,23 @@ dependencies = [ [[package]] name = "frost-decaf377" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#613ae60ad77a8a5cf973c4a8c7be2c20e9b13d89" dependencies = [ "ark-serialize 0.4.2", "blake2b_simd 1.0.3", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377.git)", - "document-features", "frost-core", "frost-rerandomized", - "group 0.13.0", + "lit-rust-crypto", "num-traits", "rand_core 0.6.4", - "sha2 0.10.9", ] [[package]] name = "frost-dkg" -version = "0.3.3" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8176b54a998a04796e58b0ac3a6da08e5ab05aff5a7d92159619a652a29f63e8" +checksum = "00b59a575727037fbc977a68a2ace822b4b37f8f0647769946e307dc966ecfbb" dependencies = [ "blake2", "blsful", @@ -7059,6 +6954,7 @@ dependencies = [ "ed448-goldilocks-plus", "elliptic-curve 0.13.8", "elliptic-curve-tools", + "hex", "jubjub-plus", "k256 0.13.4", "merlin", @@ -7075,34 +6971,34 @@ dependencies = [ [[package]] name = "frost-ed25519" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#613ae60ad77a8a5cf973c4a8c7be2c20e9b13d89" dependencies = [ - "curve25519-dalek-ml", "document-features", "frost-core", "frost-rerandomized", + "lit-rust-crypto", "rand_core 0.6.4", "sha2 0.10.9", ] [[package]] name = "frost-ed448" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#613ae60ad77a8a5cf973c4a8c7be2c20e9b13d89" dependencies = [ "document-features", - "ed448-goldilocks-plus", "frost-core", "frost-rerandomized", + "lit-rust-crypto", "rand_core 0.6.4", "sha3 0.10.8", ] [[package]] name = "frost-p256" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#613ae60ad77a8a5cf973c4a8c7be2c20e9b13d89" dependencies = [ "document-features", "frost-core", @@ -7114,8 +7010,8 @@ dependencies = [ [[package]] name = "frost-p384" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#613ae60ad77a8a5cf973c4a8c7be2c20e9b13d89" dependencies = [ "document-features", "frost-core", @@ -7127,23 +7023,34 @@ dependencies = [ [[package]] name = "frost-redjubjub" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#613ae60ad77a8a5cf973c4a8c7be2c20e9b13d89" dependencies = [ "blake2b_simd 1.0.3", "document-features", "frost-core", "frost-rerandomized", - "group 0.13.0", - "jubjub-plus", + "lit-rust-crypto", + "rand_core 0.6.4", +] + +[[package]] +name = "frost-redpallas" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#613ae60ad77a8a5cf973c4a8c7be2c20e9b13d89" +dependencies = [ + "blake2b_simd 1.0.3", + "document-features", + "frost-core", + "frost-rerandomized", + "lit-rust-crypto", "rand_core 0.6.4", - "sha2 0.10.9", ] [[package]] name = "frost-rerandomized" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#613ae60ad77a8a5cf973c4a8c7be2c20e9b13d89" dependencies = [ "derive-getters", "document-features", @@ -7154,27 +7061,27 @@ dependencies = [ [[package]] name = "frost-ristretto255" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#613ae60ad77a8a5cf973c4a8c7be2c20e9b13d89" dependencies = [ - "curve25519-dalek-ml", "document-features", "frost-core", "frost-rerandomized", + "lit-rust-crypto", "rand_core 0.6.4", "sha2 0.10.9", ] [[package]] name = "frost-schnorrkel25519" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#613ae60ad77a8a5cf973c4a8c7be2c20e9b13d89" dependencies = [ "byte-strings", - "curve25519-dalek-ml", "document-features", "frost-core", "frost-rerandomized", + "lit-rust-crypto", "merlin", "rand_core 0.6.4", "schnorrkel", @@ -7182,8 +7089,8 @@ dependencies = [ [[package]] name = "frost-secp256k1" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#613ae60ad77a8a5cf973c4a8c7be2c20e9b13d89" dependencies = [ "document-features", "frost-core", @@ -7195,13 +7102,13 @@ dependencies = [ [[package]] name = "frost-taproot" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#613ae60ad77a8a5cf973c4a8c7be2c20e9b13d89" dependencies = [ "document-features", "frost-core", "frost-rerandomized", - "k256 0.13.4", + "lit-rust-crypto", "rand_core 0.6.4", "sha2 0.10.9", "signature 2.2.0", @@ -7264,12 +7171,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "funty" version = "2.0.0" @@ -7516,24 +7417,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "gennaro-dkg" -version = "1.0.0-rc6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "352f32caf0eb44d8f340f3bba63ca7a0dbeeb3e169a59bbb86ef40e0da10eec6" -dependencies = [ - "anyhow", - "elliptic-curve 0.13.8", - "elliptic-curve-tools", - "merlin", - "postcard", - "rand_chacha 0.3.1", - "rand_core 0.6.4", - "serde", - "thiserror 2.0.16", - "vsss-rs 5.1.0", -] - [[package]] name = "gethostname" version = "0.2.3" @@ -7932,51 +7815,32 @@ dependencies = [ [[package]] name = "hd-keys-curves-wasm" version = "1.0.3" -source = "git+https://github.com/LIT-Protocol/hd-keys-curves-wasm?rev=5e0dcc1a6d8d08f2328d4716dca806db87f93748#5e0dcc1a6d8d08f2328d4716dca806db87f93748" +source = "git+https://github.com/LIT-Protocol/hd-keys-curves-wasm.git#5e0dcc1a6d8d08f2328d4716dca806db87f93748" dependencies = [ - "blake2", - "blsful", - "curve25519-dalek-ml", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", "digest 0.10.7", "ecdsa 0.16.9", - "ed448-goldilocks-plus", "elliptic-curve 0.13.8", - "elliptic-curve-tools", "getrandom 0.2.16", - "jubjub-plus", "k256 0.13.4", "p256", - "p384 0.13.1", "sha2 0.10.9", - "sha3 0.10.8", "subtle", - "vsss-rs 5.1.0", ] [[package]] name = "hd-keys-curves-wasm" -version = "1.0.3" -source = "git+https://github.com/LIT-Protocol/hd-keys-curves-wasm#5e0dcc1a6d8d08f2328d4716dca806db87f93748" +version = "1.0.5" +source = "git+https://github.com/LIT-Protocol/hd-keys-curves-wasm.git?branch=pallas#597a14b9cf4bafd4c778f1053ca4bbad0b3d249b" dependencies = [ "blake2", - "blsful", - "curve25519-dalek-ml", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", "digest 0.10.7", "ecdsa 0.16.9", - "ed448-goldilocks-plus", - "elliptic-curve 0.13.8", "elliptic-curve-tools", "getrandom 0.2.16", - "jubjub-plus", - "k256 0.13.4", - "p256", - "p384 0.13.1", + "lit-rust-crypto", "sha2 0.10.9", "sha3 0.10.8", "subtle", - "vsss-rs 5.1.0", ] [[package]] @@ -8714,22 +8578,13 @@ dependencies = [ "zune-jpeg", ] -[[package]] -name = "impl-codec" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161ebdfec3c8e3b52bf61c4f3550a1eea4f9579d10dc1b936f3171ebdcd6c443" -dependencies = [ - "parity-scale-codec 2.3.1", -] - [[package]] name = "impl-codec" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec 3.7.5", + "parity-scale-codec", ] [[package]] @@ -8741,15 +8596,6 @@ dependencies = [ "rlp", ] -[[package]] -name = "impl-serde" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4551f042f3438e64dbd6226b20527fc84a6e1fe65688b58746a2f53623f25f5c" -dependencies = [ - "serde", -] - [[package]] name = "impl-serde" version = "0.4.0" @@ -9239,7 +9085,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8499f7a74008aafbecb2a2e608a3e13e4dd3e84df198b604451efe93f2de6e61" dependencies = [ - "bitvec 1.0.1", + "bitvec", "bls12_381", "ff 0.13.1", "group 0.13.0", @@ -9249,11 +9095,11 @@ dependencies = [ [[package]] name = "jubjub-plus" -version = "0.10.8" +version = "0.10.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2c5e88d1ac6a903e693287073860ea35299b200273d5c2bd9d7845ec39f319" +checksum = "e8cd4e5cd65bb1390238c9e2e7dc98078a7b146c9d0d080cf3a7b1ac0d2348ac" dependencies = [ - "bitvec 1.0.1", + "bitvec", "bls12_381_plus", "elliptic-curve 0.13.8", "ff 0.13.1", @@ -9298,6 +9144,7 @@ dependencies = [ "cfg-if 1.0.3", "ecdsa 0.16.9", "elliptic-curve 0.13.8", + "hex-literal", "once_cell", "serdect 0.2.0", "sha2 0.10.9", @@ -9699,7 +9546,7 @@ dependencies = [ "atty", "deno_core", "deno_error", - "ethabi 18.0.0", + "ethabi", "flume", "lazy_static", "lit-actions-grpc", @@ -9785,7 +9632,7 @@ dependencies = [ "opentelemetry_sdk 0.24.1", "reqwest 0.11.27", "rocket", - "scc 3.3.2", + "scc", "sd-notify", "semver 1.0.26", "serde", @@ -9846,7 +9693,7 @@ dependencies = [ "moka 0.12.10", "once_cell", "reqwest 0.11.27", - "scc 2.4.0", + "scc", "serde", "serde_json", "serde_yaml 0.9.34+deprecated", @@ -9905,7 +9752,7 @@ source = "git+https://github.com/LIT-Protocol/lit-ecdsa-wasm-combine?branch=0.2. dependencies = [ "console_error_panic_hook", "getrandom 0.2.16", - "hd-keys-curves-wasm 1.0.3 (git+https://github.com/LIT-Protocol/hd-keys-curves-wasm)", + "hd-keys-curves-wasm 1.0.3", "hex", "js-sys", "k256 0.13.4", @@ -9926,32 +9773,28 @@ version = "0.2.0" dependencies = [ "digest 0.10.7", "ecdsa 0.16.9", - "elliptic-curve 0.13.8", "elliptic-curve-tools", - "hd-keys-curves-wasm 1.0.3 (git+https://github.com/LIT-Protocol/hd-keys-curves-wasm?rev=5e0dcc1a6d8d08f2328d4716dca806db87f93748)", + "hd-keys-curves-wasm 1.0.5", "hex", "lit-poly", + "lit-rust-crypto", "rand 0.8.5", "serde", "sha2 0.10.9", "subtle", "thiserror 2.0.16", - "vsss-rs 5.1.0", "zeroize", ] [[package]] name = "lit-frost" -version = "0.3.0" -source = "git+https://github.com/LIT-Protocol/lit-frost.git#60ad81f1f637f7042bfee0fd8cc29cee74d754b1" +version = "0.4.0" +source = "git+https://github.com/LIT-Protocol/lit-frost.git?branch=pallas#ffc784219ac181b4dd9822819f8662a4d92d55cc" dependencies = [ "anyhow", "ark-serialize 0.4.2", - "curve25519-dalek-ml", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", "decaf377-rdsa", "ed25519-dalek 2.2.0", - "ed448-goldilocks-plus", "frost-core", "frost-decaf377", "frost-ed25519", @@ -9959,16 +9802,14 @@ dependencies = [ "frost-p256", "frost-p384", "frost-redjubjub", + "frost-redpallas", "frost-ristretto255", "frost-schnorrkel25519", "frost-secp256k1", "frost-taproot", "getrandom 0.2.16", "hex", - "jubjub-plus", - "k256 0.13.4", - "p256", - "p384 0.13.1", + "lit-rust-crypto", "rand_core 0.6.4", "reddsa", "schnorrkel", @@ -9977,7 +9818,6 @@ dependencies = [ "sha2 0.10.9", "subtle", "thiserror 2.0.16", - "vsss-rs 5.1.0", "zeroize", ] @@ -10027,7 +9867,7 @@ dependencies = [ "rand_chacha 0.3.1", "rand_core 0.6.4", "reqwest 0.11.27", - "sdd 3.0.10", + "sdd", "serde", "serde_json", "serdect 0.3.0", @@ -10044,23 +9884,17 @@ dependencies = [ name = "lit-node-core" version = "2.0.1" dependencies = [ - "blsful", - "curve25519-dalek-ml", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", "ed25519-dalek 2.2.0", - "ed448-goldilocks-plus", - "ethabi 16.0.0", + "ethabi", "ethers", - "hd-keys-curves-wasm 1.0.3 (git+https://github.com/LIT-Protocol/hd-keys-curves-wasm)", + "hd-keys-curves-wasm 1.0.5", "hex", - "jubjub-plus", - "k256 0.13.4", - "p256", - "p384 0.13.1", + "lit-rust-crypto", + "rand_chacha 0.3.1", + "rand_core 0.6.4", "serde", "serde_json", "thiserror 2.0.16", - "vsss-rs 5.1.0", ] [[package]] @@ -10148,32 +9982,25 @@ dependencies = [ [[package]] name = "lit-recovery" -version = "0.2.0" +version = "0.3.0" dependencies = [ "arc-swap", "argon2", - "blsful", "bulletproofs", "byteorder", "ciborium", "clap 4.5.46", "colored", "cryptex", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", "dirs 6.0.0", - "ed448-goldilocks-plus", - "elliptic-curve 0.13.8", "ethers", "generic-array 1.1.1", "glob", "hex", - "jubjub-plus", - "k256 0.13.4", "lit-blockchain", "lit-core", "lit-node-core", - "p256", - "p384 0.13.1", + "lit-rust-crypto", "path-clean 1.0.1", "rand 0.8.5", "reqwest 0.11.27", @@ -10189,16 +10016,34 @@ dependencies = [ "tiny-bip39 2.0.0", "tokio", "verifiable-share-encryption", - "vsss-rs 5.1.0", "winapi", ] +[[package]] +name = "lit-rust-crypto" +version = "0.6.0" +source = "git+https://github.com/LIT-Protocol/lit-rust-crypto?tag=0.6.0#9548fce521473f289ea1366249b782355e96507d" +dependencies = [ + "bls12_381_plus", + "blsful", + "blstrs_plus", + "curve25519-dalek-ml", + "decaf377_plus", + "ed448-goldilocks-plus", + "elliptic-curve 0.13.8", + "jubjub-plus", + "k256 0.13.4", + "p256", + "p384 0.13.1", + "pasta_curves_plus", + "vsss-rs 5.1.0", +] + [[package]] name = "lit-sdk" version = "2.0.1" dependencies = [ "chrono", - "data-encoding", "ecdsa 0.16.9", "elliptic-curve-tools", "futures", @@ -10224,26 +10069,18 @@ version = "0.2.0" dependencies = [ "blake2", "bulletproofs", - "curve25519-dalek-ml", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", - "ed448-goldilocks-plus", - "elliptic-curve 0.13.8", "elliptic-curve-tools", - "jubjub-plus", - "k256 0.13.4", - "p256", - "p384 0.13.1", + "lit-rust-crypto", "rfc6979 0.4.0", "serde", "sha2 0.10.9", "sha3 0.10.8", "thiserror 2.0.16", - "vsss-rs 5.1.0", ] [[package]] name = "lit_node" -version = "2.1.5" +version = "2.1.8" dependencies = [ "anyhow", "apalis", @@ -10253,34 +10090,26 @@ dependencies = [ "async-trait", "base64_light", "bech32 0.11.0", - "blsful", - "blstrs_plus", "bs58 0.5.1", "bulletproofs", - "cc", "chrono", "ciborium", "clap 4.5.46", "ctor", - "curve25519-dalek-ml", "data-encoding", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", "derive_builder", "derive_more 2.0.1", "digest 0.10.7", "dotenv", "ecdsa 0.16.9", "ed25519-dalek 2.2.0", - "ed448-goldilocks-plus", - "elliptic-curve 0.13.8", - "ethabi 16.0.0", + "ethabi", "ethers", "flume", "frost-dkg", "futures", "generic-array 1.1.1", "glob", - "hd-keys-curves-wasm 1.0.3 (git+https://github.com/LIT-Protocol/hd-keys-curves-wasm?rev=5e0dcc1a6d8d08f2328d4716dca806db87f93748)", "hex", "hex-literal", "indicatif 0.15.0", @@ -10288,8 +10117,6 @@ dependencies = [ "ipfs-hasher", "iri-string 0.6.0", "jsonpath-plus", - "jubjub-plus", - "k256 0.13.4", "lazy_static", "libaes", "libsecp256k1 0.7.1", @@ -10309,8 +10136,10 @@ dependencies = [ "lit-node-testnet", "lit-observability", "lit-recovery", + "lit-rust-crypto", "lit-sdk", "lit-vrf", + "log", "maplit", "moka 0.12.10", "mpl-token-metadata", @@ -10320,8 +10149,6 @@ dependencies = [ "opentelemetry 0.24.0", "opentelemetry-semantic-conventions 0.15.0", "opentelemetry_sdk 0.24.1", - "p256", - "p384 0.13.1", "postcard", "pretty_assertions", "pretty_env_logger", @@ -10336,8 +10163,8 @@ dependencies = [ "rsa 0.7.0-pre", "rstest", "rusqlite", - "scc 2.4.0", - "sdd 3.0.10", + "scc", + "sdd", "semver 1.0.26", "serde", "serde_bare", @@ -10369,7 +10196,6 @@ dependencies = [ "utils", "verifiable-share-encryption", "visibility", - "vsss-rs 5.1.0", "web3", "webauthn-rs", "webauthn-rs-core", @@ -11426,7 +11252,7 @@ dependencies = [ "arrayvec 0.7.6", "auto_impl", "bytes", - "ethereum-types 0.14.1", + "ethereum-types", "open-fastrlp-derive", ] @@ -11825,20 +11651,6 @@ dependencies = [ "group 0.13.0", ] -[[package]] -name = "parity-scale-codec" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" -dependencies = [ - "arrayvec 0.7.6", - "bitvec 0.20.4", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive 2.3.1", - "serde", -] - [[package]] name = "parity-scale-codec" version = "3.7.5" @@ -11846,27 +11658,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" dependencies = [ "arrayvec 0.7.6", - "bitvec 1.0.1", + "bitvec", "byte-slice-cast", "const_format", "impl-trait-for-tuples", - "parity-scale-codec-derive 3.7.5", + "parity-scale-codec-derive", "rustversion", "serde", ] -[[package]] -name = "parity-scale-codec-derive" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1557010476e0595c9b568d16dcfb81b93cdeb157612726f5170d31aa707bed27" -dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro2 1.0.101", - "quote 1.0.40", - "syn 1.0.109", -] - [[package]] name = "parity-scale-codec-derive" version = "3.7.5" @@ -11957,6 +11757,26 @@ dependencies = [ "subtle", ] +[[package]] +name = "pasta_curves_plus" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e265b7ebdbfc61a8c0eeac79350cf3225cd390325dc91dd0edede5b6742d58" +dependencies = [ + "blake2", + "blake2b_simd 1.0.3", + "elliptic-curve 0.13.8", + "ff 0.13.1", + "frost-dkg", + "group 0.13.0", + "hex", + "lazy_static", + "rand 0.8.5", + "serde", + "static_assertions", + "subtle", +] + [[package]] name = "paste" version = "1.0.15" @@ -12504,29 +12324,16 @@ dependencies = [ "elliptic-curve 0.13.8", ] -[[package]] -name = "primitive-types" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" -dependencies = [ - "fixed-hash 0.7.0", - "impl-codec 0.5.1", - "impl-rlp", - "impl-serde 0.3.2", - "uint", -] - [[package]] name = "primitive-types" version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ - "fixed-hash 0.8.0", - "impl-codec 0.6.0", + "fixed-hash", + "impl-codec", "impl-rlp", - "impl-serde 0.4.0", + "impl-serde", "scale-info", "uint", ] @@ -12712,7 +12519,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ "heck 0.5.0", - "itertools 0.14.0", + "itertools 0.11.0", "log", "multimap", "once_cell", @@ -12732,7 +12539,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.11.0", "proc-macro2 1.0.101", "quote 1.0.40", "syn 2.0.106", @@ -12745,7 +12552,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.11.0", "proc-macro2 1.0.101", "quote 1.0.40", "syn 2.0.106", @@ -12928,12 +12735,6 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" -[[package]] -name = "radium" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" - [[package]] name = "radium" version = "0.7.0" @@ -13660,8 +13461,8 @@ dependencies = [ "num-bigint", "num-integer", "num-traits", - "parity-scale-codec 3.7.5", - "primitive-types 0.12.2", + "parity-scale-codec", + "primitive-types", "proptest", "rand 0.8.5", "rand 0.9.2", @@ -14083,7 +13884,7 @@ checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" dependencies = [ "cfg-if 1.0.3", "derive_more 1.0.0", - "parity-scale-codec 3.7.5", + "parity-scale-codec", "scale-info-derive", ] @@ -14099,15 +13900,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "scc" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" -dependencies = [ - "sdd 3.0.10", -] - [[package]] name = "scc" version = "3.3.2" @@ -14115,7 +13907,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd0b9e1890c5b17833a779c68a974f04170dfa36e3789395d17845418cc779ac" dependencies = [ "saa", - "sdd 4.2.4", + "sdd", ] [[package]] @@ -14234,12 +14026,6 @@ dependencies = [ "libc", ] -[[package]] -name = "sdd" -version = "3.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" - [[package]] name = "sdd" version = "4.2.4" @@ -15811,7 +15597,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "208d40b9e8cad9f93613778ea295ed8f3c2b1824217c6cfc7219d3f6f45b96d4" dependencies = [ "base64-simd 0.7.0", - "bitvec 1.0.1", + "bitvec", "data-encoding", "debugid", "if_chain", @@ -15830,7 +15616,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e22afbcb92ce02d23815b9795523c005cb9d3c214f8b7a66318541c240ea7935" dependencies = [ "base64-simd 0.8.0", - "bitvec 1.0.1", + "bitvec", "data-encoding", "debugid", "if_chain", @@ -17869,8 +17655,8 @@ version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ - "cfg-if 1.0.3", - "rand 0.8.5", + "cfg-if 0.1.10", + "rand 0.7.3", "static_assertions", ] @@ -18344,13 +18130,14 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "verifiable-share-encryption" -version = "0.3.0" -source = "git+https://github.com/LIT-Protocol/verifiable-share-encryption?rev=7eddfbe736369db596d0f302c72f1d76b0fd332d#7eddfbe736369db596d0f302c72f1d76b0fd332d" +version = "0.4.0" +source = "git+https://github.com/LIT-Protocol/verifiable-share-encryption?branch=pallas#decd38dd09da1fbbfd18b3323e22ce681cd121cc" dependencies = [ "anyhow", "bulletproofs", "data-encoding", "elliptic-curve-tools", + "lit-rust-crypto", "rand_core 0.6.4", "rayon", "serde", @@ -18628,8 +18415,8 @@ dependencies = [ "base64 0.21.7", "bytes", "derive_more 0.99.20", - "ethabi 18.0.0", - "ethereum-types 0.14.1", + "ethabi", + "ethereum-types", "futures", "futures-timer", "headers", @@ -19423,12 +19210,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c01ae8492c38f52376efd3a17d0994b6bcf3df1e39c0226d458b7d81670b2a06" -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "wyz" version = "0.5.1" diff --git a/rust/lit-node/Cargo.toml b/rust/lit-node/Cargo.toml index 5190dcd1..74ef2872 100644 --- a/rust/lit-node/Cargo.toml +++ b/rust/lit-node/Cargo.toml @@ -27,37 +27,52 @@ edition = "2024" [workspace.dependencies] async-std = "1.13" async-trait = "0.1" -blsful = "3.0.0-pre8" -bulletproofs = { git = "https://github.com/LIT-Protocol/bulletproofs", rev = "ddf11c2f593e71f24c9a3d64c56f62d82f2b5099" } -curve25519-dalek = { package = "curve25519-dalek-ml", version="4.3.0", features = ["group", "serde", "rand_core"] } -data-encoding = "2.8" -decaf377 = { git = "https://github.com/LIT-Protocol/decaf377", rev = "1c5755b2b90e1969d47ce89cf2d35078984a0ee5", features = ["serde"] } +bulletproofs = { git = "https://github.com/LIT-Protocol/bulletproofs", branch = "pallas" } +data-encoding = "2.9" derive_more = { version = "2" , features = ["display"] } ed25519-dalek = { version = "2.2", features = ["rand_core"] } -ed448-goldilocks = { version = "0.16", package = "ed448-goldilocks-plus", features = ["serde"] } elliptic-curve = { version = "0.13", features = ["arithmetic", "serde"] } -ethabi = "16.0.0" +ethabi = "18.0.0" ethers = { version = "2.0.8", features = [ "abigen", "legacy" ]} generic-array = "=1.1.1" +hd-keys-curves-wasm = { git = "https://github.com/LIT-Protocol/hd-keys-curves-wasm", branch = "pallas", default-features = false, features = ["bls", "k256", "p256", "p384", "curve25519", "ed448", "jubjub", "decaf377", "pasta"] } hex = "0.4" -jubjub = { package = "jubjub-plus", version = "0.10", features = ["serde"] } +lit-frost = { git = "https://github.com/LIT-Protocol/lit-frost.git", branch = "pallas" } reqwest = { version = "0.11.14", default-features = false, features = ["json", "rustls-tls", "stream"] } rand = "0.8" rand_core = "0.6" rand_chacha = "0.3.1" -sdd = "3" +scc = "3" +sdd = "4" sha2 = "0.10.9" sha3 = "0.10.8" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" soteria-rs = { version = "0.3.1", features = ["serde", "elements"] } url = { version = "2", features = ["serde"] } -vsss-rs = { version = "5.1", features = ["curve25519"] } zeroize = { version = "1.8", features = ["derive"] } +[workspace.dependencies.lit-rust-crypto] +git = "https://github.com/LIT-Protocol/lit-rust-crypto" +tag = "0.6.0" +features = [ + "arithmetic", + "bits", + "ecdsa", + "ecdsa-core", + "digest", + "hash2curve", + "hex", + "rand_core", + "serde", + "sha", + "std", + "zeroize", +] + [patch.crates-io] # needed to force deno_crypto to use v0.7.0-pre and not v0.7.0-rc.0 which for some reason is missing a bunch of stuff from the -pre version rsa = { git = "https://github.com/RustCrypto/RSA", tag = "v0.7.0-pre" } diff --git a/rust/lit-node/lit-node-core/Cargo.toml b/rust/lit-node/lit-node-core/Cargo.toml index 0274d11d..b44f9ab4 100644 --- a/rust/lit-node/lit-node-core/Cargo.toml +++ b/rust/lit-node/lit-node-core/Cargo.toml @@ -7,22 +7,16 @@ edition.workspace = true default = [] [dependencies] -blsful.workspace = true -curve25519-dalek.workspace = true -decaf377.workspace = true ed25519-dalek.workspace = true -ed448-goldilocks.workspace = true ethabi.workspace = true ethers.workspace = true -hd-keys-curves-wasm = { git = "https://github.com/LIT-Protocol/hd-keys-curves-wasm", default-features = false, features = ["bls", "k256", "p256", "p384", "curve25519", "ed448", "jubjub", "decaf377"] } +hd-keys-curves-wasm.workspace = true hex.workspace = true -jubjub.workspace = true -k256 = { version = "0.13", features = ["ecdsa", "serde"] } -p256 = { version = "0.13", features = ["ecdsa", "serde"] } -p384 = { version = "0.13.1", features = ["ecdsa", "serde"] } +lit-rust-crypto.workspace = true serde.workspace = true serde_json.workspace = true thiserror = "2.0" -vsss-rs.workspace = true [dev-dependencies] +rand_chacha = "0.3.1" +rand_core = "0.6.4" \ No newline at end of file diff --git a/rust/lit-node/lit-node-core/src/lib.rs b/rust/lit-node/lit-node-core/src/lib.rs index 0b2f3798..aa53a000 100644 --- a/rust/lit-node/lit-node-core/src/lib.rs +++ b/rust/lit-node/lit-node-core/src/lib.rs @@ -8,17 +8,7 @@ pub use error::*; pub use models::*; pub use traits::*; -pub use blsful; -pub use curve25519_dalek; -pub use decaf377; -pub use ed448_goldilocks; -pub use ed25519_dalek; -pub use ethabi; pub use ethers; pub use hd_keys_curves_wasm; pub use hex; -pub use jubjub; -pub use k256; -pub use p256; -pub use p384; -pub use vsss_rs; +pub use lit_rust_crypto; diff --git a/rust/lit-node/lit-node-core/src/models/ability.rs b/rust/lit-node/lit-node-core/src/models/ability.rs index cd5f4f05..bc7c4817 100644 --- a/rust/lit-node/lit-node-core/src/models/ability.rs +++ b/rust/lit-node/lit-node-core/src/models/ability.rs @@ -1,13 +1,18 @@ use serde::{Deserialize, Serialize}; use std::fmt; -#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +/// Abilities that can be granted via authentication signatures. +#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] pub enum LitAbility { - // Used by top level auth sigs + /// Ability to decrypt data protected by access control conditions. AccessControlConditionDecryption, + /// Ability to sign data protected by access control conditions. AccessControlConditionSigning, + /// Ability to use PKP (Programmable Key Pair) for signing. PKPSigning, + /// Ability to execute Lit Actions (serverless functions). LitActionExecution, + /// Ability to delegate payment for operations. PaymentDelegationAuth, } diff --git a/rust/lit-node/lit-node-core/src/models/attestation.rs b/rust/lit-node/lit-node-core/src/models/attestation.rs index a6b3fa87..d5e960e4 100644 --- a/rust/lit-node/lit-node-core/src/models/attestation.rs +++ b/rust/lit-node/lit-node-core/src/models/attestation.rs @@ -3,11 +3,14 @@ use serde::{Deserialize, Serialize}; use std::fmt::{self, Display, Formatter}; use std::str::FromStr; -#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)] +/// Supported attestation types for node verification. +#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] #[serde(rename_all = "SCREAMING_SNAKE_CASE")] #[allow(unused)] pub enum AttestationType { + /// AMD SEV-SNP (Secure Encrypted Virtualization - Secure Nested Paging) attestation. AmdSevSnp, + /// Admin-signed attestation for development/testing. AdminSigned, } diff --git a/rust/lit-node/lit-node-core/src/models/auth_sig.rs b/rust/lit-node/lit-node-core/src/models/auth_sig.rs index 551a17ea..b5744ab5 100644 --- a/rust/lit-node/lit-node-core/src/models/auth_sig.rs +++ b/rust/lit-node/lit-node-core/src/models/auth_sig.rs @@ -106,15 +106,15 @@ impl JsonAuthSig { /// /// TODO: After a stabilization period, we should make our pattern matching /// stricter and perhaps turn this function to returning a core::Result. + #[allow(clippy::collapsible_if)] pub fn determine_auth_material_type( derived_via: &str, algo: &Option, ) -> AuthMaterialType { - if derived_via == AUTH_SIG_DERIVED_VIA_SESSION_SIG { - if let Some(algo) = algo { - if algo == AUTH_SIG_SESSION_SIG_ALGO { - return AuthMaterialType::SessionSig; - } + if let Some(algo) = algo { + if derived_via == AUTH_SIG_DERIVED_VIA_SESSION_SIG && algo == AUTH_SIG_SESSION_SIG_ALGO + { + return AuthMaterialType::SessionSig; } } @@ -124,11 +124,11 @@ impl JsonAuthSig { return AuthMaterialType::ContractSig; } - if derived_via == AUTH_SIG_DERIVED_VIA_BLS_NETWORK_SIG { - if let Some(algo) = algo { - if algo == AUTH_SIG_BLS_NETWORK_SIG_ALGO { - return AuthMaterialType::BLSNetworkSig; - } + if let Some(algo) = algo { + if derived_via == AUTH_SIG_DERIVED_VIA_BLS_NETWORK_SIG + && algo == AUTH_SIG_BLS_NETWORK_SIG_ALGO + { + return AuthMaterialType::BLSNetworkSig; } } diff --git a/rust/lit-node/lit-node-core/src/models/blinders.rs b/rust/lit-node/lit-node-core/src/models/blinders.rs index 06925ee4..b699ae77 100644 --- a/rust/lit-node/lit-node-core/src/models/blinders.rs +++ b/rust/lit-node/lit-node-core/src/models/blinders.rs @@ -1,6 +1,9 @@ -use blsful::inner_types::Scalar; +use lit_rust_crypto::{ + blsful::inner_types::*, decaf377, ed448_goldilocks, elliptic_curve::subtle::Choice, jubjub, + k256, p256, p384, pallas, vsss_rs::curve25519, +}; + use serde::{Deserialize, Serialize}; -use vsss_rs::subtle::Choice; /// Blinders for the different curves for verifiable encryption #[derive(Clone, Copy, Debug, Default, Serialize, Deserialize)] @@ -9,12 +12,13 @@ pub struct Blinders { pub k256_blinder: Option, pub p256_blinder: Option, pub p384_blinder: Option, - pub ed25519_blinder: Option, - pub ristretto25519_blinder: Option, + pub ed25519_blinder: Option, + pub ristretto25519_blinder: Option, pub ed448_blinder: Option, pub jubjub_blinder: Option, pub decaf377_blinder: Option, pub bls12381g1_blinder: Option, + pub pallas_blinder: Option, } impl Blinders { @@ -29,11 +33,10 @@ impl Blinders { || self.jubjub_blinder.is_some() || self.decaf377_blinder.is_some() || self.bls12381g1_blinder.is_some() + || self.pallas_blinder.is_some() } pub fn any_blinders_invalid(&self) -> bool { - use blsful::inner_types::*; - let mut any = Choice::from(0u8); if let Some(bls_blinder) = &self.bls_blinder { any |= bls_blinder.is_zero(); @@ -62,6 +65,9 @@ impl Blinders { if let Some(bls12381g1_blinder) = &self.bls12381g1_blinder { any |= bls12381g1_blinder.is_zero(); } + if let Some(pallas_blinder) = &self.pallas_blinder { + any |= pallas_blinder.is_zero(); + } bool::from(any) } diff --git a/rust/lit-node/lit-node-core/src/models/curve_type.rs b/rust/lit-node/lit-node-core/src/models/curve_type.rs index 32d60eea..1449f428 100644 --- a/rust/lit-node/lit-node-core/src/models/curve_type.rs +++ b/rust/lit-node/lit-node-core/src/models/curve_type.rs @@ -20,10 +20,11 @@ pub enum CurveType { RedJubjub = 8, // RedJubjub RedDecaf377 = 9, // RedDecaf377 BLS12381G1 = 10, // Signatures in G2 while Public Keys in G1 + RedPallas = 11, // RedPallas } impl CurveType { - pub const NUM_USED_CURVES: usize = 10; + pub const NUM_USED_CURVES: usize = 11; pub const fn as_str(&self) -> &'static str { match self { @@ -37,6 +38,7 @@ impl CurveType { CurveType::RedJubjub => "RedJubjub", CurveType::RedDecaf377 => "RedDecaf377", CurveType::BLS12381G1 => "BLS12381G1Sign", + CurveType::RedPallas => "RedPallas", } } @@ -54,6 +56,7 @@ impl CurveType { RedJubjub, RedDecaf377, BLS12381G1, + RedPallas, ] .into_iter() } @@ -70,6 +73,7 @@ impl CurveType { Self::RedJubjub => 32, Self::RedDecaf377 => 32, Self::BLS12381G1 => 32, + Self::RedPallas => 32, } } @@ -85,6 +89,7 @@ impl CurveType { Self::RedJubjub => 32, Self::RedDecaf377 => 32, Self::BLS12381G1 => 48, + Self::RedPallas => 32, } } @@ -100,6 +105,7 @@ impl CurveType { CurveType::RedJubjub => b"redjubjub_XMD:BLAKE2B-512_ELL2_RO_NUL_VRF", CurveType::RedDecaf377 => b"decaf377_XMD:BLAKE2B-512_ELL2_RO_NUL_VRF", CurveType::BLS12381G1 => b"BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_VRF", + CurveType::RedPallas => b"redpallas_XMD:BLAKE2B-512_SSWU_RO_NUL_VRF", } } @@ -115,6 +121,7 @@ impl CurveType { CurveType::RedJubjub => "jubjub", CurveType::RedDecaf377 => "decaf377", CurveType::BLS12381G1 => "bls12381g1", + CurveType::RedPallas => "pallas", } } @@ -143,6 +150,7 @@ impl FromStr for CurveType { "REDJUBJUB" => Ok(CurveType::RedJubjub), "REDDECAF377" => Ok(CurveType::RedDecaf377), "BLS12381G1SIGN" => Ok(CurveType::BLS12381G1), + "REDPALLAS" => Ok(CurveType::RedPallas), _ => CurveType::invalid(), } } @@ -164,6 +172,7 @@ impl TryFrom for CurveType { Ok(8) => Ok(CurveType::RedJubjub), Ok(9) => Ok(CurveType::RedDecaf377), Ok(10) => Ok(CurveType::BLS12381G1), + Ok(11) => Ok(CurveType::RedPallas), _ => CurveType::invalid(), } } @@ -183,6 +192,7 @@ impl TryFrom for CurveType { 8 => Ok(CurveType::RedJubjub), 9 => Ok(CurveType::RedDecaf377), 10 => Ok(CurveType::BLS12381G1), + 11 => Ok(CurveType::RedPallas), _ => CurveType::invalid(), } } diff --git a/rust/lit-node/lit-node-core/src/models/endpoint_version.rs b/rust/lit-node/lit-node-core/src/models/endpoint_version.rs index 3d2cd998..a839a431 100644 --- a/rust/lit-node/lit-node-core/src/models/endpoint_version.rs +++ b/rust/lit-node/lit-node-core/src/models/endpoint_version.rs @@ -1,10 +1,14 @@ use serde::{Deserialize, Serialize}; -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] +/// API endpoint version identifier. +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] pub enum EndpointVersion { + /// Original API version (no version prefix). #[default] Initial, + /// Version 1 of the API. V1, + /// Version 2 of the API. V2, } diff --git a/rust/lit-node/lit-node-core/src/models/invocation.rs b/rust/lit-node/lit-node-core/src/models/invocation.rs index 95314baa..efa2bb3c 100644 --- a/rust/lit-node/lit-node-core/src/models/invocation.rs +++ b/rust/lit-node/lit-node-core/src/models/invocation.rs @@ -1,9 +1,12 @@ use serde::{Deserialize, Serialize}; +/// Execution mode for Lit Actions. #[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum Invocation { + /// Synchronous execution - waits for result (default). #[default] Sync, + /// Asynchronous execution - returns immediately. Async, } diff --git a/rust/lit-node/lit-node-core/src/models/peer_id.rs b/rust/lit-node/lit-node-core/src/models/peer_id.rs index 8e4bc6e1..7dd319fe 100644 --- a/rust/lit-node/lit-node-core/src/models/peer_id.rs +++ b/rust/lit-node/lit-node-core/src/models/peer_id.rs @@ -1,6 +1,8 @@ use crate::{Error, Result}; -use blsful::vsss_rs::{ - self, +use lit_rust_crypto::{ + blsful::inner_types as bls, + curve25519_dalek, decaf377, + ed448_goldilocks::{self, sha3}, elliptic_curve::{ bigint::{ ArrayEncoding, ByteArray, Encoding, NonZero, Random, RandomMod, U256, U512, U768, U896, @@ -9,20 +11,15 @@ use blsful::vsss_rs::{ rand_core::{CryptoRng, RngCore}, scalar::FromUintUnchecked, }, -}; -use hd_keys_curves_wasm::{ - decaf377, - ed448_goldilocks_plus::{self, sha3}, jubjub, k256::{ self, sha2::{self, Digest}, }, - p256, p384, + p256, p384, pallas, vsss_rs, }; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use std::fmt; -use std::fmt::{Debug, Display, Formatter}; +use std::fmt::{self, Debug, Display, Formatter}; use std::hash::{Hash, Hasher}; use std::num::{NonZeroU8, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU128, NonZeroUsize}; use std::str::FromStr; @@ -160,7 +157,6 @@ impl From<&PeerId> for U256 { impl From for ethers::types::U256 { fn from(value: PeerId) -> Self { - use blsful::vsss_rs::elliptic_curve::bigint::Encoding; ethers::types::U256::from(value.0.to_be_bytes()) } } @@ -552,15 +548,15 @@ impl From for p384::NonZeroScalar { } } -impl From for ed448_goldilocks_plus::Scalar { +impl From for ed448_goldilocks::Scalar { fn from(value: PeerId) -> Self { use sha3::digest::{ExtendableOutput, Update}; let mut hasher = sha3::Shake128::default(); hasher.update(&value.0.to_be_byte_array()); let digest = hasher.finalize_boxed(114); - let wide_bytes = ed448_goldilocks_plus::WideScalarBytes::from_slice(digest.as_ref()); - >::reduce_bytes(wide_bytes) + let wide_bytes = ed448_goldilocks::WideScalarBytes::from_slice(digest.as_ref()); + >::reduce_bytes(wide_bytes) } } @@ -571,10 +567,10 @@ impl From for jubjub::Scalar { } } -impl From for blsful::inner_types::Scalar { +impl From for bls::Scalar { fn from(value: PeerId) -> Self { let digest = sha2::Sha512::digest(value.0.to_be_byte_array()); - >::reduce(U512::from_be_byte_array(digest)) + >::reduce(U512::from_be_byte_array(digest)) } } @@ -585,6 +581,14 @@ impl From for decaf377::Fr { } } +impl From for pallas::Scalar { + fn from(value: PeerId) -> Self { + let digest = sha2::Sha512::digest(value.0.to_be_byte_array()); + let n = U512::from_be_byte_array(digest); + Self::reduce(n) + } +} + impl FromPeerIdDirect for k256::Scalar { fn from_peer_id(peer_id: PeerId) -> Self { Self::from_uint_unchecked(*peer_id.0.as_ref()) @@ -654,13 +658,13 @@ impl FromPeerIdDirect for vsss_rs::curve25519::WrappedScalar { } } -impl FromPeerIdDirect for ed448_goldilocks_plus::Scalar { +impl FromPeerIdDirect for ed448_goldilocks::Scalar { fn from_peer_id(peer_id: PeerId) -> Self { Self::from_uint_unchecked(peer_id.0.as_ref().resize()) } } -impl FromPeerIdDirect for blsful::inner_types::Scalar { +impl FromPeerIdDirect for bls::Scalar { fn from_peer_id(peer_id: PeerId) -> Self { Self::from_uint_unchecked(peer_id.0.as_ref().resize()) } @@ -691,6 +695,12 @@ impl FromPeerIdDirect for decaf377::Fr { } } +impl FromPeerIdDirect for pallas::Scalar { + fn from_peer_id(peer_id: PeerId) -> Self { + Self::from_uint_unchecked(*peer_id.0.as_ref()) + } +} + impl PeerId { pub const ONE: Self = PeerId(NonZero::::ONE); pub const NOT_ASSIGNED: Self = PeerId(NonZero::::from_uint(U256::MAX)); @@ -762,3 +772,22 @@ fn test_parse_peer_id() { let peer_id2 = u256.try_into().unwrap(); assert_eq!(peer_id, peer_id2); } + +#[test] +fn test_into_scalar_pallas() { + use rand_core::SeedableRng; + + let rng = rand_chacha::ChaChaRng::seed_from_u64(0); + let peer_id = PeerId::random(rng); + let id: pallas::Scalar = peer_id.into(); + let limbs = id.to_raw(); + assert_eq!( + limbs, + [ + 0x3fd0ff79135bb946, + 0xcacf6941e56db2e4, + 0xa49547659cb1baa7, + 0x04e7181b6f5533de, + ] + ); +} diff --git a/rust/lit-node/lit-node-core/src/models/request.rs b/rust/lit-node/lit-node-core/src/models/request.rs index f924745f..c88f0ace 100644 --- a/rust/lit-node/lit-node-core/src/models/request.rs +++ b/rust/lit-node/lit-node-core/src/models/request.rs @@ -9,7 +9,7 @@ use serde_json::Value; #[derive(Clone, Debug, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct JsonSDKHandshakeRequest { +pub struct SDKHandshakeRequest { pub client_public_key: String, pub challenge: Option, } diff --git a/rust/lit-node/lit-node-core/src/models/response.rs b/rust/lit-node/lit-node-core/src/models/response.rs index d4c057e5..640c287e 100644 --- a/rust/lit-node/lit-node-core/src/models/response.rs +++ b/rust/lit-node/lit-node-core/src/models/response.rs @@ -1,12 +1,32 @@ use super::{DynamicPaymentItem, SignableOutput, SignedData, default_epoch}; -use blsful::{Bls12381G2Impl, SignatureShare}; +use lit_rust_crypto::blsful::{Bls12381G2Impl, SignatureShare}; use serde::{Deserialize, Serialize, de::DeserializeOwned}; use serde_json::Value; -use std::collections::HashMap; +use std::collections::{BTreeMap, HashMap}; #[derive(Clone, Debug, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct JsonSDKHandshakeResponse { +pub struct SDKHandshakeResponseV1 { + pub client_sdk_version: String, + pub attestation: Option, + pub latest_blockhash: String, + pub node_version: String, + pub node_identity_key: String, + pub git_commit_hash: String, + pub key_sets: BTreeMap, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct KeySetHandshake { + pub realm_id: u64, + #[serde(default = "default_epoch")] + pub epoch: u64, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SDKHandshakeResponseV0 { pub server_public_key: String, pub subnet_public_key: String, pub network_public_key: String, diff --git a/rust/lit-node/lit-node-core/src/models/signed_data.rs b/rust/lit-node/lit-node-core/src/models/signed_data.rs index 17092fc5..e521b5f9 100644 --- a/rust/lit-node/lit-node-core/src/models/signed_data.rs +++ b/rust/lit-node/lit-node-core/src/models/signed_data.rs @@ -1,10 +1,15 @@ use serde::{Deserialize, Serialize}; +/// Data representing a signature share from a distributed signing operation. #[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct SignedData { + /// The type of signature (e.g., "ECDSA", "BLS"). pub sig_type: String, + /// The signature share value (hex-encoded). pub signature_share: String, + /// The public key associated with this signature (hex-encoded). pub public_key: String, + /// Human-readable name for this signature. pub sig_name: String, } diff --git a/rust/lit-node/lit-node-core/src/models/signing_scheme.rs b/rust/lit-node/lit-node-core/src/models/signing_scheme.rs index 091d8da1..48e605da 100644 --- a/rust/lit-node/lit-node-core/src/models/signing_scheme.rs +++ b/rust/lit-node/lit-node-core/src/models/signing_scheme.rs @@ -3,23 +3,33 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::fmt::{self, Display, Formatter}; use std::str::FromStr; -#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] +/// Cryptographic signing algorithm types supported by the system. +#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] pub enum SigningAlgorithm { + /// Pairing-based cryptography (e.g., BLS signatures). Pairing, + /// Elliptic Curve Digital Signature Algorithm. Ecdsa, + /// Schnorr signature scheme. Schnorr, } -#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] +/// Preference for public key encoding format. +#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] pub enum KeyFormatPreference { + /// Full uncompressed point representation. Uncompressed, + /// Compressed point representation (x-coordinate with sign bit). Compressed, } -#[derive(Clone, Copy, Debug, Default, Hash, Eq, PartialEq)] +/// Comprehensive signing schemes combining curve type, signature algorithm, and hash function. +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Hash)] pub enum SigningScheme { + /// BLS12-381 pairing-based signatures (default). #[default] Bls12381, + /// ECDSA on secp256k1 with SHA-256. EcdsaK256Sha256, EcdsaP256Sha256, EcdsaP384Sha384, @@ -32,6 +42,7 @@ pub enum SigningScheme { SchnorrRedJubjubBlake2b512, SchnorrK256Taproot, SchnorrRedDecaf377Blake2b512, + SchnorrRedPallasBlake2b512, SchnorrkelSubstrate, Bls12381G1ProofOfPossession, } @@ -50,6 +61,7 @@ impl Display for SigningScheme { Self::SchnorrRistretto25519Sha512 => write!(f, "SchnorrRistretto25519Sha512"), Self::SchnorrEd448Shake256 => write!(f, "SchnorrEd448Shake256"), Self::SchnorrRedJubjubBlake2b512 => write!(f, "SchnorrRedJubjubBlake2b512"), + Self::SchnorrRedPallasBlake2b512 => write!(f, "SchnorrRedPallasBlake2b512"), Self::SchnorrK256Taproot => write!(f, "SchnorrK256Taproot"), Self::SchnorrRedDecaf377Blake2b512 => write!(f, "SchnorrRedDecaf377Blake2b512"), Self::SchnorrkelSubstrate => write!(f, "SchnorrkelSubstrate"), @@ -74,6 +86,7 @@ impl FromStr for SigningScheme { "SchnorrRistretto25519Sha512" => Ok(SigningScheme::SchnorrRistretto25519Sha512), "SchnorrEd448Shake256" => Ok(SigningScheme::SchnorrEd448Shake256), "SchnorrRedJubjubBlake2b512" => Ok(SigningScheme::SchnorrRedJubjubBlake2b512), + "SchnorrRedPallasBlake2b512" => Ok(SigningScheme::SchnorrRedPallasBlake2b512), "SchnorrK256Taproot" => Ok(SigningScheme::SchnorrK256Taproot), "SchnorrRedDecaf377Blake2b512" => Ok(SigningScheme::SchnorrRedDecaf377Blake2b512), "SchnorrkelSubstrate" => Ok(SigningScheme::SchnorrkelSubstrate), @@ -101,6 +114,7 @@ impl From for u8 { SigningScheme::SchnorrRedDecaf377Blake2b512 => 13, SigningScheme::SchnorrkelSubstrate => 14, SigningScheme::Bls12381G1ProofOfPossession => 15, + SigningScheme::SchnorrRedPallasBlake2b512 => 16, } } } @@ -125,6 +139,7 @@ impl TryFrom for SigningScheme { 13 => Ok(SigningScheme::SchnorrRedDecaf377Blake2b512), 14 => Ok(SigningScheme::SchnorrkelSubstrate), 15 => Ok(SigningScheme::Bls12381G1ProofOfPossession), + 16 => Ok(SigningScheme::SchnorrRedPallasBlake2b512), _ => Err(Error::Parse(format!("Invalid signing scheme: {}", value))), } } @@ -197,6 +212,10 @@ impl SigningScheme { SigningAlgorithm::Schnorr, SigningScheme::SchnorrkelSubstrate ) + | ( + SigningAlgorithm::Schnorr, + SigningScheme::SchnorrRedPallasBlake2b512 + ) ) } @@ -216,6 +235,7 @@ impl SigningScheme { | Self::SchnorrRistretto25519Sha512 | Self::SchnorrEd448Shake256 | Self::SchnorrRedJubjubBlake2b512 + | Self::SchnorrRedPallasBlake2b512 | Self::SchnorrRedDecaf377Blake2b512 | Self::SchnorrkelSubstrate => KeyFormatPreference::Compressed, Self::EcdsaK256Sha256 | Self::EcdsaP256Sha256 | Self::EcdsaP384Sha384 => { @@ -248,6 +268,7 @@ impl SigningScheme { } Self::SchnorrEd448Shake256 => CurveType::Ed448, Self::SchnorrRedJubjubBlake2b512 => CurveType::RedJubjub, + Self::SchnorrRedPallasBlake2b512 => CurveType::RedPallas, Self::SchnorrK256Taproot => CurveType::K256, Self::SchnorrRedDecaf377Blake2b512 => CurveType::RedDecaf377, Self::Bls12381G1ProofOfPossession => CurveType::BLS12381G1, @@ -278,6 +299,9 @@ impl SigningScheme { SigningScheme::SchnorrRedJubjubBlake2b512 => { b"LIT_HD_KEY_ID_REDJUBJUB_XMD:BLAKE2B-512_ELL2_RO_NUL_" } + SigningScheme::SchnorrRedPallasBlake2b512 => { + b"LIT_HD_KEY_ID_REDPALLAS_XMD:BLAKE2B-512_SSWU_RO_NUL_" + } SigningScheme::SchnorrRedDecaf377Blake2b512 => { b"LIT_HD_KEY_ID_DECAF377_XMD:BLAKE2B-512_ELL2_RO_NUL_" } @@ -296,6 +320,7 @@ impl SigningScheme { | Self::SchnorrRistretto25519Sha512 | Self::SchnorrEd448Shake256 | Self::SchnorrRedJubjubBlake2b512 + | Self::SchnorrRedPallasBlake2b512 | Self::SchnorrRedDecaf377Blake2b512 | Self::SchnorrkelSubstrate | Self::Bls12381 @@ -320,6 +345,7 @@ impl SigningScheme { Self::SchnorrRistretto25519Sha512 => "SchnorrRistretto25519Sha512", Self::SchnorrEd448Shake256 => "SchnorrEd448Shake256", Self::SchnorrRedJubjubBlake2b512 => "SchnorrRedJubjubBlake2b512", + Self::SchnorrRedPallasBlake2b512 => "SchnorrRedPallasBlake2b512", Self::SchnorrK256Taproot => "SchnorrK256Taproot", Self::SchnorrRedDecaf377Blake2b512 => "SchnorrRedDecaf377Blake2b512", Self::SchnorrkelSubstrate => "SchnorrkelSubstrate", diff --git a/rust/lit-node/lit-node-core/src/traits/encoding.rs b/rust/lit-node/lit-node-core/src/traits/encoding.rs index 6f2445b9..13f22c13 100644 --- a/rust/lit-node/lit-node-core/src/traits/encoding.rs +++ b/rust/lit-node/lit-node-core/src/traits/encoding.rs @@ -6,6 +6,7 @@ mod k256; mod p256; mod p384; mod redjubjub; +mod redpallas; /// A trait for handling points in compressed form. pub trait CompressedBytes: Sized { diff --git a/rust/lit-node/lit-node-core/src/traits/encoding/bls.rs b/rust/lit-node/lit-node-core/src/traits/encoding/bls.rs index a748752b..f7e159c3 100644 --- a/rust/lit-node/lit-node-core/src/traits/encoding/bls.rs +++ b/rust/lit-node/lit-node-core/src/traits/encoding/bls.rs @@ -1,5 +1,5 @@ use super::{BeBytes, CompressedBytes, LeBytes}; -use blsful::inner_types::{G1Projective, G2Projective, Scalar}; +use lit_rust_crypto::blsful::inner_types::{G1Projective, G2Projective, Scalar}; impl CompressedBytes for G1Projective { fn to_compressed(&self) -> Vec { diff --git a/rust/lit-node/lit-node-core/src/traits/encoding/curve25519.rs b/rust/lit-node/lit-node-core/src/traits/encoding/curve25519.rs index d8040a65..effe37ba 100644 --- a/rust/lit-node/lit-node-core/src/traits/encoding/curve25519.rs +++ b/rust/lit-node/lit-node-core/src/traits/encoding/curve25519.rs @@ -1,6 +1,8 @@ use super::{BeBytes, CompressedBytes, LeBytes}; -use blsful::inner_types::GroupEncoding; -use vsss_rs::{curve25519, curve25519_dalek}; +use lit_rust_crypto::{ + group::GroupEncoding, + vsss_rs::{curve25519, curve25519_dalek}, +}; // NOTE: There is no difference between compressed and uncompressed points for // this curve diff --git a/rust/lit-node/lit-node-core/src/traits/encoding/decaf377.rs b/rust/lit-node/lit-node-core/src/traits/encoding/decaf377.rs index 3630b0bb..4414a1b7 100644 --- a/rust/lit-node/lit-node-core/src/traits/encoding/decaf377.rs +++ b/rust/lit-node/lit-node-core/src/traits/encoding/decaf377.rs @@ -1,6 +1,5 @@ use super::{BeBytes, CompressedBytes, LeBytes}; -use hd_keys_curves_wasm::decaf377; -use vsss_rs::elliptic_curve::{PrimeField, group::GroupEncoding}; +use lit_rust_crypto::{decaf377, ff::PrimeField, group::GroupEncoding}; // NOTE: There is no difference between compressed and uncompressed points for // this curve diff --git a/rust/lit-node/lit-node-core/src/traits/encoding/ed448.rs b/rust/lit-node/lit-node-core/src/traits/encoding/ed448.rs index 80adcfff..4db4bcf7 100644 --- a/rust/lit-node/lit-node-core/src/traits/encoding/ed448.rs +++ b/rust/lit-node/lit-node-core/src/traits/encoding/ed448.rs @@ -1,6 +1,9 @@ use super::{BeBytes, CompressedBytes, LeBytes}; -use hd_keys_curves_wasm::ed448_goldilocks_plus::{EdwardsPoint, Scalar}; -use vsss_rs::elliptic_curve::{PrimeField, group::GroupEncoding}; +use lit_rust_crypto::{ + ed448_goldilocks::{EdwardsPoint, Scalar}, + ff::PrimeField, + group::GroupEncoding, +}; // NOTE: There is no difference between compressed and uncompressed points for // this curve diff --git a/rust/lit-node/lit-node-core/src/traits/encoding/k256.rs b/rust/lit-node/lit-node-core/src/traits/encoding/k256.rs index 33fb623f..ae98b038 100644 --- a/rust/lit-node/lit-node-core/src/traits/encoding/k256.rs +++ b/rust/lit-node/lit-node-core/src/traits/encoding/k256.rs @@ -1,17 +1,19 @@ use super::{BeBytes, CompressedBytes, LeBytes}; -use hd_keys_curves_wasm::k256; -use vsss_rs::elliptic_curve::{ - PrimeField, - sec1::{EncodedPoint, FromEncodedPoint, ToEncodedPoint}, +use lit_rust_crypto::{ + elliptic_curve::sec1::{EncodedPoint, FromEncodedPoint, ToEncodedPoint}, + ff::PrimeField, + k256::{ + AffinePoint, FieldBytes, NonZeroScalar, ProjectivePoint, Scalar, Secp256k1, ecdsa, schnorr, + }, }; -impl CompressedBytes for k256::ProjectivePoint { +impl CompressedBytes for ProjectivePoint { fn to_compressed(&self) -> Vec { self.to_encoded_point(true).to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Option::from(Self::from_encoded_point(&pt)) } fn to_uncompressed(&self) -> Vec { @@ -19,18 +21,18 @@ impl CompressedBytes for k256::ProjectivePoint { } fn from_uncompressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Option::from(Self::from_encoded_point(&pt)) } } -impl CompressedBytes for k256::AffinePoint { +impl CompressedBytes for AffinePoint { fn to_compressed(&self) -> Vec { self.to_encoded_point(true).to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Option::from(Self::from_encoded_point(&pt)) } fn to_uncompressed(&self) -> Vec { @@ -38,18 +40,18 @@ impl CompressedBytes for k256::AffinePoint { } fn from_uncompressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Option::from(Self::from_encoded_point(&pt)) } } -impl CompressedBytes for k256::ecdsa::VerifyingKey { +impl CompressedBytes for ecdsa::VerifyingKey { fn to_compressed(&self) -> Vec { self.to_encoded_point(true).to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Self::from_encoded_point(&pt).ok() } fn to_uncompressed(&self) -> Vec { @@ -57,18 +59,18 @@ impl CompressedBytes for k256::ecdsa::VerifyingKey { } fn from_uncompressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Self::from_encoded_point(&pt).ok() } } -impl CompressedBytes for k256::schnorr::VerifyingKey { +impl CompressedBytes for schnorr::VerifyingKey { fn to_compressed(&self) -> Vec { self.as_affine().to_encoded_point(true).to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Self::from_bytes(pt.compress().as_bytes()).ok() } fn to_uncompressed(&self) -> Vec { @@ -76,66 +78,66 @@ impl CompressedBytes for k256::schnorr::VerifyingKey { } fn from_uncompressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Self::from_bytes(pt.compress().as_bytes()).ok() } } -impl BeBytes for k256::Scalar { +impl BeBytes for Scalar { fn to_be_bytes(&self) -> Vec { self.to_bytes().to_vec() } fn from_be_bytes(bytes: &[u8]) -> Option { - let mut repr = k256::FieldBytes::default(); + let mut repr = FieldBytes::default(); repr.copy_from_slice(bytes); Option::from(Self::from_repr(repr)) } } -impl LeBytes for k256::Scalar {} +impl LeBytes for Scalar {} -impl CompressedBytes for k256::Scalar { +impl CompressedBytes for Scalar { fn to_compressed(&self) -> Vec { self.to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let mut repr = k256::FieldBytes::default(); + let mut repr = FieldBytes::default(); repr.copy_from_slice(bytes); Option::from(Self::from_repr(repr)) } } -impl BeBytes for k256::NonZeroScalar { +impl BeBytes for NonZeroScalar { fn to_be_bytes(&self) -> Vec { self.to_bytes().to_vec() } fn from_be_bytes(bytes: &[u8]) -> Option { - let mut repr = k256::FieldBytes::default(); + let mut repr = FieldBytes::default(); repr.copy_from_slice(bytes); Option::from(Self::from_repr(repr)) } } -impl LeBytes for k256::NonZeroScalar {} +impl LeBytes for NonZeroScalar {} -impl BeBytes for k256::ecdsa::SigningKey { +impl BeBytes for ecdsa::SigningKey { fn to_be_bytes(&self) -> Vec { self.as_nonzero_scalar().to_be_bytes() } fn from_be_bytes(bytes: &[u8]) -> Option { - let mut repr = k256::FieldBytes::default(); + let mut repr = FieldBytes::default(); repr.copy_from_slice(bytes); Self::from_bytes(&repr).ok() } } -impl LeBytes for k256::ecdsa::SigningKey {} +impl LeBytes for ecdsa::SigningKey {} -impl BeBytes for k256::schnorr::SigningKey { +impl BeBytes for schnorr::SigningKey { fn to_be_bytes(&self) -> Vec { self.as_nonzero_scalar().to_be_bytes() } @@ -145,4 +147,4 @@ impl BeBytes for k256::schnorr::SigningKey { } } -impl LeBytes for k256::schnorr::SigningKey {} +impl LeBytes for schnorr::SigningKey {} diff --git a/rust/lit-node/lit-node-core/src/traits/encoding/p256.rs b/rust/lit-node/lit-node-core/src/traits/encoding/p256.rs index c7d6d498..c578755e 100644 --- a/rust/lit-node/lit-node-core/src/traits/encoding/p256.rs +++ b/rust/lit-node/lit-node-core/src/traits/encoding/p256.rs @@ -1,17 +1,17 @@ use super::{BeBytes, CompressedBytes, LeBytes}; -use hd_keys_curves_wasm::p256; -use vsss_rs::elliptic_curve::{ - PrimeField, - sec1::{EncodedPoint, FromEncodedPoint, ToEncodedPoint}, +use lit_rust_crypto::{ + elliptic_curve::sec1::{EncodedPoint, FromEncodedPoint, ToEncodedPoint}, + ff::PrimeField, + p256::{AffinePoint, FieldBytes, NistP256, NonZeroScalar, ProjectivePoint, Scalar, ecdsa}, }; -impl CompressedBytes for p256::ProjectivePoint { +impl CompressedBytes for ProjectivePoint { fn to_compressed(&self) -> Vec { self.to_encoded_point(true).to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Option::from(Self::from_encoded_point(&pt)) } @@ -20,18 +20,18 @@ impl CompressedBytes for p256::ProjectivePoint { } fn from_uncompressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Option::from(Self::from_encoded_point(&pt)) } } -impl CompressedBytes for p256::AffinePoint { +impl CompressedBytes for AffinePoint { fn to_compressed(&self) -> Vec { self.to_encoded_point(true).to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Option::from(Self::from_encoded_point(&pt)) } @@ -40,18 +40,18 @@ impl CompressedBytes for p256::AffinePoint { } fn from_uncompressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Option::from(Self::from_encoded_point(&pt)) } } -impl CompressedBytes for p256::ecdsa::VerifyingKey { +impl CompressedBytes for ecdsa::VerifyingKey { fn to_compressed(&self) -> Vec { self.to_encoded_point(true).to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Self::from_encoded_point(&pt).ok() } fn to_uncompressed(&self) -> Vec { @@ -59,61 +59,61 @@ impl CompressedBytes for p256::ecdsa::VerifyingKey { } fn from_uncompressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Self::from_encoded_point(&pt).ok() } } -impl BeBytes for p256::Scalar { +impl BeBytes for Scalar { fn to_be_bytes(&self) -> Vec { self.to_bytes().to_vec() } fn from_be_bytes(bytes: &[u8]) -> Option { - let mut repr = p256::FieldBytes::default(); + let mut repr = FieldBytes::default(); repr.copy_from_slice(bytes); Option::from(Self::from_repr(repr)) } } -impl LeBytes for p256::Scalar {} +impl LeBytes for Scalar {} -impl CompressedBytes for p256::Scalar { +impl CompressedBytes for Scalar { fn to_compressed(&self) -> Vec { self.to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let mut repr = p256::FieldBytes::default(); + let mut repr = FieldBytes::default(); repr.copy_from_slice(bytes); Option::from(Self::from_repr(repr)) } } -impl BeBytes for p256::NonZeroScalar { +impl BeBytes for NonZeroScalar { fn to_be_bytes(&self) -> Vec { self.to_bytes().to_vec() } fn from_be_bytes(bytes: &[u8]) -> Option { - let mut repr = p256::FieldBytes::default(); + let mut repr = FieldBytes::default(); repr.copy_from_slice(bytes); Option::from(Self::from_repr(repr)) } } -impl LeBytes for p256::NonZeroScalar {} +impl LeBytes for NonZeroScalar {} -impl BeBytes for p256::ecdsa::SigningKey { +impl BeBytes for ecdsa::SigningKey { fn to_be_bytes(&self) -> Vec { self.as_nonzero_scalar().to_be_bytes() } fn from_be_bytes(bytes: &[u8]) -> Option { - let mut repr = p256::FieldBytes::default(); + let mut repr = FieldBytes::default(); repr.copy_from_slice(bytes); Self::from_bytes(&repr).ok() } } -impl LeBytes for p256::ecdsa::SigningKey {} +impl LeBytes for ecdsa::SigningKey {} diff --git a/rust/lit-node/lit-node-core/src/traits/encoding/p384.rs b/rust/lit-node/lit-node-core/src/traits/encoding/p384.rs index 5d7ee318..14d772c7 100644 --- a/rust/lit-node/lit-node-core/src/traits/encoding/p384.rs +++ b/rust/lit-node/lit-node-core/src/traits/encoding/p384.rs @@ -1,17 +1,17 @@ use super::{BeBytes, CompressedBytes, LeBytes}; -use hd_keys_curves_wasm::p384; -use vsss_rs::elliptic_curve::{ - PrimeField, - sec1::{EncodedPoint, FromEncodedPoint, ToEncodedPoint}, +use lit_rust_crypto::{ + elliptic_curve::sec1::{EncodedPoint, FromEncodedPoint, ToEncodedPoint}, + ff::PrimeField, + p384::{AffinePoint, FieldBytes, NistP384, NonZeroScalar, ProjectivePoint, Scalar, ecdsa}, }; -impl CompressedBytes for p384::ProjectivePoint { +impl CompressedBytes for ProjectivePoint { fn to_compressed(&self) -> Vec { self.to_encoded_point(true).to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Option::from(Self::from_encoded_point(&pt)) } fn to_uncompressed(&self) -> Vec { @@ -19,18 +19,18 @@ impl CompressedBytes for p384::ProjectivePoint { } fn from_uncompressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Option::from(Self::from_encoded_point(&pt)) } } -impl CompressedBytes for p384::AffinePoint { +impl CompressedBytes for AffinePoint { fn to_compressed(&self) -> Vec { self.to_encoded_point(true).to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Option::from(Self::from_encoded_point(&pt)) } fn to_uncompressed(&self) -> Vec { @@ -38,18 +38,18 @@ impl CompressedBytes for p384::AffinePoint { } fn from_uncompressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Option::from(Self::from_encoded_point(&pt)) } } -impl CompressedBytes for p384::ecdsa::VerifyingKey { +impl CompressedBytes for ecdsa::VerifyingKey { fn to_compressed(&self) -> Vec { self.to_encoded_point(true).to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Self::from_encoded_point(&pt).ok() } fn to_uncompressed(&self) -> Vec { @@ -57,61 +57,61 @@ impl CompressedBytes for p384::ecdsa::VerifyingKey { } fn from_uncompressed(bytes: &[u8]) -> Option { - let pt = EncodedPoint::::from_bytes(bytes).ok()?; + let pt = EncodedPoint::::from_bytes(bytes).ok()?; Self::from_encoded_point(&pt).ok() } } -impl BeBytes for p384::Scalar { +impl BeBytes for Scalar { fn to_be_bytes(&self) -> Vec { self.to_bytes().to_vec() } fn from_be_bytes(bytes: &[u8]) -> Option { - let mut repr = p384::FieldBytes::default(); + let mut repr = FieldBytes::default(); repr.copy_from_slice(bytes); Option::from(Self::from_repr(repr)) } } -impl LeBytes for p384::Scalar {} +impl LeBytes for Scalar {} -impl CompressedBytes for p384::Scalar { +impl CompressedBytes for Scalar { fn to_compressed(&self) -> Vec { self.to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let mut repr = p384::FieldBytes::default(); + let mut repr = FieldBytes::default(); repr.copy_from_slice(bytes); Option::from(Self::from_repr(repr)) } } -impl BeBytes for p384::NonZeroScalar { +impl BeBytes for NonZeroScalar { fn to_be_bytes(&self) -> Vec { self.to_bytes().to_vec() } fn from_be_bytes(bytes: &[u8]) -> Option { - let mut repr = p384::FieldBytes::default(); + let mut repr = FieldBytes::default(); repr.copy_from_slice(bytes); Option::from(Self::from_repr(repr)) } } -impl LeBytes for p384::NonZeroScalar {} +impl LeBytes for NonZeroScalar {} -impl BeBytes for p384::ecdsa::SigningKey { +impl BeBytes for ecdsa::SigningKey { fn to_be_bytes(&self) -> Vec { self.as_nonzero_scalar().to_be_bytes() } fn from_be_bytes(bytes: &[u8]) -> Option { - let mut repr = p384::FieldBytes::default(); + let mut repr = FieldBytes::default(); repr.copy_from_slice(bytes); Self::from_bytes(&repr).ok() } } -impl LeBytes for p384::ecdsa::SigningKey {} +impl LeBytes for ecdsa::SigningKey {} diff --git a/rust/lit-node/lit-node-core/src/traits/encoding/redjubjub.rs b/rust/lit-node/lit-node-core/src/traits/encoding/redjubjub.rs index 116ca2fb..bf0eda84 100644 --- a/rust/lit-node/lit-node-core/src/traits/encoding/redjubjub.rs +++ b/rust/lit-node/lit-node-core/src/traits/encoding/redjubjub.rs @@ -1,14 +1,17 @@ use super::{BeBytes, CompressedBytes, LeBytes}; -use hd_keys_curves_wasm::jubjub; -use vsss_rs::elliptic_curve::{PrimeField, group::GroupEncoding}; +use lit_rust_crypto::{ + ff::PrimeField, + group::GroupEncoding, + jubjub::{Scalar, SubgroupPoint}, +}; -impl CompressedBytes for jubjub::SubgroupPoint { +impl CompressedBytes for SubgroupPoint { fn to_compressed(&self) -> Vec { self.to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let mut repr = ::Repr::default(); + let mut repr = ::Repr::default(); if bytes.len() != repr.len() { return None; } @@ -17,7 +20,7 @@ impl CompressedBytes for jubjub::SubgroupPoint { } } -impl BeBytes for jubjub::Scalar { +impl BeBytes for Scalar { fn to_be_bytes(&self) -> Vec { let mut bytes = self.to_bytes(); bytes.reverse(); @@ -27,31 +30,31 @@ impl BeBytes for jubjub::Scalar { fn from_be_bytes(bytes: &[u8]) -> Option { let mut bytes = bytes.to_vec(); bytes.reverse(); - let mut repr = ::Repr::default(); + let mut repr = ::Repr::default(); repr.copy_from_slice(bytes.as_slice()); Option::from(Self::from_repr(repr)) } } -impl LeBytes for jubjub::Scalar { +impl LeBytes for Scalar { fn to_le_bytes(&self) -> Vec { self.to_bytes().to_vec() } fn from_le_bytes(bytes: &[u8]) -> Option { - let mut repr = ::Repr::default(); + let mut repr = ::Repr::default(); repr.copy_from_slice(bytes); Option::from(Self::from_repr(repr)) } } -impl CompressedBytes for jubjub::Scalar { +impl CompressedBytes for Scalar { fn to_compressed(&self) -> Vec { self.to_bytes().to_vec() } fn from_compressed(bytes: &[u8]) -> Option { - let mut repr = ::Repr::default(); + let mut repr = ::Repr::default(); repr.copy_from_slice(bytes); Option::from(Self::from_repr(repr)) } diff --git a/rust/lit-node/lit-node-core/src/traits/encoding/redpallas.rs b/rust/lit-node/lit-node-core/src/traits/encoding/redpallas.rs new file mode 100644 index 00000000..db5bee5a --- /dev/null +++ b/rust/lit-node/lit-node-core/src/traits/encoding/redpallas.rs @@ -0,0 +1,50 @@ +use super::{BeBytes, CompressedBytes, LeBytes}; +use lit_rust_crypto::{ + group::GroupEncoding, + pallas::{Point, Scalar}, +}; + +impl CompressedBytes for Point { + fn to_compressed(&self) -> Vec { + self.to_bytes().to_vec() + } + + fn from_compressed(bytes: &[u8]) -> Option { + let mut repr = ::Repr::default(); + if repr.len() != bytes.len() { + return None; + } + repr.copy_from_slice(bytes); + Option::from(Self::from_bytes(&repr)) + } +} + +impl BeBytes for Scalar { + fn to_be_bytes(&self) -> Vec { + self.to_be_bytes().to_vec() + } + + fn from_be_bytes(bytes: &[u8]) -> Option { + Option::from(Self::from_be_bytes(&bytes.try_into().ok()?)) + } +} + +impl LeBytes for Scalar { + fn to_le_bytes(&self) -> Vec { + self.to_le_bytes().to_vec() + } + + fn from_le_bytes(bytes: &[u8]) -> Option { + Option::from(Self::from_le_bytes(bytes.try_into().ok()?)) + } +} + +impl CompressedBytes for Scalar { + fn to_compressed(&self) -> Vec { + self.to_le_bytes().to_vec() + } + + fn from_compressed(bytes: &[u8]) -> Option { + Option::from(Self::from_le_bytes(bytes.try_into().ok()?)) + } +} diff --git a/rust/lit-node/lit-node-testnet/src/end_user/pkp.rs b/rust/lit-node/lit-node-testnet/src/end_user/pkp.rs index 6ef76960..3959a4b9 100644 --- a/rust/lit-node/lit-node-testnet/src/end_user/pkp.rs +++ b/rust/lit-node/lit-node-testnet/src/end_user/pkp.rs @@ -18,6 +18,7 @@ pub struct Pkp { pub pubkey: String, pub token_id: U256, pub eth_address: H160, + pub key_set_id: String, } impl Pkp { @@ -88,11 +89,17 @@ impl Pkp { pubkey: pubkey.clone(), token_id, eth_address, + key_set_id: "naga-keyset1".to_string(), }) } - pub fn info(&self) -> (String, U256, H160) { - (self.pubkey.clone(), self.token_id, self.eth_address) + pub fn info(&self) -> (String, U256, H160, String) { + ( + self.pubkey.clone(), + self.token_id, + self.eth_address, + self.key_set_id.clone(), + ) } #[doc = "Grant an address permission to use a PKP"] @@ -349,6 +356,7 @@ impl Pkp { actions: Arc::new(end_user.actions().clone()), pubkey, token_id, + key_set_id: "naga-keyset1".to_string(), eth_address: eth_address.into(), }) } diff --git a/rust/lit-node/lit-node-testnet/src/lib.rs b/rust/lit-node/lit-node-testnet/src/lib.rs index 2c8b3c93..c6fc38d3 100644 --- a/rust/lit-node/lit-node-testnet/src/lib.rs +++ b/rust/lit-node/lit-node-testnet/src/lib.rs @@ -37,6 +37,8 @@ pub struct TestSetupBuilder { wait_for_root_keys: bool, fund_wallet: bool, fund_ledger_for_wallet: bool, + custom_binary_path: Option, + start_staked_only_validators: bool, } impl Default for TestSetupBuilder { @@ -57,6 +59,8 @@ impl Default for TestSetupBuilder { wait_for_root_keys: true, fund_wallet: true, fund_ledger_for_wallet: true, + custom_binary_path: None, + start_staked_only_validators: true, } } } @@ -80,6 +84,11 @@ impl TestSetupBuilder { self } + pub fn start_staked_only_validators(mut self, start_staked_only_validators: bool) -> Self { + self.start_staked_only_validators = start_staked_only_validators; + self + } + pub fn force_deploy(mut self, force_deploy: bool) -> Self { self.force_deploy = force_deploy; self @@ -140,6 +149,11 @@ impl TestSetupBuilder { self } + pub fn custom_binary_path(mut self, custom_binary_path: Option) -> Self { + self.custom_binary_path = custom_binary_path; + self + } + pub async fn build(self) -> (Testnet, ValidatorCollection, EndUser) { let node_keys_path = Path::new("./node_keys"); if node_keys_path.exists() { @@ -190,8 +204,11 @@ impl TestSetupBuilder { } } - let num_staked_nodes = - self.num_staked_and_joined_validators + self.num_staked_only_validators; + let num_staked_nodes = if self.start_staked_only_validators { + self.num_staked_and_joined_validators + self.num_staked_only_validators + } else { + self.num_staked_and_joined_validators + }; let node_binary_feature_flags = if self.is_fault_test { "lit-actions,testing,proxy_chatter".to_string() @@ -204,6 +221,7 @@ impl TestSetupBuilder { .wait_initial_epoch(self.wait_initial_epoch) .wait_for_root_keys(self.wait_for_root_keys) .node_binary_feature_flags(node_binary_feature_flags) + .custom_binary_path(self.custom_binary_path) .build(&testnet) .await .expect("Failed to build validator collection"); diff --git a/rust/lit-node/lit-node-testnet/src/node_collection.rs b/rust/lit-node/lit-node-testnet/src/node_collection.rs index 0671222f..7aa4bfa8 100644 --- a/rust/lit-node/lit-node-testnet/src/node_collection.rs +++ b/rust/lit-node/lit-node-testnet/src/node_collection.rs @@ -5,7 +5,7 @@ use ethers::types::U256; use ethers::utils::hex; use futures::future::join_all; use lit_node_core::response::GenericResponse; -use lit_node_core::response::JsonSDKHandshakeResponse; +use lit_node_core::response::SDKHandshakeResponseV0; use std::collections::HashMap; use std::collections::HashSet; use std::fmt::Debug; @@ -199,7 +199,7 @@ pub async fn get_identity_pubkeys_from_node_set( async fn handshake_nodes( actions: &Actions, realm_id: U256, -) -> Vec> { +) -> Vec> { let validators = actions.get_current_validator_structs(realm_id).await; let node_set = validators .iter() @@ -264,7 +264,7 @@ pub async fn get_node_versions(node_set: &Vec) -> Vec { // Parse response headers headers .iter() - .map(|header| header.get("X-Lit-Node-Version").unwrap().clone()) + .map(|header| header.get("x-lit-node-version").unwrap().clone()) .collect::>() } diff --git a/rust/lit-node/lit-node-testnet/src/testnet/actions.rs b/rust/lit-node/lit-node-testnet/src/testnet/actions.rs index 67580134..de2fb78f 100644 --- a/rust/lit-node/lit-node-testnet/src/testnet/actions.rs +++ b/rust/lit-node/lit-node-testnet/src/testnet/actions.rs @@ -17,6 +17,7 @@ use lit_blockchain::contracts::{ }; use lit_core::utils::binary::bytes_to_hex; use lit_node_common::models::NodeStakingStatus; +use lit_node_core::CurveType; // use lit_node::peers::peer_reviewer::MAX_COMPLAINT_REASON_VALUE; pub const MAX_COMPLAINT_REASON_VALUE: u8 = 4; use super::PeerItem; @@ -27,6 +28,12 @@ use std::time::Duration; use tracing::{debug, error, info, warn}; const DEFAULT_TIMELOCK_SECONDS: u64 = 86400 * 120; // 1 day + +pub struct RootKeyConfig { + pub curve_type: CurveType, + pub count: usize, +} + #[derive(Clone, Debug)] pub struct Actions { contracts: Contracts, @@ -1269,4 +1276,123 @@ impl Actions { } Ok(()) } + + pub async fn add_default_keyset( + &self, + realm_id: U256, + identifier: String, + description: String, + ) -> Result<()> { + let root_key_configs = vec![ + RootKeyConfig { + curve_type: CurveType::BLS, + count: 1, + }, + RootKeyConfig { + curve_type: CurveType::K256, + count: 2, + }, + RootKeyConfig { + curve_type: CurveType::P256, + count: 2, + }, + RootKeyConfig { + curve_type: CurveType::P384, + count: 2, + }, + RootKeyConfig { + curve_type: CurveType::Ed25519, + count: 2, + }, + RootKeyConfig { + curve_type: CurveType::Ed448, + count: 2, + }, + RootKeyConfig { + curve_type: CurveType::Ristretto25519, + count: 2, + }, + RootKeyConfig { + curve_type: CurveType::RedJubjub, + count: 2, + }, + RootKeyConfig { + curve_type: CurveType::RedDecaf377, + count: 2, + }, + RootKeyConfig { + curve_type: CurveType::BLS12381G1, + count: 2, + }, + ]; + self.add_keyset(realm_id, identifier, description, root_key_configs) + .await + } + + pub async fn add_keyset( + &self, + realm_id: U256, + identifier: String, + description: String, + root_key_configs: Vec, + ) -> Result<()> { + let curves = root_key_configs + .iter() + .map(|rkc| rkc.curve_type.into()) + .collect(); + let counts = root_key_configs + .iter() + .map(|rkc| U256::from(rkc.count)) + .collect(); + info!("Curves/Counts: {:?}/{:?}", curves, counts); + let update_key_set_request = staking::KeySetConfig { + minimum_threshold: 3, + monetary_value: 0, + complete_isolation: false, + identifier: identifier.clone(), + description: description, + realms: vec![realm_id], + curves: curves, + counts: counts, + recovery_session_id: Bytes::from_static(&[]), + }; + + let cc = self.contracts.staking.set_key_set(update_key_set_request); + let result = cc + .send() + .await + .map_err(|e| anyhow::anyhow!("Error sending tx to add second keyset! {:?}", e))?; + let _result = result + .log_msg("add_second_keyset") + .await + .map_err(|e| anyhow::anyhow!("Error waiting for successful add keyset tx! {:?}", e))?; + info!( + "Added keyset {} with identifier `{}` successfully", + realm_id, identifier + ); + Ok(()) + } + + pub async fn get_all_keyset_configs(&self) -> Result> { + let key_set_configs = self + .contracts + .staking + .key_sets() + .call() + .await? + .into_iter() + .map(|ks| staking::KeySetConfig::try_from(ks).unwrap()) + .collect(); + Ok(key_set_configs) + } + + pub async fn get_keyset_config(&self, identifier: String) -> Result { + let key_set_config = self + .contracts + .staking + .get_key_set(identifier) + .call() + .await?; + Ok(key_set_config) + } } diff --git a/rust/lit-node/lit-node-testnet/src/testnet/contracts.rs b/rust/lit-node/lit-node-testnet/src/testnet/contracts.rs index f5da6c03..b3fd7468 100644 --- a/rust/lit-node/lit-node-testnet/src/testnet/contracts.rs +++ b/rust/lit-node/lit-node-testnet/src/testnet/contracts.rs @@ -81,6 +81,7 @@ pub struct StakingContractRealmConfigBuilder { peer_checking_interval_secs: Option, max_presign_concurrency: Option, complaint_reason_to_config: Option>, + default_key_set: Option, } impl StakingContractRealmConfigBuilder { @@ -138,6 +139,11 @@ impl StakingContractRealmConfigBuilder { self } + pub fn default_key_set(mut self, value: Option) -> Self { + self.default_key_set = value; + self + } + pub fn build(self) -> StakingContractRealmConfig { StakingContractRealmConfig { realm_id: self.realm_id.unwrap_or(U256::from(1)), @@ -148,6 +154,7 @@ impl StakingContractRealmConfigBuilder { peer_checking_interval_secs: self.peer_checking_interval_secs, max_presign_concurrency: self.max_presign_concurrency, complaint_reason_to_config: self.complaint_reason_to_config, + default_key_set: self.default_key_set, } } } @@ -228,6 +235,7 @@ pub struct StakingContractRealmConfig { peer_checking_interval_secs: Option, max_presign_concurrency: Option, complaint_reason_to_config: Option>, + default_key_set: Option, } #[derive(Default)] @@ -732,14 +740,8 @@ impl Contracts { .await .map_err(|e| anyhow::anyhow!("unable to get staking config: {:?}", e))?; - let key_types = staking - .get_key_types() - .call() - .await - .map_err(|e| anyhow::anyhow!("unable to get key types: {:?}", e))?; let cc = staking.set_config(GlobalConfig { token_reward_per_token_per_epoch: global_config.token_reward_per_token_per_epoch, - key_types: key_types, reward_epoch_duration: U256::from(86400), // 1 day max_time_lock: U256::from(31536000), // 1 year min_time_lock: U256::from(86400 * 100), // 100 days diff --git a/rust/lit-node/lit-node-testnet/src/testnet/contracts_repo.rs b/rust/lit-node/lit-node-testnet/src/testnet/contracts_repo.rs index bad2eeae..2b126863 100644 --- a/rust/lit-node/lit-node-testnet/src/testnet/contracts_repo.rs +++ b/rust/lit-node/lit-node-testnet/src/testnet/contracts_repo.rs @@ -354,7 +354,7 @@ pub fn generate_wallet_and_add_as_alias() { "scripts/generate_wallet_and_add_as_alias.ts", ]; info!( - "Running full command in {}: npx {}", + "Running full generate_wallet_and_add_as_alias command in {}: npx {}", LITCONTRACTPATH, args.join(" ") ); diff --git a/rust/lit-node/lit-node-testnet/src/validator.rs b/rust/lit-node/lit-node-testnet/src/validator.rs index 0b8177da..9caebe00 100644 --- a/rust/lit-node/lit-node-testnet/src/validator.rs +++ b/rust/lit-node/lit-node-testnet/src/validator.rs @@ -36,7 +36,7 @@ use tracing::error; use tracing::trace; use tracing::{debug, info, warn}; -use lit_node_core::response::JsonSDKHandshakeResponse; +use lit_node_core::response::SDKHandshakeResponseV0; use super::testnet::NodeAccount; use super::testnet::Testnet; @@ -857,6 +857,17 @@ impl ValidatorCollection { }) .collect() } + pub async fn active_node_set(&self) -> Result> { + Ok(self + .get_active_validators() + .await? + .iter() + .map(|v| NodeSet { + socket_address: v.public_address(), + value: 1, + }) + .collect::>()) + } } impl Drop for ValidatorCollection { @@ -1398,7 +1409,7 @@ impl Node { let response = Self::handshake(port).await?; let response_text = response.text().await?; - let handshake_json = serde_json::from_str::(&response_text)?; + let handshake_json = serde_json::from_str::(&response_text)?; Ok(handshake_json.epoch) } @@ -1658,6 +1669,6 @@ pub fn default_keyset_config() -> KeySetConfig { counts: std::iter::once(U256::from(1)) .chain(CurveType::into_iter().skip(1).map(|_| U256::from(2))) .collect(), - recovery_party_members: Vec::new(), + recovery_session_id: Bytes::from_static(&[]), } } diff --git a/rust/lit-node/lit-node/Cargo.lock b/rust/lit-node/lit-node/Cargo.lock index 87471991..0b44c145 100644 --- a/rust/lit-node/lit-node/Cargo.lock +++ b/rust/lit-node/lit-node/Cargo.lock @@ -11863,15 +11863,6 @@ dependencies = [ "syn 2.0.96", ] -[[package]] -name = "scc" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e1c91382686d21b5ac7959341fcb9780fa7c03773646995a87c950fa7be640" -dependencies = [ - "sdd", -] - [[package]] name = "schannel" version = "0.1.27" diff --git a/rust/lit-node/lit-node/Cargo.toml b/rust/lit-node/lit-node/Cargo.toml index 42855fce..c8828cb5 100644 --- a/rust/lit-node/lit-node/Cargo.toml +++ b/rust/lit-node/lit-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lit_node" -version = "2.1.5" +version = "2.1.8" edition.workspace = true default-run = "lit_node" @@ -36,17 +36,13 @@ async-std.workspace = true async-trait.workspace = true base64_light = "0.1" bech32 = "0.11" -blsful.workspace = true -blstrs_plus = { version = "0.8", features = ["serde"] } bulletproofs.workspace = true bs58 = "0.5.0" -cc = "1.2.22" +#cc = "1.2.34" ciborium = { version = "0.2" } chrono = "0.4" clap = { version = "4.5", features = ["cargo"] } -curve25519-dalek.workspace = true data-encoding.workspace = true -decaf377.workspace = true derive_builder = "0.20" derive_more.workspace = true digest = { version = "0.10", default-features = false, features = [ @@ -56,47 +52,35 @@ digest = { version = "0.10", default-features = false, features = [ dotenv = "0.15.0" ecdsa = { version = "0.16", features = ["arithmetic"] } ed25519-dalek.workspace = true -ed448-goldilocks.workspace = true -elliptic-curve.workspace = true ethabi.workspace = true ethers.workspace = true flume = "0.11" -frost-dkg = "0.3.3" +frost-dkg = "0.5.1" futures = "0.3" glob = "0.3.1" -hd-keys-curves = { git = "https://github.com/LIT-Protocol/hd-keys-curves-wasm", package = "hd-keys-curves-wasm", rev = "5e0dcc1a6d8d08f2328d4716dca806db87f93748", default-features = false, features = [ - "bls", - "k256", - "p256", - "p384", - "curve25519", - "ed448", - "jubjub", - "decaf377", -] } hex.workspace = true hex-literal = "0.4" indicatif = "=0.15" ipfs-hasher = "0.13.0" iri-string = "0.6" jsonpath-plus = "0.1.9" -jubjub.workspace = true -k256 = { version = "0.13", features = [ +lazy_static = "1.5.0" +libaes = { version = "0.7", optional = true } +libsecp256k1 = { git = "https://github.com/LIT-Protocol/libsecp256k1", branch = "master", version = "0.7.1" } +lit-fast-ecdsa = { path = "../../lit-core/lit-fast-ecdsa" } +lit-frost.workspace = true +lit-node-core = { path = "../lit-node-core" } +lit-rust-crypto = { workspace = true, features = [ "arithmetic", - "sha256", + "default", "ecdsa", - "serde", "ecdsa-core", "expose-field", "hash2curve", "schnorr", -], optional = false } -lazy_static = "1.5.0" -libaes = { version = "0.7", optional = true } -libsecp256k1 = { git = "https://github.com/LIT-Protocol/libsecp256k1", branch = "master", version = "0.7.1" } -lit-fast-ecdsa = { path = "../../lit-core/lit-fast-ecdsa" } -lit-frost = { git = "https://github.com/LIT-Protocol/lit-frost.git" } -lit-node-core = { path = "../lit-node-core" } + "sha", + "serde" +] } lit-sdk = { path = "../lit-sdk" } lit-vrf = { path = "../../lit-core/lit-vrf" } moka = { version = "0.12.7", features = ["future"] } @@ -115,22 +99,10 @@ rocket_cors = { version = "0.6.0" } # used to verify JWTs. must match the version in the crate overrides at the bottom of this file rsa = { git = "https://github.com/RustCrypto/RSA", tag = "v0.7.0-pre" } rusqlite = { version = "0.32.0", features = ["backup"] } -p256 = { version = "0.13", features = [ - "arithmetic", - "ecdsa-core", - "expose-field", - "hash2curve", - "sha256", - "serde", -], optional = false } -p384 = { version = "0.13", features = [ - "arithmetic", - "serde", -], optional = false } postcard = { version = "1.1.1", features = ["use-std"] } prost = "0.13" ripemd = "0.1.3" -scc = "2" +scc.workspace = true sdd.workspace = true semver = "1.0.22" serde.workspace = true @@ -160,9 +132,8 @@ tracing-opentelemetry = { version = "0.25" } tracing-subscriber = { version = "0.3" } ucan-capabilities-object = "0.1" url.workspace = true -verifiable-share-encryption = { version = "0.3.0", git = "https://github.com/LIT-Protocol/verifiable-share-encryption", rev = "7eddfbe736369db596d0f302c72f1d76b0fd332d" } +verifiable-share-encryption = { git = "https://github.com/LIT-Protocol/verifiable-share-encryption", branch = "pallas" } visibility = "0.1.1" -vsss-rs.workspace = true web3 = "0.19.0" webauthn-rs-core = { git = "https://github.com/LIT-Protocol/webauthn-rs" } webauthn-rs-proto = { git = "https://github.com/LIT-Protocol/webauthn-rs" } @@ -171,6 +142,7 @@ x25519-dalek = { version = "2.0", features = ["static_secrets"] } xor_name = "3.0.0" xorf = { version = "0.8.1", features = ["serde"] } tokio-stream = "0.1.17" +log = "0.4.27" [dependencies.lit-node-common] path = "../lit-node-common" diff --git a/rust/lit-node/lit-node/rpc-config.example.yaml b/rust/lit-node/lit-node/rpc-config.example.yaml index 8dd0921e..61278e83 100644 --- a/rust/lit-node/lit-node/rpc-config.example.yaml +++ b/rust/lit-node/lit-node/rpc-config.example.yaml @@ -172,7 +172,9 @@ chains: storyOdyssey: - url: https://rpc.odyssey.storyrpc.io campTestnet: - - url: https://rpc.camp-network-testnet.gelato.digital + - url: https://rpc.basecamp.t.raas.gelato.cloud + campMainnet: + - url: https://rpc.camp.raas.gelato.cloud hushedNorthstar: - url: https://rpc.buildbear.io/yielddev matchain: diff --git a/rust/lit-node/lit-node/src/access_control/cosmos.rs b/rust/lit-node/lit-node/src/access_control/cosmos.rs index fe1ff529..36597ddb 100644 --- a/rust/lit-node/lit-node/src/access_control/cosmos.rs +++ b/rust/lit-node/lit-node/src/access_control/cosmos.rs @@ -402,19 +402,18 @@ async fn check_return_value( // need to check the type here. because if this is a string, we can concatenate for the "contains" operator. i suppose we shouldn't do that if it's a number. if filtered_vals.len() > 1 && condition.return_value_test.comparator == "contains" + && let serde_json::Value::String(_) = value_to_check { - if let serde_json::Value::String(_) = value_to_check { - // it's a string. concate all items - let mut concatenated_string = String::new(); - for item in filtered_vals { - concatenated_string.push_str( - item.as_str() - .expect_or_err("could not get string from item")?, - ); - concatenated_string.push(' '); - } - value_to_check = serde_json::Value::String(concatenated_string); + // it's a string. concate all items + let mut concatenated_string = String::new(); + for item in filtered_vals { + concatenated_string.push_str( + item.as_str() + .expect_or_err("could not get string from item")?, + ); + concatenated_string.push(' '); } + value_to_check = serde_json::Value::String(concatenated_string); } } } diff --git a/rust/lit-node/lit-node/src/access_control/evm_contract.rs b/rust/lit-node/lit-node/src/access_control/evm_contract.rs index b55740e6..9602ac60 100644 --- a/rust/lit-node/lit-node/src/access_control/evm_contract.rs +++ b/rust/lit-node/lit-node/src/access_control/evm_contract.rs @@ -1,4 +1,4 @@ -use super::{rpc_call, substitute_special_params, validate_boolean_expression}; +use super::{eval_condition, rpc_call, substitute_special_params, validate_boolean_expression}; use crate::auth::auth_material::JsonAuthSigExtendedRef; use crate::error::{EC, Result, conversion_err_code, validation_err, validation_err_code}; use crate::utils::encoding; @@ -345,22 +345,11 @@ fn check_return_value_bool(condition: &EVMContractCondition, returned_value: boo returned_value, condition.return_value_test.comparator, valid_return_value ); - if condition.return_value_test.comparator == ">" { - Ok(returned_value > valid_return_value) - } else if condition.return_value_test.comparator == "<" { - return Ok(returned_value < valid_return_value); - } else if condition.return_value_test.comparator == ">=" { - return Ok(returned_value >= valid_return_value); - } else if condition.return_value_test.comparator == "<=" { - return Ok(returned_value <= valid_return_value); - } else if condition.return_value_test.comparator == "=" { - return Ok(returned_value == valid_return_value); - } else if condition.return_value_test.comparator == "!=" { - return Ok(returned_value != valid_return_value); - } else { - warn!("Error - unsupported return value test comparator"); - return Ok(false); - } + Ok(eval_condition( + &condition.return_value_test.comparator, + returned_value, + valid_return_value, + )) } fn check_return_value_string( @@ -376,24 +365,11 @@ fn check_return_value_string( returned_value, condition.return_value_test.comparator, valid_return_value ); - if condition.return_value_test.comparator == ">" { - Ok(returned_value > valid_return_value) - } else if condition.return_value_test.comparator == "<" { - return Ok(returned_value < valid_return_value); - } else if condition.return_value_test.comparator == ">=" { - return Ok(returned_value >= valid_return_value); - } else if condition.return_value_test.comparator == "<=" { - return Ok(returned_value <= valid_return_value); - } else if condition.return_value_test.comparator == "=" { - return Ok(returned_value == valid_return_value); - } else if condition.return_value_test.comparator == "!=" { - return Ok(returned_value != valid_return_value); - } else if condition.return_value_test.comparator == "contains" { - return Ok(returned_value.contains(&valid_return_value)); - } else { - warn!("Error - unsupported return value test comparator"); - return Ok(false); - } + Ok(eval_condition( + &condition.return_value_test.comparator, + returned_value, + valid_return_value, + )) } // fn check_return_value_int( @@ -447,22 +423,11 @@ fn check_return_value_uint(condition: &EVMContractCondition, returned_value: U25 returned_value, condition.return_value_test.comparator, valid_return_value ); - if condition.return_value_test.comparator == ">" { - Ok(returned_value > valid_return_value) - } else if condition.return_value_test.comparator == "<" { - return Ok(returned_value < valid_return_value); - } else if condition.return_value_test.comparator == ">=" { - return Ok(returned_value >= valid_return_value); - } else if condition.return_value_test.comparator == "<=" { - return Ok(returned_value <= valid_return_value); - } else if condition.return_value_test.comparator == "=" { - return Ok(returned_value == valid_return_value); - } else if condition.return_value_test.comparator == "!=" { - return Ok(returned_value != valid_return_value); - } else { - warn!("Error - unsupported return value test comparator"); - return Ok(false); - } + Ok(eval_condition( + &condition.return_value_test.comparator, + returned_value, + valid_return_value, + )) } async fn check_return_value_addr( @@ -491,20 +456,9 @@ async fn check_return_value_addr( returned_value, condition.return_value_test.comparator, valid_return_value ); - if condition.return_value_test.comparator == ">" { - Ok(returned_value > valid_return_value) - } else if condition.return_value_test.comparator == "<" { - return Ok(returned_value < valid_return_value); - } else if condition.return_value_test.comparator == ">=" { - return Ok(returned_value >= valid_return_value); - } else if condition.return_value_test.comparator == "<=" { - return Ok(returned_value <= valid_return_value); - } else if condition.return_value_test.comparator == "=" { - return Ok(returned_value == valid_return_value); - } else if condition.return_value_test.comparator == "!=" { - return Ok(returned_value != valid_return_value); - } else { - warn!("Error - unsupported return value test comparator"); - return Ok(false); - } + Ok(eval_condition( + &condition.return_value_test.comparator, + returned_value, + valid_return_value, + )) } diff --git a/rust/lit-node/lit-node/src/access_control/mod.rs b/rust/lit-node/lit-node/src/access_control/mod.rs index 3fcb8c9f..7ffa2f9c 100644 --- a/rust/lit-node/lit-node/src/access_control/mod.rs +++ b/rust/lit-node/lit-node/src/access_control/mod.rs @@ -544,10 +544,10 @@ async fn check_condition_via_poap( return Ok(true); } } - return Ok(false); + Ok(false) } else { warn!("Unsupported method for contract ABI: {}", condition.method); - return Ok(false); + Ok(false) } } @@ -861,7 +861,7 @@ async fn check_condition_via_contract_call( Ok(false) } } else if condition.standard_contract_type == "ERC1155" { - return if condition.method == "balanceOf" { + if condition.method == "balanceOf" { let subbed_param = substitute_special_params( &condition.parameters[0], auth_sig, @@ -967,7 +967,7 @@ async fn check_condition_via_contract_call( } else { warn!("Unsupported method for contract ABI"); Ok(false) - }; + } } else if condition.standard_contract_type == "ERC721" { return if condition.method == "ownerOf" { let token_id = match U256::from_dec_str(&condition.parameters[0]) { @@ -1025,7 +1025,7 @@ async fn check_condition_via_contract_call( Ok(false) }; } else if condition.standard_contract_type == "ERC20" { - return if condition.method == "balanceOf" { + if condition.method == "balanceOf" { let subbed_param = substitute_special_params( &condition.parameters[0], auth_sig, @@ -1050,9 +1050,9 @@ async fn check_condition_via_contract_call( } else { warn!("Unsupported method for contract ABI"); Ok(false) - }; + } } else if condition.standard_contract_type == "MolochDAOv2.1" { - return if condition.method == "members" { + if condition.method == "members" { let subbed_param = substitute_special_params( &condition.parameters[0], auth_sig, @@ -1085,9 +1085,9 @@ async fn check_condition_via_contract_call( } else { warn!("Unsupported method for contract ABI"); Ok(false) - }; + } } else if condition.standard_contract_type == "Creaton" { - return if condition.method == "subscribers" { + if condition.method == "subscribers" { let subbed_param = substitute_special_params( &condition.parameters[0], auth_sig, @@ -1114,9 +1114,9 @@ async fn check_condition_via_contract_call( } else { warn!("Unsupported method for contract ABI"); Ok(false) - }; + } } else if condition.standard_contract_type == "ProofOfHumanity" { - return if condition.method == "isRegistered" { + if condition.method == "isRegistered" { let subbed_param = substitute_special_params( &condition.parameters[0], auth_sig, @@ -1141,9 +1141,9 @@ async fn check_condition_via_contract_call( } else { warn!("Unsupported method for contract ABI"); Ok(false) - }; + } } else if condition.standard_contract_type == "CASK" { - return if condition.method == "getActiveSubscriptionCount" { + if condition.method == "getActiveSubscriptionCount" { let subbed_param = substitute_special_params( &condition.parameters[0], auth_sig, @@ -1191,10 +1191,10 @@ async fn check_condition_via_contract_call( } else { warn!("Unsupported method for contract ABI"); Ok(false) - }; + } } else { warn!("Error - unsupported access control condition method on contract."); - return Ok(false); + Ok(false) } } @@ -1218,18 +1218,18 @@ fn check_return_value_bool( if condition.return_value_test.comparator == ">" { Ok(returned_value > valid_return_value) } else if condition.return_value_test.comparator == "<" { - return Ok(returned_value < valid_return_value); + Ok(returned_value < valid_return_value) } else if condition.return_value_test.comparator == ">=" { - return Ok(returned_value >= valid_return_value); + Ok(returned_value >= valid_return_value) } else if condition.return_value_test.comparator == "<=" { - return Ok(returned_value <= valid_return_value); + Ok(returned_value <= valid_return_value) } else if condition.return_value_test.comparator == "=" { - return Ok(returned_value == valid_return_value); + Ok(returned_value == valid_return_value) } else if condition.return_value_test.comparator == "!=" { - return Ok(returned_value != valid_return_value); + Ok(returned_value != valid_return_value) } else { warn!("Error - unsupported return value test comparator"); - return Ok(false); + Ok(false) } } @@ -1258,18 +1258,18 @@ fn check_return_value_int( if condition.return_value_test.comparator == ">" { Ok(returned_value > valid_return_value) } else if condition.return_value_test.comparator == "<" { - return Ok(returned_value < valid_return_value); + Ok(returned_value < valid_return_value) } else if condition.return_value_test.comparator == ">=" { - return Ok(returned_value >= valid_return_value); + Ok(returned_value >= valid_return_value) } else if condition.return_value_test.comparator == "<=" { - return Ok(returned_value <= valid_return_value); + Ok(returned_value <= valid_return_value) } else if condition.return_value_test.comparator == "=" { - return Ok(returned_value == valid_return_value); + Ok(returned_value == valid_return_value) } else if condition.return_value_test.comparator == "!=" { - return Ok(returned_value != valid_return_value); + Ok(returned_value != valid_return_value) } else { warn!("Error - unsupported return value test comparator"); - return Ok(false); + Ok(false) } } @@ -1300,16 +1300,16 @@ async fn check_return_value_addr( if condition.return_value_test.comparator == ">" { Ok(returned_value > valid_return_value) } else if condition.return_value_test.comparator == "<" { - return Ok(returned_value < valid_return_value); + Ok(returned_value < valid_return_value) } else if condition.return_value_test.comparator == ">=" { - return Ok(returned_value >= valid_return_value); + Ok(returned_value >= valid_return_value) } else if condition.return_value_test.comparator == "<=" { - return Ok(returned_value <= valid_return_value); + Ok(returned_value <= valid_return_value) } else if condition.return_value_test.comparator == "=" { - return Ok(returned_value == valid_return_value); + Ok(returned_value == valid_return_value) } else { warn!("Error - unsupported return value test comparator"); - return Ok(false); + Ok(false) } } @@ -1328,22 +1328,22 @@ fn check_return_value_str( if condition.return_value_test.comparator == ">" { Ok(returned_value > valid_return_value) } else if condition.return_value_test.comparator == "<" { - return Ok(returned_value < valid_return_value); + Ok(returned_value < valid_return_value) } else if condition.return_value_test.comparator == ">=" { - return Ok(returned_value >= valid_return_value); + Ok(returned_value >= valid_return_value) } else if condition.return_value_test.comparator == "<=" { - return Ok(returned_value <= valid_return_value); + Ok(returned_value <= valid_return_value) } else if condition.return_value_test.comparator == "=" { - return Ok(returned_value == valid_return_value); + Ok(returned_value == valid_return_value) } else if condition.return_value_test.comparator == "!=" { - return Ok(returned_value != valid_return_value); + Ok(returned_value != valid_return_value) } else if condition.return_value_test.comparator == "contains" { - return Ok(returned_value.contains(&valid_return_value)); + Ok(returned_value.contains(&valid_return_value)) } else if condition.return_value_test.comparator == "!contains" { - return Ok(!returned_value.contains(&valid_return_value)); + Ok(!returned_value.contains(&valid_return_value)) } else { warn!("Error - unsupported return value test comparator"); - return Ok(false); + Ok(false) } } @@ -1363,10 +1363,10 @@ fn check_return_value_array( if condition.return_value_test.comparator == "contains" { Ok(returned_values.contains(&valid_return_value)) } else if condition.return_value_test.comparator == "!contains" { - return Ok(!returned_values.contains(&valid_return_value)); + Ok(!returned_values.contains(&valid_return_value)) } else { warn!("Error - unsupported return value test comparator"); - return Ok(false); + Ok(false) } } @@ -1554,3 +1554,25 @@ mod tests { ])); } } + +pub(crate) fn eval_condition

(comparator: &str, returned_value: P, valid_return_value: P) -> bool +where + P: Sized + Ord + PartialOrd + Eq + PartialEq, +{ + if comparator == ">" { + returned_value > valid_return_value + } else if comparator == "<" { + returned_value < valid_return_value + } else if comparator == ">=" { + returned_value >= valid_return_value + } else if comparator == "<=" { + returned_value <= valid_return_value + } else if comparator == "=" { + returned_value == valid_return_value + } else if comparator == "!=" { + returned_value != valid_return_value + } else { + warn!("Error - unsupported return value test comparator"); + false + } +} diff --git a/rust/lit-node/lit-node/src/access_control/sol_rpc.rs b/rust/lit-node/lit-node/src/access_control/sol_rpc.rs index 5aed85ff..a4b5ad6b 100644 --- a/rust/lit-node/lit-node/src/access_control/sol_rpc.rs +++ b/rust/lit-node/lit-node/src/access_control/sol_rpc.rs @@ -19,7 +19,7 @@ use std::collections::HashMap; use std::result::Result as StdResult; use std::str::FromStr; -use super::{substitute_special_params, validate_boolean_expression}; +use super::{eval_condition, substitute_special_params, validate_boolean_expression}; const VALID_CHAIN_NAMES: [&str; 3] = ["solana", "solanaDevnet", "solanaTestnet"]; @@ -468,22 +468,11 @@ fn check_return_value_uint(condition: &SolRpcConditionV2, returned_value: u64) - returned_value, condition.return_value_test.comparator, valid_return_value ); - if condition.return_value_test.comparator == ">" { - Ok(returned_value > valid_return_value) - } else if condition.return_value_test.comparator == "<" { - return Ok(returned_value < valid_return_value); - } else if condition.return_value_test.comparator == ">=" { - return Ok(returned_value >= valid_return_value); - } else if condition.return_value_test.comparator == "<=" { - return Ok(returned_value <= valid_return_value); - } else if condition.return_value_test.comparator == "=" { - return Ok(returned_value == valid_return_value); - } else if condition.return_value_test.comparator == "!=" { - return Ok(returned_value != valid_return_value); - } else { - warn!("Error - unsupported return value test comparator"); - return Ok(false); - } + Ok(eval_condition( + &condition.return_value_test.comparator, + returned_value, + valid_return_value, + )) } async fn check_return_value_string( @@ -511,18 +500,18 @@ async fn check_return_value_string( if condition.return_value_test.comparator == ">" { Ok(returned_value > valid_return_value) } else if condition.return_value_test.comparator == "<" { - return Ok(returned_value < valid_return_value); + Ok(returned_value < valid_return_value) } else if condition.return_value_test.comparator == ">=" { - return Ok(returned_value >= valid_return_value); + Ok(returned_value >= valid_return_value) } else if condition.return_value_test.comparator == "<=" { - return Ok(returned_value <= valid_return_value); + Ok(returned_value <= valid_return_value) } else if condition.return_value_test.comparator == "=" { - return Ok(returned_value == valid_return_value); + Ok(returned_value == valid_return_value) } else if condition.return_value_test.comparator == "!=" { - return Ok(returned_value != valid_return_value); + Ok(returned_value != valid_return_value) } else { warn!("Error - unsupported return value test comparator"); - return Ok(false); + Ok(false) } } @@ -596,10 +585,11 @@ fn check_balance_of_metaplex_collection( .to_string(); let metadata_result = get_metaplex_metadata(condition, token_address.clone()); if let Ok(metadata) = metadata_result { - if let Some(collection) = metadata.collection { - if collection.verified && collection.key == collection_address { - verified_token_count += 1; - } + if let Some(collection) = metadata.collection + && collection.verified + && collection.key == collection_address + { + verified_token_count += 1; } } else { debug!("Could not get metadata for {} - skipping", token_address); @@ -748,11 +738,11 @@ async fn check_balance_of_token( message, data, }) = &err.kind + && *code == -32602 + && message == "Invalid param: could not find account" { - if *code == -32602 && message == "Invalid param: could not find account" { - // the balance is zero, we couldn't find the acct. return false. - return Ok(false); - } + // the balance is zero, we couldn't find the acct. return false. + return Ok(false); } Err(validation_err_code( diff --git a/rust/lit-node/lit-node/src/auth/capabilities/recap.rs b/rust/lit-node/lit-node/src/auth/capabilities/recap.rs index 34dbd548..8b737b5c 100644 --- a/rust/lit-node/lit-node/src/auth/capabilities/recap.rs +++ b/rust/lit-node/lit-node/src/auth/capabilities/recap.rs @@ -35,17 +35,17 @@ pub fn extract_and_verify_all_capabilities( // i do not understand how this verifies it // but it's what the siwe-recap crate does let expected = capability.to_statement(); - if let Some(statement) = &siwe_message.statement { - if !statement.ends_with(&expected) { - return Err(parser_err_code( - format!( - "Incorrect statement for capability object: expected '{}', got '{}'", - expected, statement - ), - EC::NodeSIWECapabilityInvalid, - None, - )); - } + if let Some(statement) = &siwe_message.statement + && !statement.ends_with(&expected) + { + return Err(parser_err_code( + format!( + "Incorrect statement for capability object: expected '{}', got '{}'", + expected, statement + ), + EC::NodeSIWECapabilityInvalid, + None, + )); } } diff --git a/rust/lit-node/lit-node/src/auth/validators/siwe.rs b/rust/lit-node/lit-node/src/auth/validators/siwe.rs index 5ab8a296..dd50d80f 100644 --- a/rust/lit-node/lit-node/src/auth/validators/siwe.rs +++ b/rust/lit-node/lit-node/src/auth/validators/siwe.rs @@ -1,5 +1,5 @@ -use blsful::Bls12381G2Impl; use ethers::types::Address; +use lit_rust_crypto::blsful::{Bls12381G2Impl, PublicKey, Signature}; use rocket::time::OffsetDateTime; use siwe::{Message, VerificationOpts}; use tracing::debug; @@ -122,10 +122,10 @@ impl CapabilityAuthSigValidator for SiweValidator { }; let signed_data = siwe_hash_to_bls_session_hash(siwe_hash.into()); - let signature: blsful::Signature = serde_json::from_str(&auth_sig.sig) + let signature: Signature = serde_json::from_str(&auth_sig.sig) .map_err(|err| parser_err_code(err, EC::NodeSIWESigConversionError, None))?; - let bls_root_key = blsful::PublicKey::::try_from( + let bls_root_key = PublicKey::::try_from( &hex::decode(bls_root_pubkey).expect("Failed to decode root key"), ) .expect("Failed to convert bls public key from bytes"); @@ -257,10 +257,10 @@ impl SessionSigAuthSigValidator for SiweValidator { }; let signed_data = siwe_hash_to_bls_session_hash(siwe_hash.into()); - let signature: blsful::Signature = serde_json::from_str(&auth_sig.sig) + let signature: Signature = serde_json::from_str(&auth_sig.sig) .map_err(|err| parser_err_code(err, EC::NodeSIWESigConversionError, None))?; - let bls_root_key = blsful::PublicKey::::try_from( + let bls_root_key = PublicKey::::try_from( &hex::decode(bls_root_pubkey).expect("Failed to decode root key"), ) .expect("Failed to convert bls public key from bytes"); diff --git a/rust/lit-node/lit-node/src/common/key_helper.rs b/rust/lit-node/lit-node/src/common/key_helper.rs index 0328b69b..6db0f4e6 100644 --- a/rust/lit-node/lit-node/src/common/key_helper.rs +++ b/rust/lit-node/lit-node/src/common/key_helper.rs @@ -65,8 +65,9 @@ impl Default for KeyCache { impl Debug for KeyCache { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { let mut entries = Vec::with_capacity(self.0.len()); - self.0.scan(|key, value| { + self.0.iter_sync(|key, value| { entries.push(key.clone()); + true }); write!(f, "KeyCache {{ {:#?} }}", entries) } @@ -75,8 +76,9 @@ impl Debug for KeyCache { impl Display for KeyCache { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { let mut entries = Vec::with_capacity(self.0.len()); - self.0.scan(|key, value| { + self.0.iter_sync(|key, value| { entries.push(key.clone()); + true }); write!(f, "KeyCache {{ {} }}", entries.join(", ")) } diff --git a/rust/lit-node/lit-node/src/config/chain.rs b/rust/lit-node/lit-node/src/config/chain.rs index a3885160..d8c222d7 100644 --- a/rust/lit-node/lit-node/src/config/chain.rs +++ b/rust/lit-node/lit-node/src/config/chain.rs @@ -10,14 +10,16 @@ use moka::future::Cache; use rocket::serde::{Deserialize, Serialize}; use sdd::AtomicShared; use sha2::{Digest, Sha256}; -use std::collections::{HashMap, HashSet}; +use std::collections::{BTreeMap, HashMap, HashSet}; use std::sync::Arc; use std::time::Duration; use tokio::sync::mpsc; use tracing::{Instrument, debug_span, info, instrument, trace, warn}; -use crate::error::{EC, Result, blockchain_err, conversion_err, io_err, unexpected_err_code}; -use crate::models::PeerValidator; +use crate::error::{ + EC, Result, blockchain_err, conversion_err, io_err, unexpected_err, unexpected_err_code, +}; +use crate::models::{KeySetConfig, PeerValidator}; use crate::payment::dynamic::{LitActionPriceConfig, NodePriceMeasurement}; use crate::payment::payed_endpoint::PayedEndpoint; use crate::peers::peer_reviewer::MAX_COMPLAINT_REASON_VALUE; @@ -46,13 +48,13 @@ impl std::fmt::Display for PeerGroupEpoch { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct GenericConfig { pub token_reward_per_token_per_epoch: u64, - pub key_types: Vec, pub minimum_validator_count: u64, pub max_presign_count: u64, pub min_presign_count: u64, pub peer_checking_interval_secs: u64, pub max_presign_concurrency: u64, pub rpc_healthcheck_enabled: bool, + pub default_key_set: Option, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] @@ -104,10 +106,10 @@ pub struct ChainDataConfigManager { pub peers: PeersByRealm, pub shadow_peers: PeersByRealm, pub realm_id: AtomicShared, + pub key_sets: AtomicShared>, pub shadow_realm_id: AtomicShared, pub staker_address: AtomicShared

, pub config: ReloadableLitConfig, - pub root_keys: AtomicShared>, pub generic_config: AtomicShared, pub actions_config: AtomicShared, pub complaint_reason_to_config: Cache, @@ -167,17 +169,17 @@ impl ChainDataConfigManager { realm_id: AtomicShared::new(U256::from(0)), staker_address: AtomicShared::new(Address::zero()), shadow_realm_id: AtomicShared::new(U256::from(0)), + key_sets: AtomicShared::new(BTreeMap::new()), config, - root_keys: AtomicShared::new(Vec::new()), generic_config: AtomicShared::new(GenericConfig { token_reward_per_token_per_epoch: 0, - key_types: Vec::new(), minimum_validator_count: 2, - max_presign_count: 0, - min_presign_count: 0, + max_presign_count: 25, + min_presign_count: 10, peer_checking_interval_secs: 5, max_presign_concurrency: 2, rpc_healthcheck_enabled: false, + default_key_set: None, }), actions_config: AtomicShared::new(ActionsConfig { timeout_ms: 30000, @@ -237,7 +239,7 @@ impl ChainDataConfigManager { warn!("Error setting peer and epoch config: {e:?}"); } - let res = self.set_root_keys_from_chain().await; + let res = self.set_key_sets_from_chain().await; if let Err(e) = res { warn!("Error setting root pubkeys from chain: {e:?}"); } @@ -279,50 +281,68 @@ impl ChainDataConfigManager { } #[instrument(level = "debug", skip_all)] - pub(crate) async fn set_root_keys_from_chain(&self) -> Result<()> { + pub(crate) async fn set_key_sets_from_chain(&self) -> Result<()> { + let Some(realm_id) = self.get_realm_id() else { + return Err(unexpected_err("realm_id needs to be set", None)); + }; let (config, contract_resolver) = self.get_config_with_resolver()?; let staking_contract = contract_resolver.staking_contract(&config).await?; + + let block_chain_key_sets = + staking_contract.key_sets().call().await.map_err(|e| { + blockchain_err(e, Some("Unable to get key sets from contract".into())) + })?; let staking_contract_address = staking_contract.address(); let contract = contract_resolver.pub_key_router_contract(&config).await?; - let root_keys: Vec = contract - .get_root_keys( - staking_contract_address, - crate::tss::util::DEFAULT_KEY_SET_NAME.to_string(), - ) - .call() - .await - .map_err(|e| blockchain_err(e, Some("Unable to get root keys from contract".into())))?; - - let mut cache = Vec::with_capacity(root_keys.len()); - for k in root_keys.into_iter() { - cache.push(CachedRootKey { - public_key: bytes_to_hex(&k.pubkey), - curve_type: CurveType::try_from(k.key_type).map_err(|e| io_err(e, None))?, - }); + let mut key_sets = BTreeMap::new(); + for key_set_config in block_chain_key_sets { + trace!("Fetching root keys for key set: {:?}", key_set_config); + let root_keys = contract + .get_root_keys(staking_contract_address, key_set_config.identifier.clone()) + .call() + .await + .map_err(|e| { + let revert = decode_revert(&e, contract.abi()); + blockchain_err( + e, + Some(format!("Unable to get root keys from contract: {}", revert)), + ) + })?; + let mut key_set = KeySetConfig::try_from(key_set_config)?; + for k in root_keys.into_iter() { + let curve_type = CurveType::try_from(k.key_type).map_err(|e| io_err(e, None))?; + let public_key = bytes_to_hex(&k.pubkey); + let public_key_clone = public_key.clone(); + key_set + .root_keys_by_curve + .entry(curve_type) + .and_modify(|pubkeys| pubkeys.push(public_key)) + .or_insert_with(|| vec![public_key_clone]); + } + let entry = key_sets.entry(key_set.identifier.clone()); + let key_set_clone = key_set.clone(); + entry.and_modify(|v| *v = key_set).or_insert(key_set_clone); } - DataVersionWriter::store(&self.root_keys, cache); + DataVersionWriter::store(&self.key_sets, key_sets); + Ok(()) } pub fn get_realm_id(&self) -> Option { - let realm_id = DataVersionReader::new(&self.realm_id).map(|r| *r); - if realm_id == Some(U256::zero()) { + let realm_id = DataVersionReader::new(&self.realm_id).map(|r| *r)?; + if realm_id.is_zero() { return None; } - realm_id + Some(realm_id) } pub fn get_shadow_realm_id(&self) -> Option { - let realm_id = DataVersionReader::new(&self.shadow_realm_id).map(|r| *r); - if realm_id == Some(U256::zero()) { + let realm_id = DataVersionReader::new(&self.shadow_realm_id).map(|r| *r)?; + if realm_id.is_zero() { return None; } - realm_id - } - - pub fn root_keys(&self) -> Vec { - DataVersionReader::new_unchecked(&self.root_keys).clone() + Some(realm_id) } pub fn get_actions_config(&self) -> ActionsConfig { @@ -348,30 +368,17 @@ impl ChainDataConfigManager { DataVersionWriter::store(&self.staker_address, my_staker_address); let realm_id = staking - .get_realm_id_for_staker_address(my_staker_address) - .call() - .await - .map_err(|e| { - blockchain_err( - decode_revert(&e, staking.abi()), - Some("Unable to contact chain to get realm id for node in the current/next epoch".into()), - ) - }); - - let realm_id = match realm_id { - Ok(realm_id) => realm_id, - Err(e) => { - return Err(blockchain_err( - anyhow::Error::msg(format!( - "Unable to get realm id for node with staker {:?} in the current/next epoch", - my_staker_address - )), - None, - )); - } - }; + .get_realm_id_for_staker_address(my_staker_address) + .call() + .await + .map_err(|e| { + blockchain_err( + decode_revert(&e, staking.abi()), + Some(format!("Unable to contact chain to get realm id for node with staker {:?} in the current/next epoch", my_staker_address)), + ) + })?; - if realm_id == U256::zero() { + if realm_id.is_zero() { // return an error if the realm id is zero return Err(blockchain_err( anyhow::Error::msg( @@ -391,7 +398,7 @@ impl ChainDataConfigManager { let shadow_realm_id = shadow_realm_id.unwrap_or_else(|e| U256::from(0)); - if shadow_realm_id != U256::zero() { + if !shadow_realm_id.is_zero() { DataVersionWriter::store(&self.shadow_realm_id, shadow_realm_id); } @@ -411,7 +418,7 @@ impl ChainDataConfigManager { trace!("set_peer_and_epoch_data_from_chain"); - if realm_id != U256::from(0) { + if !realm_id.is_zero() { self.set_peers_and_epoch_data_from_chain_by_realm(realm_id, &self.peers) .await?; } @@ -430,12 +437,8 @@ impl ChainDataConfigManager { trace!("set_dynamic_payment_config_from_chain()"); let configs = self.get_lit_action_price_configs().await?; + DataVersionWriter::store(&self.dynamic_lit_action_price_configs, configs); - let mut dynamic_payment_config = - DataVersionWriter::new_unchecked(&self.dynamic_lit_action_price_configs); - dynamic_payment_config.clear(); - dynamic_payment_config.extend(configs.into_iter()); - dynamic_payment_config.commit(); Ok(()) } @@ -630,11 +633,6 @@ impl ChainDataConfigManager { .token_reward_per_token_per_epoch .as_u64(); - let key_types = staking_contract_config - .key_types - .iter() - .map(|k| CurveType::try_from(*k).expect("Key Types in Staking Config should be valid.")) - .collect::>(); let minimum_validator_count = staking_contract_config.minimum_validator_count.as_u64(); let realm_config = contract.realm_config(realm_id).call().await.map_err(|e| { @@ -646,15 +644,20 @@ impl ChainDataConfigManager { let peer_checking_interval_secs = realm_config.peer_checking_interval_secs.as_u64(); let max_presign_concurrency = realm_config.max_presign_concurrency.as_u64(); let rpc_healthcheck_enabled = realm_config.rpc_healthcheck_enabled; + let default_key_set = if realm_config.default_key_set.is_empty() { + None + } else { + Some(realm_config.default_key_set) + }; let mut generic_config = DataVersionWriter::new_unchecked(&self.generic_config); - generic_config.key_types = key_types; generic_config.minimum_validator_count = minimum_validator_count; generic_config.max_presign_count = max_presign_count; generic_config.min_presign_count = min_presign_count; generic_config.peer_checking_interval_secs = peer_checking_interval_secs; generic_config.max_presign_concurrency = max_presign_concurrency; generic_config.rpc_healthcheck_enabled = rpc_healthcheck_enabled; + generic_config.default_key_set = default_key_set; let lit_actions_config = contract @@ -813,7 +816,7 @@ impl ChainDataConfigManager { current_or_next: PeerGroupEpoch, realm_id: U256, ) -> Result> { - if realm_id == U256::from(0) { + if realm_id.is_zero() { return Ok(vec![]); } @@ -922,7 +925,7 @@ impl ChainDataConfigManager { peer_validators } - async fn update_validator_versions(&self, peer_validators: &mut Vec) { + async fn update_validator_versions(&self, peer_validators: &mut [PeerValidator]) { let (tx, rx) = flume::bounded(1); match self diff --git a/rust/lit-node/lit-node/src/endpoints/admin/endpoints.rs b/rust/lit-node/lit-node/src/endpoints/admin/endpoints.rs index 86ae6707..94534e21 100644 --- a/rust/lit-node/lit-node/src/endpoints/admin/endpoints.rs +++ b/rust/lit-node/lit-node/src/endpoints/admin/endpoints.rs @@ -8,6 +8,7 @@ use crate::tss::common::restore::{NodeRecoveryStatus, RestoreState, report_progr use crate::auth::auth_material::JsonAuthSigExtended; use crate::tss::common::tss_state::TssState; +use crate::version::DataVersionReader; use chrono::{DateTime, Utc}; use lit_api_core::error::ApiError; use lit_blockchain::resolver::rpc::config::{RPC_CONFIG_PROTECTED_CHAINS, RpcConfig}; @@ -257,13 +258,33 @@ pub async fn admin_get_key_backup( Ok(peer) => peer, Err(e) => return Err(e.handle()), }; - let root_keys = tss_state.chain_data_config_manager.root_keys(); + let default_key_set = DataVersionReader::read_field_unchecked( + &tss_state.chain_data_config_manager.generic_config, + |generic_config| generic_config.default_key_set.clone(), + ); + let key_set_root_keys = DataVersionReader::read_field_unchecked( + &tss_state.chain_data_config_manager.key_sets, + |key_sets| match &default_key_set { + Some(id) => match key_sets.get(id) { + Some(key_set) => Ok(key_set.root_keys_by_curve.clone()), + None => Err( + unexpected_err(format!("No key set root keys exist for {}", id), None).handle(), + ), + }, + None => match key_sets.first_key_value() { + Some((_id, key_set)) => Ok(key_set.root_keys_by_curve.clone()), + None => { + Err(unexpected_err("No key sets exist for backup".to_string(), None).handle()) + } + }, + }, + )?; // Zip up and encrypt. match encrypt_and_tar_backup_keys( cfg, self_peer.peer_id, - &root_keys, + &key_set_root_keys, &blinders, &recovery_party, &peers, diff --git a/rust/lit-node/lit-node/src/endpoints/admin/utils.rs b/rust/lit-node/lit-node/src/endpoints/admin/utils.rs index b895b461..3c4e6aeb 100644 --- a/rust/lit-node/lit-node/src/endpoints/admin/utils.rs +++ b/rust/lit-node/lit-node/src/endpoints/admin/utils.rs @@ -14,17 +14,21 @@ use crate::tss::common::storage::{ }; use async_std::fs; use async_std::path::{Path, PathBuf}; -use blsful::inner_types::{G1Projective, GroupEncoding, InnerBls12381G1}; use bulletproofs::BulletproofCurveArithmetic as BCA; use chrono::{DateTime, Utc}; -use elliptic_curve::Group; use k256::Secp256k1; use lit_core::config::LitConfig; use lit_core::error::Unexpected; use lit_node_common::config::{LitNodeConfig, encrypted_key_path}; -use lit_node_core::CurveType; -use lit_node_core::JsonAuthSig; +use lit_node_core::{CurveType, JsonAuthSig}; use lit_recovery::models::{EncryptedKeyShare, OldEncryptedKeyShare}; +use lit_rust_crypto::{ + blsful::inner_types::{G1Projective, GroupEncoding, InnerBls12381G1}, + decaf377, ed448_goldilocks, + elliptic_curve::ScalarPrimitive, + group::Group, + jubjub, k256, p256, p384, pallas, vsss_rs, +}; use std::collections::HashMap; use std::sync::Arc; use tokio::io::{AsyncRead, AsyncReadExt}; @@ -32,7 +36,6 @@ use tokio::process::Command; use tokio_stream::StreamExt; use tracing::trace; -use crate::config::chain::CachedRootKey; use crate::endpoints::auth_sig::{LITNODE_ADMIN_RES, check_auth_sig}; use crate::error::{EC, Result, io_err, io_err_code, unexpected_err}; use crate::peers::peer_state::models::SimplePeerCollection; @@ -69,7 +72,7 @@ fn blinder_comm_fn(curve_type: CurveType) -> String { pub(crate) async fn encrypt_and_tar_backup_keys( cfg: Arc, peer_id: PeerId, - root_keys: &[CachedRootKey], + key_set_root_keys: &HashMap>, blinders: &Blinders, recovery_party: &RecoveryParty, peers: &SimplePeerCollection, @@ -114,17 +117,10 @@ pub(crate) async fn encrypt_and_tar_backup_keys( let key_cache = KeyCache::default(); let mut tasks = tokio::task::JoinSet::new(); - let mut root_keys_map = HashMap::with_capacity(root_keys.len()); - for root_key in root_keys { - root_keys_map - .entry(root_key.curve_type) - .and_modify(|v: &mut Vec| v.push(root_key.public_key.clone())) - .or_insert(vec![root_key.public_key.clone()]); - } let write_curve_recovery_data_args = Arc::new(WriteCurveRecoveryDataArgs { cfg: cfg.clone(), peer_id, - root_keys: root_keys_map, + root_keys: key_set_root_keys.clone(), epoch, staker_address: staker_address.clone(), peers: peers.clone(), @@ -291,6 +287,22 @@ pub(crate) async fn encrypt_and_tar_backup_keys( .await }); + let args = write_curve_recovery_data_args.clone(); + let pallas_encryption_key = recovery_party.pallas_encryption_key; + let pallas_blinder = blinders + .pallas_blinder + .ok_or(blinder_not_set_err(CurveType::RedPallas))?; + tasks.spawn(async move { + write_curve_recovery_data::( + args, + CurveType::RedPallas, + &pallas_encryption_key, + &pallas_blinder, + &(pallas::Point::generator() * pallas_blinder), + ) + .await + }); + while let Some(result) = tasks.join_next().await { match result { Ok(Ok(())) => {} @@ -436,11 +448,24 @@ pub(crate) async fn untar_keys_stream( let threshold = read_from_disk(path.clone(), RECOVERY_PARTY_THRESHOLD_FN).await?; trace!("Threshold: {:?}", threshold); + let session_id: String = read_from_disk(path.clone(), SESSION_ID_FN).await?; + trace!( + "Session id: backup {}, key_set {}", + session_id, + restore_state.get_expected_recovery_session_id() + ); + + let peers: Result = read_from_disk(path.clone(), PEERS_FN).await; + if let Ok(peers) = peers { + // Might be missing for legacy reasons + trace!("Peers: {:?}", peers); + } + let bls_recovery_data = read_curve_recovery_data::( blinders.bls_blinder, G1Projective::GENERATOR, CurveType::BLS, - &path.clone(), + &path, &key_cache, ) .await?; @@ -449,7 +474,7 @@ pub(crate) async fn untar_keys_stream( blinders.k256_blinder, k256::ProjectivePoint::GENERATOR, CurveType::K256, - &path.clone(), + &path, &key_cache, ) .await?; @@ -458,7 +483,7 @@ pub(crate) async fn untar_keys_stream( blinders.p256_blinder, p256::ProjectivePoint::GENERATOR, CurveType::P256, - &path.clone(), + &path, &key_cache, ) .await?; @@ -467,7 +492,7 @@ pub(crate) async fn untar_keys_stream( blinders.p384_blinder, p384::ProjectivePoint::GENERATOR, CurveType::P384, - &path.clone(), + &path, &key_cache, ) .await?; @@ -476,7 +501,7 @@ pub(crate) async fn untar_keys_stream( blinders.ed25519_blinder, vsss_rs::curve25519::WrappedEdwards::generator(), CurveType::Ed25519, - &path.clone(), + &path, &key_cache, ) .await?; @@ -485,7 +510,7 @@ pub(crate) async fn untar_keys_stream( blinders.ristretto25519_blinder, vsss_rs::curve25519::WrappedRistretto::generator(), CurveType::Ristretto25519, - &path.clone(), + &path, &key_cache, ) .await?; @@ -494,7 +519,7 @@ pub(crate) async fn untar_keys_stream( blinders.ed448_blinder, ed448_goldilocks::EdwardsPoint::GENERATOR, CurveType::Ed448, - &path.clone(), + &path, &key_cache, ) .await?; @@ -503,7 +528,16 @@ pub(crate) async fn untar_keys_stream( blinders.jubjub_blinder, jubjub::SubgroupPoint::generator(), CurveType::RedJubjub, - &path.clone(), + &path, + &key_cache, + ) + .await?; + + let pallas_recovery_data = read_curve_recovery_data::( + blinders.pallas_blinder, + pallas::Point::generator(), + CurveType::RedPallas, + &path, &key_cache, ) .await?; @@ -538,8 +572,10 @@ pub(crate) async fn untar_keys_stream( jubjub_recovery_data, decaf377_recovery_data, bls12381g1_recovery_data, + pallas_recovery_data, threshold, restored_key_cache: KeyCache::default(), + use_raw_peer_ids: false, }; restore_state.load_backup(inner_state).await?; @@ -825,10 +861,10 @@ fn parse_bls_blinder(blinder_str: &str) -> Result<::Scal match blinder.into_option() { Some(blinder) => Ok(blinder), None => Err(parser_err( - std::io::Error::new( - std::io::ErrorKind::Other, - format!("Could not convert to bls key blinder:{}", blinder_str), - ), + std::io::Error::other(format!( + "Could not convert to bls key blinder:{}", + blinder_str + )), None, )), } @@ -839,24 +875,22 @@ fn parse_k256_blinder(blinder_str: &str) -> Result<::Scalar> { // This is the error closure so we don't repeat it in the code. let error = |blinder_str| { parser_err( - std::io::Error::new( - std::io::ErrorKind::Other, - format!("Could not convert to ecdsa key blinder:{}", blinder_str), - ), + std::io::Error::other(format!( + "Could not convert to ecdsa key blinder:{}", + blinder_str + )), None, ) }; let bytes = hex::decode(blinder_str).map_err(|e| error(blinder_str))?; - let scalar_primitive = elliptic_curve::scalar::ScalarPrimitive::from_slice(&bytes) - .map_err(|e| error(blinder_str))?; + let scalar_primitive = ScalarPrimitive::from_slice(&bytes).map_err(|e| error(blinder_str))?; Ok(k256::Scalar::from(&scalar_primitive)) } #[cfg(test)] mod test { use crate::common::key_helper::KeyCache; - use crate::config::chain::CachedRootKey; use crate::endpoints::admin::utils::{encrypt_and_tar_backup_keys, untar_keys_stream}; use crate::peers::peer_state::models::{SimplePeer, SimplePeerCollection}; use crate::tests::key_shares::{ @@ -873,21 +907,26 @@ mod test { use crate::tss::common::storage::{ read_key_share_from_disk, write_key_share_commitments_to_disk, write_key_share_to_disk, }; - use blsful::{ - Bls12381G1Impl, SecretKeyShare, - inner_types::{G1Projective, InnerBls12381G1}, - }; use bulletproofs::BulletproofCurveArithmetic as BCA; - use elliptic_curve::{Field, Group, PrimeField}; - use k256::{ProjectivePoint, PublicKey, Secp256k1}; - use lit_node_core::CurveType; - use lit_node_core::PeerId; + use lit_node_core::{CurveType, PeerId}; use lit_recovery::models::{EncryptedKeyShare, UploadedShareData}; + use lit_rust_crypto::vsss_rs::{DefaultShare, IdentifierPrimeField, ValuePrimeField}; + use lit_rust_crypto::{ + blsful::{ + Bls12381G1Impl, SecretKeyShare, + inner_types::{G1Projective, InnerBls12381G1}, + }, + decaf377, ed448_goldilocks, + ff::{Field, PrimeField}, + group::Group, + jubjub, + k256::{FieldBytes, ProjectivePoint, PublicKey, Scalar, Secp256k1}, + p256, p384, pallas, vsss_rs, + }; use semver::Version; use std::sync::Arc; use tokio::fs; use verifiable_share_encryption::DecryptionShare; - use vsss_rs::{DefaultShare, IdentifierPrimeField, ValuePrimeField}; #[tokio::test] async fn run_backup_tests() { @@ -895,8 +934,7 @@ mod test { test_untar_old_backup().await; } - type K256Share = - DefaultShare, ValuePrimeField>; + type K256Share = DefaultShare, ValuePrimeField>; #[cfg(any(feature = "testing", test))] pub fn get_test_recovery_party() -> RecoveryParty { @@ -904,7 +942,7 @@ mod test { let mut rng = rand_core::OsRng; let bls_encryption_key = ::Point::generator() * ::Scalar::random(&mut rng); - let k256_encryption_key = k256::ProjectivePoint::GENERATOR * k256::Scalar::random(&mut rng); + let k256_encryption_key = ProjectivePoint::GENERATOR * Scalar::random(&mut rng); let p256_encryption_key = p256::ProjectivePoint::GENERATOR * p256::Scalar::random(&mut rng); let p384_encryption_key = p384::ProjectivePoint::GENERATOR * p384::Scalar::random(&mut rng); let ed25519_encryption_key = vsss_rs::curve25519::WrappedEdwards::generator() @@ -918,6 +956,7 @@ mod test { let decaf377_encryption_key = decaf377::Element::GENERATOR * decaf377::Fr::random(&mut rng); let bls12381g1_encryption_key = G1Projective::GENERATOR * ::Scalar::random(&mut rng); + let pallas_encryption_key = pallas::Point::generator() * pallas::Scalar::random(&mut rng); // Mock recovery party members let mut party_members = vec![]; @@ -938,6 +977,7 @@ mod test { jubjub_encryption_key, decaf377_encryption_key, bls12381g1_encryption_key, + pallas_encryption_key, threshold: 2, } } @@ -965,13 +1005,18 @@ mod test { .expect("Failed to get staker address"); let bls_key_helper = KeyPersistence::::new(CurveType::BLS); let k256_key_helper = KeyPersistence::::new(CurveType::K256); + let recovery_party = get_test_recovery_party_with_encryption_keys(); + let key_set_root_keys = maplit::hashmap! { + CurveType::BLS => vec!["83fc126ef56547bb28734a4a5393a873b8c22a9ba2d507036285a506567b2b3a376fc524cd589bb018613e24c51ebbae".to_string()], + CurveType::K256 => vec!["0268c27a16f03d19949f0a64d58c71ea32049b754888211cc25827f5449d26bf74".to_string()], + }; // Make sure that there is at least one ECDSA and one BLS key share. let bls_key: KeyShare = serde_json::from_str(TEST_BLS_KEY_SHARE).unwrap(); let k256_key: KeyShare = serde_json::from_str(TEST_ECDSA_KEY_SHARE).unwrap(); let bls_key_share_commitments: KeyShareCommitments<::Point> = serde_json::from_str(TEST_BLS_KEY_SHARE_COMMITMENT).unwrap(); - let k256_key_share_commitments: KeyShareCommitments = + let k256_key_share_commitments: KeyShareCommitments = serde_json::from_str(TEST_ECDSA_KEY_SHARE_COMMITMENT).unwrap(); // Make sure the key shares and key share commitments match @@ -984,7 +1029,7 @@ mod test { ) .unwrap(); - verify_decrypted_key_share::( + verify_decrypted_key_share::( k256_key_helper .secret_from_hex(&k256_key.hex_private_share) .unwrap(), @@ -1047,17 +1092,6 @@ mod test { // Call the function to be tested let blinders = RestoreState::generate_blinders(); - let recovery_party = get_test_recovery_party_with_encryption_keys(); - let root_keys = vec![ - CachedRootKey { - public_key: bls_key.hex_public_key.clone(), - curve_type: CurveType::BLS, - }, - CachedRootKey { - public_key: k256_key.hex_public_key.clone(), - curve_type: CurveType::K256, - }, - ]; let peers = SimplePeerCollection(vec![SimplePeer { socket_address: "127.0.0.1".to_string(), peer_id: bls_key.peer_id, @@ -1071,7 +1105,7 @@ mod test { let child = encrypt_and_tar_backup_keys( cfg.clone(), bls_key.peer_id, - &root_keys, + &key_set_root_keys, &blinders, &recovery_party, &peers, @@ -1206,19 +1240,17 @@ mod test { let dec_key_share_1 = hex_to_k256_dec_key_share(TEST_ECDSA_PRI_KEY_SHARE_1, 1); let dec_key_share_2 = hex_to_k256_dec_key_share(TEST_ECDSA_PRI_KEY_SHARE_2, 2); - let key_share_1 = - k256::Scalar::from_repr(k256::FieldBytes::clone_from_slice(&dec_key_share_1[1..])) - .expect("Failed to create k256 scalar from bytes"); + let key_share_1 = Scalar::from_repr(FieldBytes::clone_from_slice(&dec_key_share_1[1..])) + .expect("Failed to create k256 scalar from bytes"); let dec_key_share_1 = K256Share { - identifier: IdentifierPrimeField(k256::Scalar::from(dec_key_share_1[0] as u64)), + identifier: IdentifierPrimeField(Scalar::from(dec_key_share_1[0] as u64)), value: IdentifierPrimeField(key_share_1), }; - let key_share_2 = - k256::Scalar::from_repr(k256::FieldBytes::clone_from_slice(&dec_key_share_2[1..])) - .expect("Failed to create k256 scalar from bytes"); + let key_share_2 = Scalar::from_repr(FieldBytes::clone_from_slice(&dec_key_share_2[1..])) + .expect("Failed to create k256 scalar from bytes"); let dec_key_share_2 = K256Share { - identifier: IdentifierPrimeField(k256::Scalar::from(dec_key_share_2[0] as u64)), + identifier: IdentifierPrimeField(Scalar::from(dec_key_share_2[0] as u64)), value: IdentifierPrimeField(key_share_2), }; @@ -1257,7 +1289,7 @@ mod test { let bls_helper = KeyPersistence::::new(CurveType::BLS); let bls_blinder = bls_helper.secret_from_hex(TEST_BLS_BLINDER).unwrap(); - let k256_helper = KeyPersistence::::new(CurveType::K256); + let k256_helper = KeyPersistence::::new(CurveType::K256); let k256_blinder = k256_helper.secret_from_hex(TEST_ECDSA_BLINDER).unwrap(); let cfg = crate::tests::common::get_backup_config(); @@ -1308,7 +1340,7 @@ mod test { .await .unwrap(); - let peer_id = PeerId::try_from(555 as usize).unwrap(); + let peer_id = PeerId::try_from(555usize).unwrap(); let epoch = 333; let restored_key_shares = restore_state .try_restore_key_shares(&peer_id, epoch, staker_address, realm_id) diff --git a/rust/lit-node/lit-node/src/endpoints/pkp.rs b/rust/lit-node/lit-node/src/endpoints/pkp.rs index 72011f7e..a849cc05 100644 --- a/rust/lit-node/lit-node/src/endpoints/pkp.rs +++ b/rust/lit-node/lit-node/src/endpoints/pkp.rs @@ -69,7 +69,7 @@ pub(crate) async fn pkp_sign( let resource_ability = resource.signing_ability(); // Validate auth sig item - let bls_root_pubkey = match get_bls_root_pubkey(tss_state).await { + let bls_root_pubkey = match get_bls_root_pubkey(tss_state, None) { Ok(bls_root_pubkey) => bls_root_pubkey, Err(e) => { return client_session diff --git a/rust/lit-node/lit-node/src/endpoints/recovery/endpoints.rs b/rust/lit-node/lit-node/src/endpoints/recovery/endpoints.rs index 6d58ca86..9257c7fa 100644 --- a/rust/lit-node/lit-node/src/endpoints/recovery/endpoints.rs +++ b/rust/lit-node/lit-node/src/endpoints/recovery/endpoints.rs @@ -77,7 +77,10 @@ pub async fn recovery_set_dec_share( } if let Err(e) = restore_state - .add_decryption_shares(&request.auth_sig.address, &[request.share_data.clone()]) + .add_decryption_shares( + &request.auth_sig.address, + std::slice::from_ref(&request.share_data), + ) .await { return e.handle(); diff --git a/rust/lit-node/lit-node/src/endpoints/recovery/mod.rs b/rust/lit-node/lit-node/src/endpoints/recovery/mod.rs index 6c8bc1b9..5274d3a7 100644 --- a/rust/lit-node/lit-node/src/endpoints/recovery/mod.rs +++ b/rust/lit-node/lit-node/src/endpoints/recovery/mod.rs @@ -4,23 +4,27 @@ use crate::endpoints::recovery::utils::delete_key_shares_from_disk; use crate::error::{config_err, conversion_err, unexpected_err}; use crate::peers::peer_state::models::SimplePeer; use crate::tss::common::tss_state::TssState; -use blsful::inner_types::G1Projective; -use ed448_goldilocks::EdwardsPoint; use ethers::{ middleware::SignerMiddleware, providers::{Http, Provider}, signers::Wallet, types::H160, }; -use jubjub::SubgroupPoint; -use k256::ecdsa::SigningKey; use lit_blockchain::contracts::backup_recovery::{BackupRecovery, NextStateDownloadable}; use lit_core::{config::LitConfig, utils::binary::bytes_to_hex}; use lit_node_common::config::LitNodeConfig as _; use lit_node_core::CurveType; use lit_recovery::models::DownloadedShareData; +use lit_rust_crypto::{ + blsful::inner_types::G1Projective, + decaf377, + ed448_goldilocks::EdwardsPoint, + jubjub::SubgroupPoint, + k256::{self, ecdsa::SigningKey}, + p256, p384, pallas, + vsss_rs::curve25519::{WrappedEdwards, WrappedRistretto}, +}; use std::sync::Arc; -use vsss_rs::curve25519::{WrappedEdwards, WrappedRistretto}; pub mod endpoints; mod models; @@ -134,25 +138,6 @@ pub async fn do_share_download_from_rec_dkg( }; // k256 and bls public points (public keys) - let bls_pub_key = recovery_shares.bls_encryption_share.public_key_as_bytes()?; - let k256_pub_key = recovery_shares.k256_signing_share.public_key_as_bytes()?; - let p256_pub_key = recovery_shares.p256_signing_share.public_key_as_bytes()?; - let p384_pub_key = recovery_shares.p384_signing_share.public_key_as_bytes()?; - let ed25519_pub_key = recovery_shares - .ed25519_signing_share - .public_key_as_bytes()?; - let ristretto25519_pub_key = recovery_shares - .ristretto25519_signing_share - .public_key_as_bytes()?; - let ed448_pub_key = recovery_shares.ed448_signing_share.public_key_as_bytes()?; - let jubjub_pub_key = recovery_shares.jubjub_signing_share.public_key_as_bytes()?; - let decaf377_pub_key = recovery_shares - .decaf377_signing_share - .public_key_as_bytes()?; - let bls12381g1_pub_key = recovery_shares - .bls12381g1_signing_share - .public_key_as_bytes()?; - let session_id = next_backup_state.session_id.to_string(); Ok(vec![ @@ -285,6 +270,18 @@ pub async fn do_share_download_from_rec_dkg( curve: CurveType::BLS12381G1.to_string(), subnet_id: subnet_id.clone(), }, + DownloadedShareData { + session_id: session_id.clone(), + encryption_key: recovery_shares.pallas_signing_share.hex_public_key.clone(), + decryption_key_share: serde_json::to_string( + &recovery_shares + .pallas_signing_share + .default_share::()?, + ) + .map_err(|e| unexpected_err(e, None))?, + curve: CurveType::RedPallas.to_string(), + subnet_id: subnet_id.clone(), + }, ]) } @@ -317,25 +314,16 @@ pub async fn do_delete_share_from_disk( }; trace!("reading staker address from config"); - let staking_address = match cfg.staker_address() { - Ok(addr) => addr, - Err(e) => { - return Err(config_err( - e, - Some("Error while loading staker address".into()), - )); - } - }; + let staking_address = cfg + .staker_address() + .map_err(|e| config_err(e, Some("Error while loading staker address".into())))?; - let staking_addr: H160 = match staking_address.parse() { - Ok(addr) => addr, - Err(e) => { - return Err(conversion_err( - e, - Some("Could not convert staking address to H160 type".into()), - )); - } - }; + let staking_addr = staking_address.parse::().map_err(|e| { + conversion_err( + e, + Some("Could not convert staking address to H160 type".into()), + ) + })?; let mut index: Option = None; for (i, addr) in recovery_peer_addresses.iter().enumerate() { @@ -393,7 +381,7 @@ pub fn get_staker_address(cfg: &LitConfig) -> crate::error::Result { Err(e) => return Err(unexpected_err(e, None)), }; - let staker_address: ethers::types::H160 = match staker_address.parse() { + let staker_address: H160 = match staker_address.parse() { Ok(addr) => addr, Err(e) => { return Err(conversion_err( diff --git a/rust/lit-node/lit-node/src/endpoints/recovery/models.rs b/rust/lit-node/lit-node/src/endpoints/recovery/models.rs index 40b0ba99..9e3e1b0e 100644 --- a/rust/lit-node/lit-node/src/endpoints/recovery/models.rs +++ b/rust/lit-node/lit-node/src/endpoints/recovery/models.rs @@ -12,4 +12,5 @@ pub struct RecoveryShares { pub jubjub_signing_share: KeyShare, pub decaf377_signing_share: KeyShare, pub bls12381g1_signing_share: KeyShare, + pub pallas_signing_share: KeyShare, } diff --git a/rust/lit-node/lit-node/src/endpoints/recovery/utils.rs b/rust/lit-node/lit-node/src/endpoints/recovery/utils.rs index 743e3f62..511e41dd 100644 --- a/rust/lit-node/lit-node/src/endpoints/recovery/utils.rs +++ b/rust/lit-node/lit-node/src/endpoints/recovery/utils.rs @@ -182,6 +182,9 @@ pub async fn resolve_key_shares_from_disk( bls12381g1_signing_share: shares .remove(&CurveType::BLS12381G1) .expect_or_err("BLS12381G1")?, + pallas_signing_share: shares + .remove(&CurveType::RedPallas) + .expect_or_err("RedPallas")?, }) } diff --git a/rust/lit-node/lit-node/src/endpoints/versions/initial.rs b/rust/lit-node/lit-node/src/endpoints/versions/initial.rs index 8e874b03..b4e750c7 100644 --- a/rust/lit-node/lit-node/src/endpoints/versions/initial.rs +++ b/rust/lit-node/lit-node/src/endpoints/versions/initial.rs @@ -14,7 +14,7 @@ use lit_api_core::error::ApiError; use lit_core::config::ReloadableLitConfig; use lit_node_common::client_state::ClientState; use lit_node_core::{ - request::{self, EncryptionSignRequest, JsonPKPClaimKeyRequest, JsonSDKHandshakeRequest}, + request::{self, EncryptionSignRequest, JsonPKPClaimKeyRequest, SDKHandshakeRequest}, response::GenericResponse, }; use lit_sdk::EncryptedPayload; @@ -247,7 +247,7 @@ curl --header "Content-Type: application/json" \ pub async fn handshake( session: &State>, remote_addr: SocketAddr, - json_handshake_request: Json, + json_handshake_request: Json, tracing_required: TracingRequired, version: SdkVersion, cfg: &State, @@ -255,7 +255,7 @@ pub async fn handshake( client_state: &State>, ) -> status::Custom { with_timeout(&cfg.load_full(), None, None, async move { - web_client::handshake( + web_client::handshake_v0( session, remote_addr, json_handshake_request, diff --git a/rust/lit-node/lit-node/src/endpoints/versions/mod.rs b/rust/lit-node/lit-node/src/endpoints/versions/mod.rs index b1797016..abffa231 100644 --- a/rust/lit-node/lit-node/src/endpoints/versions/mod.rs +++ b/rust/lit-node/lit-node/src/endpoints/versions/mod.rs @@ -3,7 +3,6 @@ pub const LATEST_VERSION: &str = "v2"; pub mod initial; pub mod v1; pub mod v2; - pub fn deprecated_endpoint_error() -> rocket::response::status::Custom { use lit_api_core::error::ApiError; let msg = format!( diff --git a/rust/lit-node/lit-node/src/endpoints/versions/v1.rs b/rust/lit-node/lit-node/src/endpoints/versions/v1.rs index 2953cca6..592447e6 100644 --- a/rust/lit-node/lit-node/src/endpoints/versions/v1.rs +++ b/rust/lit-node/lit-node/src/endpoints/versions/v1.rs @@ -1,14 +1,17 @@ use super::deprecated_endpoint_error; +use crate::endpoints::web_client; use crate::models; use crate::payment::delegated_usage::DelegatedUsageDB; use crate::payment::payment_tracker::PaymentTracker; +use crate::siwe_db::rpc::EthBlockhashCache; use crate::tss::common::tss_state::TssState; use crate::utils::rocket::guards::RequestHeaders; -use lit_api_core::context::{Tracer, Tracing}; +use crate::utils::web::with_timeout; +use lit_api_core::context::{SdkVersion, Tracer, Tracing, TracingRequired}; use lit_core::config::ReloadableLitConfig; use lit_node_common::client_state::ClientState; use lit_node_core::request; -use lit_node_core::request::EncryptionSignRequest; +use lit_node_core::request::{EncryptionSignRequest, SDKHandshakeRequest}; use lit_sdk::EncryptedPayload; use moka::future::Cache; use rocket::response::status; @@ -24,10 +27,40 @@ pub(crate) fn routes() -> Vec { encryption_sign, sign_session_key, pkp_sign, - execute_function + execute_function, + handshake ] } +#[post("/web/handshake/v1", format = "json", data = "")] +#[instrument(name = "POST /web/handshake/v1", skip_all, fields(correlation_id = tracing_required.correlation_id()), ret)] +#[allow(clippy::too_many_arguments)] +pub(crate) async fn handshake( + session: &State>, + remote_addr: SocketAddr, + handshake_request: Json, + tracing_required: TracingRequired, + version: SdkVersion, + cfg: &State, + eth_blockhash_cache: &State>, + client_state: &State>, +) -> status::Custom { + with_timeout(&cfg.load_full(), None, None, async move { + web_client::handshake( + session, + remote_addr, + handshake_request, + tracing_required, + version, + cfg, + eth_blockhash_cache, + client_state, + ) + .await + }) + .await +} + #[allow(clippy::too_many_arguments)] #[post( "/web/encryption/sign/v1", diff --git a/rust/lit-node/lit-node/src/endpoints/web_client.rs b/rust/lit-node/lit-node/src/endpoints/web_client.rs index fd6d1382..50ecc80a 100644 --- a/rust/lit-node/lit-node/src/endpoints/web_client.rs +++ b/rust/lit-node/lit-node/src/endpoints/web_client.rs @@ -19,6 +19,7 @@ use crate::pkp; use crate::pkp::auth::serialize_auth_context_for_checking_against_contract_data; use crate::siwe_db::utils::make_timestamp_siwe_compatible; use crate::siwe_db::{db, rpc::EthBlockhashCache}; +use crate::tss::common::curve_state::CurveState; use crate::tss::common::tss_state::TssState; use crate::utils::attestation::create_attestation; use crate::utils::encoding; @@ -42,16 +43,19 @@ use lit_node_common::{client_state::ClientState, config::LitNodeConfig}; use lit_node_core::CurveType; use lit_node_core::SigningScheme; use lit_node_core::request::{EncryptionSignRequest, JsonExecutionRequest}; -use lit_node_core::response::{EncryptionSignResponse, GenericResponse}; +use lit_node_core::response::{ + EncryptionSignResponse, GenericResponse, KeySetHandshake, SDKHandshakeResponseV1, +}; use lit_node_core::{ AccessControlConditionItem, AccessControlConditionResource, AuthSigItem, EVMContractConditionItem, EndpointVersion, LitActionResource, LitResource, LitResourceAbility, SolRpcConditionItem, UnifiedAccessControlConditionItem, constants::{CHAIN_ETHEREUM, LIT_RESOURCE_KEY_RAC, LIT_RESOURCE_PREFIX_RAC}, request, - request::JsonSDKHandshakeRequest, - response::JsonSDKHandshakeResponse, + request::SDKHandshakeRequest, + response::SDKHandshakeResponseV0, }; +use log::warn; use moka::future::Cache; use rocket::State; use rocket::http::Status; @@ -145,7 +149,7 @@ pub(crate) async fn encryption_sign( let before = std::time::Instant::now(); // Validate auth sig item - let bls_root_pubkey = match get_bls_root_pubkey(session).await { + let bls_root_pubkey = match get_bls_root_pubkey(session, None) { Ok(bls_root_pubkey) => bls_root_pubkey, Err(e) => { return client_session.json_encrypt_err_custom_response("no bls root key", e.handle()); @@ -312,14 +316,14 @@ pub(crate) async fn encryption_sign( let before = std::time::Instant::now(); // Sign the identity parameter using the blsful secret key share. - let (signature_share, share_peer_id) = match cipher_state.sign(&identity_parameter, epoch).await - { - Ok(signature_share) => signature_share, - Err(e) => { - return client_session - .json_encrypt_err_custom_response("unable to BLS sign", e.handle()); - } - }; + let (signature_share, share_peer_id) = + match cipher_state.sign(&identity_parameter, None, epoch).await { + Ok(signature_share) => signature_share, + Err(e) => { + return client_session + .json_encrypt_err_custom_response("unable to BLS sign", e.handle()); + } + }; timing.insert("sign identity parameter".to_string(), before.elapsed()); timing.insert("total".to_string(), request_start.elapsed()); @@ -332,6 +336,130 @@ pub(crate) async fn encryption_sign( }) } +#[instrument(name = "POST /web/handshake/v1", skip_all, fields(correlation_id = tracing_required.correlation_id()))] +#[allow(clippy::too_many_arguments)] +pub async fn handshake( + session: &State>, + remote_addr: SocketAddr, + handshake_request: Json, + tracing_required: TracingRequired, + version: SdkVersion, + cfg: &State, + eth_blockhash_cache: &State>, + client_state: &Arc, +) -> status::Custom { + let request_start = std::time::Instant::now(); + let mut timing: BTreeMap = BTreeMap::new(); + + debug!( + " + handshake, request: {:?}, client_state: {:?}", + handshake_request, client_state, + ); + + // Validate that the challenge exists in the request. + let challenge = match &handshake_request.challenge { + Some(challenge) => challenge, + None => { + return status::Custom( + Status::BadRequest, + json!(GenericResponse::err_and_data_json( + "".to_string(), + SDKHandshakeResponseV1 { + client_sdk_version: version.to_string(), + attestation: None, + latest_blockhash: "".to_string(), + node_version: crate::version::get_version().to_string(), + node_identity_key: "".to_string(), + git_commit_hash: "".to_string(), + key_sets: Default::default(), + } + )), + ); + } + }; + + let cfg = cfg.load_full(); + + let before = std::time::Instant::now(); + // run the attestation + let attestation = create_attestation( + cfg, + challenge.as_str(), + Some(&[( + NODE_IDENTITY_KEY.to_string(), + client_state.get_current_identity_public_key().to_vec(), + )]), + ) + .await + .map_err(|e| { + #[cfg(not(feature = "testing"))] + warn!("Error creating attestation: {:?}", e); + unexpected_err(e, Some("error producing attestation".into())) + }) + .ok(); + let attestation = match serde_json::to_value(&attestation) { + Ok(attestation) => Some(attestation), + Err(e) => { + error!("unable to convert the attestation to a json object"); + return status::Custom( + Status::BadRequest, + json!(GenericResponse::err_and_data_json( + "".to_string(), + SDKHandshakeResponseV1 { + client_sdk_version: version.to_string(), + attestation: None, + latest_blockhash: "".to_string(), + node_version: crate::version::get_version().to_string(), + node_identity_key: "".to_string(), + git_commit_hash: "".to_string(), + key_sets: Default::default(), + } + )), + ); + } + }; + + timing.insert("create attestation".to_string(), before.elapsed()); + + let before = std::time::Instant::now(); + let latest_blockhash = eth_blockhash_cache.blockhash.read().await.clone(); + timing.insert("get latest blockhash".to_string(), before.elapsed()); + + let before = std::time::Instant::now(); + + let realm_id = session.peer_state.realm_id(); + let epoch = session.peer_state.epoch(); + let key_sets = DataVersionReader::read_field_unchecked( + &session.chain_data_config_manager.key_sets, + |key_sets| { + key_sets + .keys() + .map(|identifier| (identifier.clone(), KeySetHandshake { realm_id, epoch })) + .collect::>() + }, + ); + + timing.insert("get key sets".to_string(), before.elapsed()); + + timing.insert("total".to_string(), request_start.elapsed()); + + trace!("POST /web/handshake/v1 timing: {:?}", timing); + + status::Custom( + Status::Ok, + json!(GenericResponse::ok(SDKHandshakeResponseV1 { + client_sdk_version: version.to_string(), + attestation, + latest_blockhash, + node_version: crate::version::get_version().to_string(), + node_identity_key: client_state.get_current_identity_public_key_hex(), + git_commit_hash: "".to_string(), + key_sets, + })), + ) +} + /* curl --header "Content-Type: application/json" \ --request POST \ @@ -341,10 +469,10 @@ curl --header "Content-Type: application/json" \ #[instrument(level = "debug", name = "POST /web/handshake", skip_all, fields(correlation_id = tracing_required.correlation_id()))] #[allow(clippy::too_many_arguments)] -pub async fn handshake( +pub async fn handshake_v0( session: &State>, remote_addr: SocketAddr, - json_handshake_request: Json, + json_handshake_request: Json, tracing_required: TracingRequired, version: SdkVersion, cfg: &State, @@ -368,7 +496,7 @@ pub async fn handshake( Status::BadRequest, json!(GenericResponse::err_and_data_json( "".to_string(), - JsonSDKHandshakeResponse { + SDKHandshakeResponseV0 { server_public_key: "ERR".to_string(), subnet_public_key: "ERR".to_string(), network_public_key: "ERR".to_string(), @@ -390,24 +518,20 @@ pub async fn handshake( let cfg = cfg.load_full(); let before = std::time::Instant::now(); - let ecdsa_root_keys = match session.get_dkg_state(CurveType::K256) { - Ok(dkg_state) => dkg_state.root_keys().await, - Err(_) => { - debug!("Failed to acquire lock on hd_root_keys for ECDSA."); - vec![] - } - }; + let curve_state = CurveState::new(session.peer_state.clone(), CurveType::K256, None); + let ecdsa_root_keys = curve_state.root_keys().unwrap_or_else(|_| { + warn!("Failed to get root keys"); + vec![] + }); timing.insert("get ecdsa root keys".to_string(), before.elapsed()); let before = std::time::Instant::now(); - let bls_root_keys = match session.get_dkg_state(CurveType::BLS) { - Ok(dkg_state) => dkg_state.root_keys().await, - Err(_) => { - debug!("Failed to acquire lock on hd_root_keys for BLS."); - vec![] - } - }; - timing.insert("get bls root keys".to_string(), before.elapsed()); + let curve_state = CurveState::new(session.peer_state.clone(), CurveType::BLS, None); + let bls_root_key = get_bls_root_pubkey(session, None).unwrap_or_else(|_| { + warn!("Failed to get root keys"); + String::new() + }); + timing.insert("get bls root key".to_string(), before.elapsed()); let before = std::time::Instant::now(); // run the attestation @@ -434,7 +558,7 @@ pub async fn handshake( Status::BadRequest, json!(GenericResponse::err_and_data_json( "".to_string(), - JsonSDKHandshakeResponse { + SDKHandshakeResponseV0 { server_public_key: "ERR".to_string(), subnet_public_key: "ERR".to_string(), network_public_key: "ERR".to_string(), @@ -464,19 +588,17 @@ pub async fn handshake( trace!("POST /web/handshake timing: {:?}", timing); // the public key set is currently the bls root key... of which there is only one. - if !bls_root_keys.is_empty() { - let network_public_key = &bls_root_keys[0]; - + if !bls_root_key.is_empty() { let realm_id = session.peer_state.realm_id(); let epoch = session.peer_state.epoch(); return status::Custom( Status::Ok, - json!(GenericResponse::ok(JsonSDKHandshakeResponse { + json!(GenericResponse::ok(SDKHandshakeResponseV0 { server_public_key: "".to_string(), - subnet_public_key: network_public_key.clone(), - network_public_key: network_public_key.clone(), - network_public_key_set: network_public_key.clone(), + subnet_public_key: bls_root_key.clone(), + network_public_key: bls_root_key.clone(), + network_public_key_set: bls_root_key.clone(), client_sdk_version: version.to_string(), hd_root_pubkeys: ecdsa_root_keys, attestation, @@ -493,7 +615,7 @@ pub async fn handshake( Status::Ok, json!(GenericResponse::err_and_data_json( "".to_string(), - JsonSDKHandshakeResponse { + SDKHandshakeResponseV0 { server_public_key: "ERR".to_string(), subnet_public_key: "ERR".to_string(), network_public_key: "ERR".to_string(), @@ -521,7 +643,7 @@ pub(crate) async fn get_job_status( cfg: &State, client_state: &Arc, ) -> status::Custom { - let bls_root_pubkey = match get_bls_root_pubkey(tss_state).await { + let bls_root_pubkey = match get_bls_root_pubkey(tss_state, None) { Ok(key) => key, Err(e) => { return client_session @@ -711,7 +833,7 @@ pub(crate) async fn execute_function( let before = std::time::Instant::now(); // Validate auth sig item - let bls_root_pubkey = match get_bls_root_pubkey(tss_state).await { + let bls_root_pubkey = match get_bls_root_pubkey(tss_state, None) { Ok(bls_root_pubkey) => bls_root_pubkey, Err(e) => { return client_session.json_encrypt_err_custom_response("no bls root key", e.handle()); @@ -1295,42 +1417,40 @@ pub(crate) async fn sign_session_key( }; timing.insert("parsed siwe message".to_string(), before.elapsed()); - if let Some(statement) = &parsed_siwe.statement { - if statement.contains(LIT_RESOURCE_PREFIX_RAC) { - return client_session.json_encrypt_err_custom_response( - "missing resource prefix", - validation_err_code( - "Can't define Auth Context resources in capability", - EC::NodeInvalidAuthContextResource, - None, - ) - .add_msg_to_details() - .handle(), - ); - } + if let Some(statement) = &parsed_siwe.statement + && statement.contains(LIT_RESOURCE_PREFIX_RAC) + { + return client_session.json_encrypt_err_custom_response( + "missing resource prefix", + validation_err_code( + "Can't define Auth Context resources in capability", + EC::NodeInvalidAuthContextResource, + None, + ) + .add_msg_to_details() + .handle(), + ); } - let origin_domain = match get_domain_from_request_origin( + let origin_domain = get_domain_from_request_origin( request_headers .headers .get_one("Origin") .unwrap_or("http://localhost"), - ) { - Ok(origin_domain) => origin_domain, - Err(e) => { - error!( - "Error getting origin domain - swallowing and using default of localhost: {:?}", - e - ); - "http://localhost".into() - } - }; - trace!("Origin: {:?}", origin_domain); + ) + .unwrap_or_else(|e| { + error!( + "Error getting origin domain - swallowing and using default of localhost: {:?}", + e + ); + "http://localhost".into() + }); + debug!("Origin: {:?}", origin_domain); let before = std::time::Instant::now(); // convert the auth methods into an auth context by resolving the oauth ids // from the oauth endpoints - let bls_root_pubkey = match get_bls_root_pubkey(tss_state).await { + let bls_root_pubkey = match get_bls_root_pubkey(tss_state, None) { Ok(bls_root_pubkey) => bls_root_pubkey, Err(e) => { return client_session.json_encrypt_err_custom_response("no bls root key", e.handle()); @@ -2005,7 +2125,7 @@ pub(crate) async fn sign_session_key( ); let before = std::time::Instant::now(); - let bls_root_pubkey = match get_bls_root_pubkey(tss_state).await { + let bls_root_pubkey = match get_bls_root_pubkey(tss_state, None) { Ok(bls_root_pubkey) => bls_root_pubkey, Err(e) => { return client_session @@ -2067,7 +2187,7 @@ pub(crate) async fn sign_session_key( bls_root_pubkey, to_sign ); let before = std::time::Instant::now(); - let (signature_share, share_peer_id) = match cipher_state.sign(&to_sign, epoch).await { + let (signature_share, share_peer_id) = match cipher_state.sign(&to_sign, None, epoch).await { Ok(signature_share) => signature_share, Err(e) => { return client_session.json_encrypt_err_custom_response( diff --git a/rust/lit-node/lit-node/src/functions/action_client.rs b/rust/lit-node/lit-node/src/functions/action_client.rs index 8eb4331d..87bc0528 100644 --- a/rust/lit-node/lit-node/src/functions/action_client.rs +++ b/rust/lit-node/lit-node/src/functions/action_client.rs @@ -25,15 +25,10 @@ use crate::utils::tracing::inject_tracing_metadata; use crate::utils::web::{get_bls_root_pubkey, hash_access_control_conditions}; use anyhow::{Context as _, Result, bail}; use base64_light::base64_decode; -use blsful::inner_types::GroupEncoding; -use blsful::{Bls12381G2Impl, SignatureShare}; use derive_builder::Builder; use ecdsa::SignatureSize; -use elliptic_curve::generic_array::ArrayLength; -use elliptic_curve::{CurveArithmetic, PrimeCurve}; use ethers::utils::keccak256; use futures::{FutureExt as _, TryFutureExt}; -use hd_keys_curves::{HDDerivable, HDDeriver}; use lit_actions_grpc::tokio_stream::StreamExt as _; use lit_actions_grpc::tonic::{ Code, Extensions, Request, Status, metadata::MetadataMap, transport::Error as TransportError, @@ -48,11 +43,21 @@ use serde::{Deserialize, Serialize}; use tokio::time::Duration; use tracing::{debug, instrument}; +use crate::tss::common::curve_state::CurveState; use lit_node_common::config::LitNodeConfig as _; use lit_node_core::{ - AccessControlConditionResource, AuthSigItem, BeHex, CompressedBytes, CurveType, - EndpointVersion, JsonAuthSig, LitActionPriceComponent, LitResource, NodeSet, PeerId, - SignableOutput, SignedData, SigningScheme, UnifiedAccessControlConditionItem, response, + AccessControlConditionResource, AuthSigItem, BeHex, CompressedBytes, EndpointVersion, + JsonAuthSig, LitActionPriceComponent, LitResource, NodeSet, PeerId, SignableOutput, SignedData, + SigningScheme, UnifiedAccessControlConditionItem, + hd_keys_curves_wasm::{HDDerivable, HDDeriver}, + response, +}; +use lit_rust_crypto::{ + blsful::{self, Bls12381G2Impl, SignatureShare}, + decaf377, ed448_goldilocks, + elliptic_curve::{CurveArithmetic, PrimeCurve, generic_array::ArrayLength}, + group::GroupEncoding, + jubjub, k256, p256, p384, vsss_rs, }; use lit_sdk::signature::{SignedDataOutput, combine_and_verify_signature_shares}; @@ -897,13 +902,15 @@ impl Client { }; // Sign the identity parameter using the blsful secret key share. - let (signature_share, share_id) = - match cipher_state.sign(&identity_parameter, self.epoch).await { - Ok(signature_share) => signature_share, - Err(e) => { - bail!("Couldn't sign the identity parameter: {:?}", e); - } - }; + let (signature_share, share_id) = match cipher_state + .sign(&identity_parameter, None, self.epoch) + .await + { + Ok(signature_share) => signature_share, + Err(e) => { + bail!("Couldn't sign the identity parameter: {:?}", e); + } + }; let cm = CommsManager::new(&tss_state, 0, &txn_prefix, "0", &self.node_set).await?; let mut shares = cm @@ -914,7 +921,7 @@ impl Client { shares.push((PeerId::ONE, signature_share)); // lazy - it's not zero, but we don't seem to care! - let network_pubkey = get_bls_root_pubkey(&tss_state).await?; + let network_pubkey = get_bls_root_pubkey(&tss_state, None)?; let network_pubkey = blsful::PublicKey::try_from(&hex::decode(&network_pubkey)?)?; let serialized_decryption_shares = @@ -999,13 +1006,15 @@ impl Client { }; // Sign the identity parameter using the blsful secret key share. - let (signature_share, share_index) = - match cipher_state.sign(&identity_parameter, self.epoch).await { - Ok(signature_share) => signature_share, - Err(e) => { - bail!("Couldn't sign the identity parameter: {:?}", e); - } - }; + let (signature_share, share_index) = match cipher_state + .sign(&identity_parameter, None, self.epoch) + .await + { + Ok(signature_share) => signature_share, + Err(e) => { + bail!("Couldn't sign the identity parameter: {:?}", e); + } + }; let cm = CommsManager::new(&tss_state, 0, &txn_prefix, "0", &self.node_set).await?; let leader_peer = peers.peer_at_address(&leader_addr)?; @@ -1036,9 +1045,9 @@ impl Client { shares.push((PeerId::ONE, signature_share)); // lazy - it's not zero, but we don't seem to care! - let network_pubkey = &get_bls_root_pubkey(&tss_state).await?; + let network_pubkey = get_bls_root_pubkey(&tss_state, None)?; let network_pubkey = - blsful::PublicKey::try_from(&hex::decode(network_pubkey)?)?; + blsful::PublicKey::try_from(&hex::decode(&network_pubkey)?)?; let serialized_decryption_shares = shares.iter().map(|(_, share)| *share).collect::>(); @@ -1059,14 +1068,12 @@ impl Client { } }; - let result = match std::str::from_utf8(&decrypted) { + match std::str::from_utf8(&decrypted) { Ok(result) => result.to_string(), Err(e) => { bail!("Failed to convert decrypted bytes to string.") } - }; - - result + } } }; @@ -1255,6 +1262,7 @@ impl Client { | SigningScheme::SchnorrRistretto25519Sha512 | SigningScheme::SchnorrEd448Shake256 | SigningScheme::SchnorrRedJubjubBlake2b512 + | SigningScheme::SchnorrRedPallasBlake2b512 | SigningScheme::SchnorrRedDecaf377Blake2b512 | SigningScheme::SchnorrkelSubstrate => { let frost_signature: lit_frost::Signature = @@ -1361,8 +1369,9 @@ impl Client { to_encrypt, }) => { let (tss_state, txn_prefix) = self.tss_state_and_txn_prefix()?; - let network_pubkey = &get_bls_root_pubkey(&tss_state).await?; - let network_pubkey = blsful::PublicKey::try_from(&hex::decode(network_pubkey)?)?; + let tss_state = Arc::new(tss_state); + let network_pubkey = get_bls_root_pubkey(&tss_state, None)?; + let network_pubkey = blsful::PublicKey::try_from(&hex::decode(&network_pubkey)?)?; use sha2::{Digest, Sha256}; let mut hasher = Sha256::new(); @@ -1478,8 +1487,8 @@ impl Client { let txn_prefix = format!("{}_signasaction_{}", txn_prefix, scheme); let tss_state = Arc::new(tss_state); let curve_type = scheme.curve_type(); - let dkg_state = tss_state.get_dkg_state(curve_type)?; - let root_keys = dkg_state.root_keys().await; + let curve_state = CurveState::new(tss_state.peer_state.clone(), curve_type, None); + let root_keys = curve_state.root_keys()?; let pubkey = lit_sdk::signature::get_lit_action_public_key( scheme, &action_ipfs_cid, @@ -1516,8 +1525,8 @@ impl Client { let (tss_state, txn_prefix) = self.tss_state_and_txn_prefix()?; let txn_prefix = format!("{}_signasaction_{}", txn_prefix, scheme); let tss_state = Arc::new(tss_state); - let dkg_state = tss_state.get_dkg_state(curve_type)?; - let root_keys = dkg_state.root_keys().await; + let curve_state = CurveState::new(tss_state.peer_state.clone(), curve_type, None); + let root_keys = curve_state.root_keys()?; let pubkey = lit_sdk::signature::get_lit_action_public_key( scheme, &action_ipfs_cid, @@ -1746,23 +1755,13 @@ impl Client { async fn get_bls_root_pubkey(&self) -> Result { let tss_state = match &self.js_env.tss_state { - Some(tss_state) => tss_state, + Some(tss_state) => Arc::new(tss_state.clone()), None => { return Err(anyhow::anyhow!("No TSS state found")); } }; - - let dkg_state = match tss_state.get_dkg_state(CurveType::BLS) { - Ok(state) => state, - Err(e) => { - return Err(e.into()); - } - }; - let bls_root_pubkeys = dkg_state.root_keys().await; - match bls_root_pubkeys.first() { - Some(bls_root_key) => Ok(bls_root_key.clone()), - None => Err(anyhow::anyhow!("No BLS root key found")), - } + get_bls_root_pubkey(&tss_state, None) + .map_err(|e| anyhow::anyhow!(format!("Error getting BLS root pubkey: {:?}", e))) } async fn leader_helper(&self, request_hash: u64) -> Result<(String, bool)> { @@ -1782,6 +1781,7 @@ impl Client { Ok((leader.socket_address.clone(), is_leader)) } + #[allow(clippy::too_many_arguments)] async fn sign_with_action( &mut self, to_sign: &[u8], @@ -1800,20 +1800,19 @@ impl Client { let curve_type = signing_scheme.curve_type(); let mut sign_state = tss_state.get_signing_state(signing_scheme)?; - let dkg_state = tss_state.get_dkg_state(curve_type)?; + let curve_state = CurveState::new(tss_state.peer_state.clone(), curve_type, None); let key_id = keccak256(format!("lit_action_{}", action_ipfs_id)); - let root_keys = dkg_state.root_keys().await; let epoch = tss_state.get_keyshare_epoch().await; let pubkey = self - .get_action_pubkey(tss_state.clone(), action_ipfs_id, signing_scheme) + .get_action_pubkey(tss_state.clone(), action_ipfs_id, None, signing_scheme) .await?; let my_result = sign_state .sign_with_pubkey( to_sign, pubkey, - Some(root_keys), Some(key_id.to_vec()), self.request_id().as_bytes().to_vec(), + None, Some(epoch), &self.node_set, ) @@ -1872,6 +1871,7 @@ impl Client { &self, tss_state: Arc, action_ipfs_id: &str, + key_set_id: Option<&str>, signing_scheme: SigningScheme, ) -> Result> { let pubkey = match signing_scheme { @@ -1879,6 +1879,7 @@ impl Client { &derive_ipfs_keys::( tss_state, action_ipfs_id, + key_set_id, signing_scheme, ) .await? @@ -1886,36 +1887,53 @@ impl Client { ), SigningScheme::EcdsaK256Sha256 | SigningScheme::SchnorrK256Sha256 - | SigningScheme::SchnorrK256Taproot => { - derive_ipfs_keys::(tss_state, action_ipfs_id, signing_scheme) - .await? - .1 - .to_compressed() - } - SigningScheme::EcdsaP256Sha256 | SigningScheme::SchnorrP256Sha256 => { - derive_ipfs_keys::(tss_state, action_ipfs_id, signing_scheme) - .await? - .1 - .to_compressed() - } - SigningScheme::EcdsaP384Sha384 | SigningScheme::SchnorrP384Sha384 => { - derive_ipfs_keys::(tss_state, action_ipfs_id, signing_scheme) - .await? - .1 - .to_compressed() - } - SigningScheme::SchnorrEd25519Sha512 => derive_ipfs_keys::< - vsss_rs::curve25519::WrappedEdwards, - >( - tss_state, action_ipfs_id, signing_scheme + | SigningScheme::SchnorrK256Taproot => derive_ipfs_keys::( + tss_state, + action_ipfs_id, + key_set_id, + signing_scheme, ) .await? .1 .to_compressed(), + SigningScheme::EcdsaP256Sha256 | SigningScheme::SchnorrP256Sha256 => { + derive_ipfs_keys::( + tss_state, + action_ipfs_id, + key_set_id, + signing_scheme, + ) + .await? + .1 + .to_compressed() + } + SigningScheme::EcdsaP384Sha384 | SigningScheme::SchnorrP384Sha384 => { + derive_ipfs_keys::( + tss_state, + action_ipfs_id, + key_set_id, + signing_scheme, + ) + .await? + .1 + .to_compressed() + } + SigningScheme::SchnorrEd25519Sha512 => { + derive_ipfs_keys::( + tss_state, + action_ipfs_id, + key_set_id, + signing_scheme, + ) + .await? + .1 + .to_compressed() + } SigningScheme::SchnorrRistretto25519Sha512 | SigningScheme::SchnorrkelSubstrate => { derive_ipfs_keys::( tss_state, action_ipfs_id, + key_set_id, signing_scheme, ) .await? @@ -1926,24 +1944,31 @@ impl Client { derive_ipfs_keys::( tss_state, action_ipfs_id, + key_set_id, signing_scheme, ) .await? .1 .to_compressed() } - SigningScheme::SchnorrRedDecaf377Blake2b512 => { - derive_ipfs_keys::(tss_state, action_ipfs_id, signing_scheme) - .await? - .1 - .to_compressed() - } - SigningScheme::SchnorrRedJubjubBlake2b512 => { - derive_ipfs_keys::(tss_state, action_ipfs_id, signing_scheme) - .await? - .1 - .to_compressed() - } + SigningScheme::SchnorrRedDecaf377Blake2b512 => derive_ipfs_keys::( + tss_state, + action_ipfs_id, + key_set_id, + signing_scheme, + ) + .await? + .1 + .to_compressed(), + SigningScheme::SchnorrRedJubjubBlake2b512 => derive_ipfs_keys::( + tss_state, + action_ipfs_id, + key_set_id, + signing_scheme, + ) + .await? + .1 + .to_compressed(), _ => { return Err(anyhow::anyhow!( "Unsupported derive action pubkey signing scheme: {}", @@ -1985,6 +2010,7 @@ pub fn get_identity_param( async fn derive_ipfs_keys( tss_state: Arc, action_ipfs_id: &str, + key_set_id: Option<&str>, signing_scheme: SigningScheme, ) -> Result<(G::Scalar, G)> where @@ -1993,8 +2019,12 @@ where { let key_id = keccak256(format!("lit_action_{}", action_ipfs_id)); let curve_type = signing_scheme.curve_type(); - let dkg_state = tss_state.get_dkg_state(curve_type)?; - let root_keys = dkg_state.root_keys().await; + let curve_state = CurveState::new( + tss_state.peer_state.clone(), + curve_type, + key_set_id.map(String::from), + ); + let root_keys = curve_state.root_keys()?; let staker_address = &tss_state.peer_state.hex_staker_address(); let peers = tss_state.peer_state.peers(); let self_peer = peers.peer_at_address(&tss_state.addr)?; diff --git a/rust/lit-node/lit-node/src/git_info.rs b/rust/lit-node/lit-node/src/git_info.rs index e7d0e878..b9b190c7 100644 --- a/rust/lit-node/lit-node/src/git_info.rs +++ b/rust/lit-node/lit-node/src/git_info.rs @@ -1 +1 @@ -pub const GIT_COMMIT_HASH: &str = "5caf4cb4b70f0ec3b5094e71785ce78421027805"; +pub const GIT_COMMIT_HASH: &str = "ea6776b2fe987c070d5e23e4534d4c49a9bef1b1"; diff --git a/rust/lit-node/lit-node/src/main.rs b/rust/lit-node/lit-node/src/main.rs index 7b33938f..12a9066e 100644 --- a/rust/lit-node/lit-node/src/main.rs +++ b/rust/lit-node/lit-node/src/main.rs @@ -518,15 +518,15 @@ impl ObservabilityProviders { } fn shutdown(self) { - if let Some(meter_provider) = self.meter_provider { - if let Err(e) = meter_provider.shutdown() { - error!("Failed to shutdown metrics provider: {:?}", e); - } + if let Some(meter_provider) = self.meter_provider + && let Err(e) = meter_provider.shutdown() + { + error!("Failed to shutdown metrics provider: {:?}", e); } - if let Some(logger_provider) = self.logger_provider { - if let Err(e) = logger_provider.shutdown() { - error!("Failed to shutdown logger provider: {:?}", e); - } + if let Some(logger_provider) = self.logger_provider + && let Err(e) = logger_provider.shutdown() + { + error!("Failed to shutdown logger provider: {:?}", e); } } } diff --git a/rust/lit-node/lit-node/src/models/mod.rs b/rust/lit-node/lit-node/src/models/mod.rs index ea6e13fa..595be425 100644 --- a/rust/lit-node/lit-node/src/models/mod.rs +++ b/rust/lit-node/lit-node/src/models/mod.rs @@ -1,5 +1,6 @@ use ethers::types::{Address, U256}; +use crate::error::blockchain_err; use crate::functions::action_client::ExecutionState; use crate::functions::{JobId, JobStatus}; use iri_string::spec::UriSpec; @@ -8,32 +9,21 @@ use lit_blockchain::resolver::rpc::config::RpcConfig; #[cfg(feature = "lit-actions")] use lit_core::config::LitConfig; use lit_node_core::{ - AccessControlConditionItem, AuthMethod, AuthSigItem, Blinders, CurveType, - EVMContractConditionItem, JsonAuthSig, NodeSet, SolRpcConditionItem, - UnifiedAccessControlConditionItem, + AccessControlConditionItem, AuthMethod, AuthSigItem, CurveType, EVMContractConditionItem, + JsonAuthSig, NodeSet, SolRpcConditionItem, UnifiedAccessControlConditionItem, }; use lit_recovery::models::UploadedShareData; use moka::future::Cache; use serde::{Deserialize, Serialize}; use serde_json::Value; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; #[cfg(feature = "lit-actions")] use std::sync::Arc; use std::time::{Duration, SystemTime}; use tokio::sync::RwLock; use web3::types::{Bytes, CallRequest}; -use webauthn_rs_core::proto::PublicKeyCredential; pub mod auth; -pub mod siwe; -pub mod webauthn_signature_verification_material; - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct JsonAdminSetBlindersRequest { - pub auth_sig: JsonAuthSig, - pub blinders: Blinders, -} #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] @@ -224,31 +214,6 @@ pub struct JwtSignedChainDataPayload { pub call_responses: Vec, } -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct JsonSigningResourceId { - pub base_url: String, - pub path: String, - pub org_id: String, - pub role: String, - pub extra_data: String, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct SigningAccessControlConditionRequest { - pub access_control_conditions: Option>, - pub evm_contract_conditions: Option>, - pub sol_rpc_conditions: Option>, - pub unified_access_control_conditions: Option>, - pub chain: Option, - pub auth_sig: AuthSigItem, - pub iat: u64, - pub exp: u64, - #[serde(default = "default_epoch")] - pub epoch: u64, -} - /* accessControlConditions looks like this: accessControlConditions: [ { @@ -304,16 +269,6 @@ pub struct JwtPayloadV2 { pub unified_access_control_conditions: Option>, } -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct RecoveryShare { - pub recovery_share: Vec, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct JsonRecoveryShareResponse { - pub result: String, -} - #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, PartialOrd, Ord)] pub struct PeerValidator { pub ip: u32, @@ -333,14 +288,6 @@ pub struct PeerValidator { pub realm_id: U256, } -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct WebAuthnAuthenticationRequest { - pub credential: PublicKeyCredential, - pub session_pubkey: String, - pub siwe_message: String, -} - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] pub struct EthBlock { pub blockhash: String, @@ -348,6 +295,70 @@ pub struct EthBlock { pub block_number: usize, } +#[derive(Clone, Debug, Default)] +pub struct KeySetConfig { + pub identifier: String, + pub description: String, + pub minimum_threshold: usize, + pub monetary_value: usize, + pub complete_isolation: bool, + pub realms: HashSet, + pub root_keys_by_curve: HashMap>, + pub root_key_counts: HashMap, + pub recovery_session_id: String, +} + +impl TryFrom for KeySetConfig { + type Error = lit_core::error::Error; + + fn try_from( + config: lit_blockchain::contracts::staking::KeySetConfig, + ) -> lit_core::error::Result { + let mut root_keys_by_curve = HashMap::with_capacity(config.curves.len()); + let mut root_key_counts = HashMap::with_capacity(config.curves.len()); + for (curve, count) in config.curves.iter().zip(config.counts.iter()) { + let curve_type = CurveType::try_from(*curve).map_err(|e| blockchain_err(e, None))?; + root_keys_by_curve.insert(curve_type, Vec::with_capacity(count.as_usize())); + root_key_counts.insert(curve_type, count.as_usize()); + } + + Ok(Self { + identifier: config.identifier, + description: config.description, + minimum_threshold: config.minimum_threshold as usize, + monetary_value: config.monetary_value as usize, + complete_isolation: config.complete_isolation, + realms: config.realms.into_iter().map(|r| r.as_usize()).collect(), + recovery_session_id: hex::encode(config.recovery_session_id), + root_keys_by_curve, + root_key_counts, + }) + } +} + +#[derive(Clone, Debug, Default)] +pub struct PubKeyRoutingData { + pub pubkey: Vec, + pub curve_type: CurveType, + pub tweak_preimage: [u8; 32], + pub key_set_identifier: String, +} + +impl TryFrom for PubKeyRoutingData { + type Error = lit_core::error::Error; + + fn try_from( + data: lit_blockchain::contracts::pubkey_router::PubkeyRoutingData, + ) -> lit_core::error::Result { + Ok(Self { + pubkey: data.pubkey.to_vec(), + curve_type: CurveType::try_from(data.key_type).map_err(|e| blockchain_err(e, None))?, + tweak_preimage: data.derived_key_id, + key_set_identifier: data.key_set_identifier, + }) + } +} + #[test] fn serialize() { use lit_node_core::response::JsonSignSessionKeyResponseV2; diff --git a/rust/lit-node/lit-node/src/models/siwe.rs b/rust/lit-node/lit-node/src/models/siwe.rs deleted file mode 100644 index d63ca7b3..00000000 --- a/rust/lit-node/lit-node/src/models/siwe.rs +++ /dev/null @@ -1,11 +0,0 @@ -use std::collections::HashMap; - -use serde::{Deserialize, Serialize}; -use serde_json::Value; - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct CapabilityObject { - pub def: Option>, - pub tar: Option>, - pub ext: Option>, -} diff --git a/rust/lit-node/lit-node/src/models/webauthn_signature_verification_material.rs b/rust/lit-node/lit-node/src/models/webauthn_signature_verification_material.rs deleted file mode 100644 index 1e602ded..00000000 --- a/rust/lit-node/lit-node/src/models/webauthn_signature_verification_material.rs +++ /dev/null @@ -1,9 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct WebAuthnSignatureVerificationMaterial { - pub signature: String, - pub signature_base: String, - pub credential_public_key: String, -} diff --git a/rust/lit-node/lit-node/src/p2p_comms/comms/wait.rs b/rust/lit-node/lit-node/src/p2p_comms/comms/wait.rs index e7a2c76f..e5143b11 100644 --- a/rust/lit-node/lit-node/src/p2p_comms/comms/wait.rs +++ b/rust/lit-node/lit-node/src/p2p_comms/comms/wait.rs @@ -182,10 +182,10 @@ pub async fn node_share_await( // } // optionally exit early. - if let Some(exit_on_qty_recvd) = params.exit_on_qty_recvd { - if recvd_ans.len() >= exit_on_qty_recvd { - break 'waiting_loop; - }; + if let Some(exit_on_qty_recvd) = params.exit_on_qty_recvd + && recvd_ans.len() >= exit_on_qty_recvd + { + break 'waiting_loop; }; } diff --git a/rust/lit-node/lit-node/src/p2p_comms/web/chatter_server.rs b/rust/lit-node/lit-node/src/p2p_comms/web/chatter_server.rs index 47ad075f..2ac6def3 100644 --- a/rust/lit-node/lit-node/src/p2p_comms/web/chatter_server.rs +++ b/rust/lit-node/lit-node/src/p2p_comms/web/chatter_server.rs @@ -32,6 +32,7 @@ use tracing::{debug, error, info, instrument}; use xor_name::XorName; #[allow(clippy::unwrap_used)] +#[allow(dead_code)] pub mod chatter { tonic::include_proto!("chatter"); } @@ -183,7 +184,6 @@ impl ChatterService for ChatterServer { } }; let public_key = libsecp256k1::PublicKey::from_secret_key(&secret_key); - let mut peer_item = PeerItem { id: peer_state.id, public_key, diff --git a/rust/lit-node/lit-node/src/p2p_comms/web/mod.rs b/rust/lit-node/lit-node/src/p2p_comms/web/mod.rs index 7a37102b..d69c6504 100644 --- a/rust/lit-node/lit-node/src/p2p_comms/web/mod.rs +++ b/rust/lit-node/lit-node/src/p2p_comms/web/mod.rs @@ -1,3 +1,2 @@ pub mod chatter_server; pub mod internal; -pub mod models; diff --git a/rust/lit-node/lit-node/src/p2p_comms/web/models.rs b/rust/lit-node/lit-node/src/p2p_comms/web/models.rs deleted file mode 100644 index c12f7732..00000000 --- a/rust/lit-node/lit-node/src/p2p_comms/web/models.rs +++ /dev/null @@ -1,43 +0,0 @@ -use lit_node_core::{ - AccessControlConditionItem, EVMContractConditionItem, JsonAuthSig, SolRpcConditionItem, -}; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize)] -pub struct ValidateConditionRequest { - pub access_control_conditions: Option>, - pub evm_contract_conditions: Option>, - pub sol_rpc_conditions: Option>, - pub chain: String, - pub auth_sig: JsonAuthSig, - pub iat: u64, - pub exp: u64, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct PKPKeyRequest { - pub id: String, - pub chain: String, - pub key_type: String, - pub iat: u64, - pub exp: u64, -} - -#[derive(Clone, Serialize, Deserialize, Debug)] -pub struct PKPKeyResponse { - pub chain: String, - pub public_key: String, - pub signature: String, - pub key_type: String, - pub signature_r: ethers::types::U256, - pub signature_s: ethers::types::U256, - pub signature_v: u64, -} - -#[derive(Clone, Serialize, Deserialize, Debug)] -pub struct SignWithPublicHashRequest { - pub pubkey: Vec, - pub auth_sig: JsonAuthSig, - pub iat: u64, - pub exp: u64, -} diff --git a/rust/lit-node/lit-node/src/payment/payment_delegation.rs b/rust/lit-node/lit-node/src/payment/payment_delegation.rs index 546f03c5..de94a3bd 100644 --- a/rust/lit-node/lit-node/src/payment/payment_delegation.rs +++ b/rust/lit-node/lit-node/src/payment/payment_delegation.rs @@ -128,8 +128,7 @@ pub async fn check_for_payment_delegation( if let Ok(Some(delegation)) = check_verified_siwe_for_a_payment_delegator(user_address, signed_message) - { - if let Ok((true, spending_limit)) = validate_delegation_requirements( + && let Ok((true, spending_limit)) = validate_delegation_requirements( &delegation, required_scope, required_funds, @@ -138,9 +137,8 @@ pub async fn check_for_payment_delegation( ledger, ) .await - { - return Ok(Some((delegation.delegator, spending_limit))); - } + { + return Ok(Some((delegation.delegator, spending_limit))); }; } diff --git a/rust/lit-node/lit-node/src/peers/keys.rs b/rust/lit-node/lit-node/src/peers/keys.rs index 76da492f..c0b64530 100644 --- a/rust/lit-node/lit-node/src/peers/keys.rs +++ b/rust/lit-node/lit-node/src/peers/keys.rs @@ -4,13 +4,13 @@ use ethers::middleware::SignerMiddleware; use ethers::providers::{Http, Provider}; use ethers::signers::Wallet; use ethers::types::Address; -use k256::ecdsa::SigningKey; use lit_blockchain::contracts::staking::Staking; use lit_core::config::LitConfig; use lit_core::utils::binary::bytes_to_hex; use lit_node_common::coms_keys::ComsKeys; use lit_node_common::config::LitNodeConfig; use lit_node_common::eth_wallet_keys::EthWalletKeys; +use lit_rust_crypto::k256::ecdsa::SigningKey; use std::sync::Arc; pub struct PeerKeys { diff --git a/rust/lit-node/lit-node/src/peers/mod.rs b/rust/lit-node/lit-node/src/peers/mod.rs index 9895b29c..7edfb56c 100644 --- a/rust/lit-node/lit-node/src/peers/mod.rs +++ b/rust/lit-node/lit-node/src/peers/mod.rs @@ -205,11 +205,16 @@ impl PeerState { } pub fn realm_id(&self) -> u64 { - DataVersionReader::new_unchecked(&self.chain_data_config_manager.realm_id).as_u64() + DataVersionReader::read_field_unchecked(&self.chain_data_config_manager.realm_id, |realm| { + realm.as_u64() + }) } pub fn shadow_realm_id(&self) -> u64 { - DataVersionReader::new_unchecked(&self.chain_data_config_manager.shadow_realm_id).as_u64() + DataVersionReader::read_field_unchecked( + &self.chain_data_config_manager.shadow_realm_id, + |realm| realm.as_u64(), + ) } pub fn peer_id_in_current_epoch(&self) -> Result { @@ -218,10 +223,10 @@ impl PeerState { } pub fn epoch(&self) -> u64 { - DataVersionReader::new_unchecked( + DataVersionReader::read_field_unchecked( &self.chain_data_config_manager.peers.peers_for_current_epoch, + |peers| peers.epoch_number, ) - .epoch_number } #[instrument(level = "debug", skip(self))] diff --git a/rust/lit-node/lit-node/src/peers/peer_state/backup_recovery.rs b/rust/lit-node/lit-node/src/peers/peer_state/backup_recovery.rs index 8444cea0..982734c5 100644 --- a/rust/lit-node/lit-node/src/peers/peer_state/backup_recovery.rs +++ b/rust/lit-node/lit-node/src/peers/peer_state/backup_recovery.rs @@ -4,6 +4,7 @@ use lit_blockchain::contracts::{backup_recovery::RecoveryKey, staking::Validator use lit_blockchain::util::decode_revert; use lit_core::error::Result; use sha2::Sha256; +use std::collections::HashMap; use std::time::Duration; use super::{super::PeerState, models::SimplePeer}; @@ -155,55 +156,61 @@ impl PeerState { } // No retries for this function similar to Standard DKG - pub async fn register_recovery_keys(&self, recovery_root_keys: Vec) { - let mut recovery_keys: Vec = Vec::new(); - + pub async fn register_recovery_keys( + &self, + recovery_root_keys: HashMap>, + ) { info!("Registering Recovery DKG keys: {:?}", recovery_root_keys); - let mut hasher = Sha256::default(); - for recovery_key in recovery_root_keys { - let pubkey_bytes = match hex_to_bytes(&recovery_key.public_key) { - Ok(pubkey_bytes) => pubkey_bytes, - Err(e) => { - debug!("Error converting pubkey to bytes w/: {:?}", e); - return; - } - }; - hasher.update(&pubkey_bytes); - recovery_keys.push(RecoveryKey { - pubkey: Bytes::from(pubkey_bytes), - key_type: recovery_key.curve_type.into(), - }); - } - let session_id = Bytes::from(hasher.finalize().to_vec()); - - let func = self - .backup_recovery_contract - .register_recovery_keys(recovery_keys, session_id); - let gas_estimate = func.estimate_gas().await; - match gas_estimate { - Ok(gas_estimate) => { - let func_with_gas = func.gas(gas_estimate * U256::from(5)); - let result = func_with_gas.send().await; - - match result { - Ok(_) => { - debug!("register pubkey for Recovery dkg"); - - // Once the recovery keys are registered, we sleep briefly to make sure any future chain reads will see the updated state. - tokio::time::sleep(Duration::from_secs(1)).await; - } + for (key_set_id, dkg_recovery_keys) in recovery_root_keys { + let mut recovery_keys: Vec = Vec::new(); + let mut hasher = Sha256::default(); + for recovery_key in dkg_recovery_keys { + let pubkey_bytes = match hex_to_bytes(&recovery_key.public_key) { + Ok(pubkey_bytes) => pubkey_bytes, Err(e) => { - debug!("Failed to register pubkey for Recovery dkg w/ err {:?}", e); - debug!("{}", decode_revert(&e, self.backup_recovery_contract.abi())); + debug!("Error converting pubkey to bytes w/: {:?}", e); + return; } - } + }; + hasher.update(&pubkey_bytes); + recovery_keys.push(RecoveryKey { + pubkey: Bytes::from(pubkey_bytes), + key_type: recovery_key.curve_type.into(), + }); } - Err(e) => { - debug!( - "Failed to estimate gas for registerRecoveryKeys w/ err {:?}", - e - ); - debug!("{}", decode_revert(&e, self.backup_recovery_contract.abi())); + let session_id = Bytes::from(hasher.finalize().to_vec()); + + let func = self.backup_recovery_contract.register_recovery_keys( + recovery_keys, + session_id, + key_set_id.clone(), + ); + let gas_estimate = func.estimate_gas().await; + match gas_estimate { + Ok(gas_estimate) => { + let func_with_gas = func.gas(gas_estimate * U256::from(5)); + let result = func_with_gas.send().await; + + match result { + Ok(_) => { + debug!("register pubkey for Recovery dkg"); + + // Once the recovery keys are registered, we sleep briefly to make sure any future chain reads will see the updated state. + tokio::time::sleep(Duration::from_secs(1)).await; + } + Err(e) => { + debug!("Failed to register pubkey for Recovery dkg w/ err {:?}", e); + debug!("{}", decode_revert(&e, self.backup_recovery_contract.abi())); + } + } + } + Err(e) => { + debug!( + "Failed to estimate gas for registerRecoveryKeys w/ err {:?}", + e + ); + debug!("{}", decode_revert(&e, self.backup_recovery_contract.abi())); + } } } } diff --git a/rust/lit-node/lit-node/src/peers/peer_state/listener.rs b/rust/lit-node/lit-node/src/peers/peer_state/listener.rs index 6c3c763b..9131c786 100644 --- a/rust/lit-node/lit-node/src/peers/peer_state/listener.rs +++ b/rust/lit-node/lit-node/src/peers/peer_state/listener.rs @@ -4,7 +4,6 @@ use crate::error::{EC, Result, unexpected_err_code}; use crate::tasks::presign_manager::models::PresignMessage; use ethers::providers::StreamExt; use lit_blockchain::contracts::staking::StakingEvents; -use rocket::serde::{Deserialize, Serialize}; use std::sync::Arc; use tokio::sync::mpsc; @@ -113,15 +112,6 @@ impl PeerState { } } } - StakingEvents::ConfigSetFilter( - global_config_set_event, - ) => { - debug!("Global Config event"); - // update CDM state - if let Err(e) = self.chain_data_config_manager.set_all_config_from_chain().await { - error!("Failed to update chain data manager state: {:?}", e); - } - } StakingEvents::CountOfflinePhaseDataFilter(data_type) => { debug!("CountOfflinePhaseData event: {:?}", data_type); @@ -146,11 +136,3 @@ impl PeerState { Ok(()) } } - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub enum PeerValidatorStatus { - Entering, // Not in current, but in locked next - Exiting, // in current, but not in locked next - Survivor, // in both - Unknown, -} diff --git a/rust/lit-node/lit-node/src/pkp/auth/mod.rs b/rust/lit-node/lit-node/src/pkp/auth/mod.rs index 13992611..7fee3d31 100644 --- a/rust/lit-node/lit-node/src/pkp/auth/mod.rs +++ b/rust/lit-node/lit-node/src/pkp/auth/mod.rs @@ -340,7 +340,7 @@ pub async fn check_pkp_auth( required_scopes: &[usize], bls_root_pubkey: &str, ) -> Result { - use std::io::{Error, ErrorKind}; + use std::io::Error; debug!("auth_context- {:?}", auth_context); @@ -586,17 +586,14 @@ pub async fn check_pkp_auth( ); } - return Err(validation_err_code( - Error::new( - ErrorKind::Other, - format!( - "None of the AuthMethods, AuthSig or Lit Actions meet the required scope {:?}.", - required_scopes - ), - ), + Err(validation_err_code( + Error::other(format!( + "None of the AuthMethods, AuthSig or Lit Actions meet the required scope {:?}.", + required_scopes + )), EC::NodeAuthSigScopeTooLimited, None, - )); + )) } // We need this due to an issue in the SDK which allows user to permit the following 3 formats: diff --git a/rust/lit-node/lit-node/src/pkp/utils.rs b/rust/lit-node/lit-node/src/pkp/utils.rs index b3426844..f9921b78 100644 --- a/rust/lit-node/lit-node/src/pkp/utils.rs +++ b/rust/lit-node/lit-node/src/pkp/utils.rs @@ -22,6 +22,7 @@ use std::sync::Arc; use tracing::instrument; use super::auth::serialize_auth_context_for_checking_against_contract_data; +use crate::models::PubKeyRoutingData; use ethers::{signers::Signer, types::U256}; use lit_blockchain::contracts::load_wallet; use lit_node_core::NodeSet; @@ -375,17 +376,12 @@ pub async fn sign( )); } - let tweak_preimage = get_tweak_preimage_from_pubkey(cfg, &pubkey).await; + let pubkey_routing_data = get_pubkey_routing_data_from_pubkey(cfg, &pubkey).await; let tss_state = tss_state.expect_or_err("tss_state not set in RustJsComms")?; - // if this is a HD key, we need to get the root pubkeys, otherwise check the fs for the key share - let (tweak_preimage, root_pubkeys) = match tweak_preimage { - Ok(_) => { - let tweak_preimage = tweak_preimage.expect_or_err("hd_key_id is None")?; - let temp_signable = tss_state.get_dkg_state(signing_scheme.curve_type())?; - let root_pub_keys = temp_signable.root_keys().await; - (Some(tweak_preimage.to_vec()), Some(root_pub_keys)) - } + // if this is an HD key, we need to get the root pubkeys, otherwise check the fs for the key share + let pubkey_routing_data = match pubkey_routing_data { + Ok(p) => p, Err(_) => { let staker_address = &tss_state.peer_state.hex_staker_address(); @@ -410,6 +406,11 @@ pub async fn sign( pubkey )), )); + } else { + return Err(unexpected_err( + "No pubkey routing data exists".to_string(), + None, + )); } } Err(err) => { @@ -434,15 +435,13 @@ pub async fn sign( None, )); } - }; - - (None, None) + } } }; trace!( - "sign() pubkey: {}, hd_key_id: {:?}, root_pubkeys: {:?}", - pubkey, tweak_preimage, root_pubkeys + "sign() pubkey: {}, routing data: {:?}", + pubkey, pubkey_routing_data ); let mut signing_state = tss_state.get_signing_state(signing_scheme)?; @@ -457,9 +456,9 @@ pub async fn sign( .sign_with_pubkey( to_sign, public_key, - root_pubkeys, - tweak_preimage, + Some(pubkey_routing_data.tweak_preimage.to_vec()), request_id.clone(), + Some(&pubkey_routing_data.key_set_identifier), epoch, node_set, ) @@ -471,8 +470,11 @@ pub async fn sign( Ok(sign_result) } -#[instrument(level = "debug", skip(cfg))] -pub async fn get_tweak_preimage_from_pubkey(cfg: &LitConfig, pubkey: &str) -> Result<[u8; 32]> { +#[instrument(skip(cfg), level = "debug")] +pub async fn get_pubkey_routing_data_from_pubkey( + cfg: &LitConfig, + pubkey: &str, +) -> Result { let resolver = ContractResolver::try_from(cfg) .map_err(|e| unexpected_err_code(e, EC::NodeContractResolverConversionFailed, None))?; let contract = resolver.pub_key_router_contract(cfg).await?; @@ -489,11 +491,12 @@ pub async fn get_tweak_preimage_from_pubkey(cfg: &LitConfig, pubkey: &str) -> Re Some("Could not find token id in pubkey routing contract.".to_string()), ) })?; - Ok(pubkey_routing_data.derived_key_id) + pubkey_routing_data.try_into() } pub async fn vote_for_root_key( cfg: &LitConfig, + key_set_id: &str, root_keys: Vec, peer_state: &Arc, ) -> Result { @@ -506,11 +509,8 @@ pub async fn vote_for_root_key( let contract = resolver .pub_key_router_contract_with_gas_relay(cfg, peer_state.wallet_keys.signing_key().clone()) .await?; - let func = contract.vote_for_root_keys( - staking_contract_address, - crate::tss::util::DEFAULT_KEY_SET_NAME.to_string(), - root_keys, - ); + let func = + contract.vote_for_root_keys(staking_contract_address, key_set_id.to_string(), root_keys); let gas_estimate = match func.estimate_gas().await { Ok(gas_estimate) => gas_estimate, diff --git a/rust/lit-node/lit-node/src/siwe_db/db.rs b/rust/lit-node/lit-node/src/siwe_db/db.rs index 70baa362..e4d49f9d 100644 --- a/rust/lit-node/lit-node/src/siwe_db/db.rs +++ b/rust/lit-node/lit-node/src/siwe_db/db.rs @@ -439,7 +439,7 @@ mod siwe_db_tests { .query_row( "SELECT COUNT(*) FROM blockhash_timestamp", params![], - |row| (row.get::<_, i64>(0)), + |row| row.get::<_, i64>(0), ) .unwrap(); diff --git a/rust/lit-node/lit-node/src/tasks/fsm/epoch_change.rs b/rust/lit-node/lit-node/src/tasks/fsm/epoch_change.rs index a463a258..3cdc1ee3 100644 --- a/rust/lit-node/lit-node/src/tasks/fsm/epoch_change.rs +++ b/rust/lit-node/lit-node/src/tasks/fsm/epoch_change.rs @@ -1,19 +1,76 @@ use crate::config::chain::CachedRootKey; -use crate::error::unexpected_err; +use crate::models::KeySetConfig; +use crate::peers::PeerState; use crate::peers::peer_state::models::SimplePeerCollection; use crate::tasks::fsm::utils::parse_epoch_number_from_dkg_id; +use crate::tss::common::curve_state::CurveState; use crate::tss::common::dkg_type::DkgType; use crate::tss::common::key_persistence::RECOVERY_DKG_EPOCH; use crate::tss::common::traits::fsm_worker_metadata::FSMWorkerMetadata; use crate::tss::dkg::manager::DkgManager; +use crate::version::DataVersionReader; use ethers::types::U256; use lit_core::error::Result; +use lit_node_core::CurveType; +use std::collections::HashMap; use std::sync::Arc; use tracing::instrument; use super::utils::get_current_and_new_peer_addresses; use super::utils::key_share_proofs_check; +/// Options for shadow splicing operations. +/// +/// When `is_shadow` is true, `epoch_number` and `realm_id` refer to the shadow realm, +/// while `non_shadow_*` fields refer to the base/source realm being shadowed. +/// When `is_shadow` is false, all epoch/realm fields should have matching values. +#[derive(Debug, Clone)] +pub struct ShadowOptions { + /// Whether this is a shadow realm operation. + pub is_shadow: bool, + /// The epoch number (shadow epoch when `is_shadow` is true). + pub epoch_number: u64, + /// The realm ID (shadow realm when `is_shadow` is true). + pub realm_id: u64, + /// The base/source realm ID being shadowed. + pub non_shadow_realm_id: u64, + /// The base/source epoch number being shadowed. + pub non_shadow_epoch_number: u64, +} + +impl ShadowOptions { + pub fn new( + is_shadow: bool, + epoch_number: u64, + realm_id: u64, + non_shadow_epoch_number: u64, + non_shadow_realm_id: u64, + ) -> Self { + Self { + is_shadow, + epoch_number, + realm_id, + non_shadow_realm_id, + non_shadow_epoch_number, + } + } + + pub fn new_empty(is_shadow: bool) -> Self { + Self { + is_shadow, + epoch_number: 0, + realm_id: 0, + non_shadow_realm_id: 0, + non_shadow_epoch_number: 0, + } + } +} + +struct EpochChangeResOrUpdateNeeded { + pub epoch_change_res: Option>>>, + pub update_req: Option, +} + // only log the epoch number field #[instrument(level = "debug", skip(dkg_manager, fsm_worker_metadata))] pub(crate) async fn perform_epoch_change( @@ -22,20 +79,11 @@ pub(crate) async fn perform_epoch_change( realm_id: u64, is_shadow: bool, epoch_number: U256, -) -> Result>> { - struct EpochChangeResOrUpdateNeeded { - pub epoch_change_res: Option>>, - pub update_req: Option, - } - +) -> Option>> { let peer_state = dkg_manager.tss_state.peer_state.clone(); - let cfg = dkg_manager.tss_state.lit_config.clone(); - - // Derive the DKG ID. let mut fsm_worker_lifecycle_id = fsm_worker_metadata.get_lifecycle_id(realm_id); - - // We keep looping until we get a result from a completed epoch change operation. let mut latest_dkg_id = "".to_string(); + // We keep looping until we get a result from a completed epoch change operation. let mut abort_and_restart_count = 0; // We currently set the limit of aborts and restarts to be a high number to avoid infinite loops. This should never happen, @@ -49,11 +97,11 @@ pub(crate) async fn perform_epoch_change( // make sure peers are up to date, across potential abort + restarts. let (current_peers, new_peers) = - match get_current_next_dkg_peers(dkg_manager, realm_id, is_shadow).await { + match get_dkg_peers_and_keysets(dkg_manager, realm_id, is_shadow).await { Ok((current_peers, new_peers)) => (current_peers, new_peers), Err(e) => { - error!("Error in get_current_next_dkg_peers: {}", e); - return Err(e); + warn!("get_current_next_dkg_peers failed: {}", e); + return None; } }; @@ -61,77 +109,133 @@ pub(crate) async fn perform_epoch_change( latest_dkg_id = dkg_id.clone(); // when you start with a shadow node, they are going to read the "original" key (from the src realm) .... - let shadow_key_opts = match is_shadow { - true => { - trace!("Getting key epoch number for shadow realm"); - let base_realm_id = peer_state.realm_id(); - let base_epoch_number = peer_state.get_epoch(base_realm_id).await; - - let base_epoch_number = match base_epoch_number { - Ok(base_epoch_number) => base_epoch_number.1, - Err(e) => { - error!( - "Error in get_epoch for base epoch when shadow node is starting: {}", - e - ); - continue; - } - }; - - trace!("Base epoch number: {}", base_epoch_number); - (base_epoch_number.as_u64(), base_realm_id) - } - false => (epoch_number.as_u64(), realm_id), - }; + let shadow_key_opts = + get_shadow_key_opts(&peer_state, is_shadow, epoch_number, realm_id).await; + if shadow_key_opts.epoch_number == 0 && is_shadow { + warn!( + "Shadow realm is not ready yet, aborting the epoch change attempt #{}.", + abort_and_restart_count + ); + continue; + } let current_epoch = epoch_number.as_u64(); - let epoch_change_res_or_update_needed = tokio::select! { - // We stop polling the other future as soon as `yield_until_update` returns, and - // after we parse the lifecycle IDs. - new_lifecycle_id = fsm_worker_metadata.yield_until_update(realm_id) => { - let existing_lifecycle_id = fsm_worker_metadata.get_lifecycle_id(realm_id); - info!("FSMWorkerMetadata is outdated, updating the lifecycle id from {} to {} in realm {}, aborting the current epoch change and restarting with the new updated lifecycle id", existing_lifecycle_id, new_lifecycle_id, realm_id); - EpochChangeResOrUpdateNeeded { - epoch_change_res: None, - update_req: Some(new_lifecycle_id), - } + // If we are going to generate a new keyset, we need to ensure that the threshold of an existing keyset is not changed. + // The exception to this is when the current peer set is not yet populated, in which case we can create one or more new keysets. + // If the current peer set is not empty and not equivalent to the new peer set, we need to skip the DKG creation for this epoch. + // let (key_sets_to_use, current_peers_to_use) = if empty_key_sets.is_empty() { + // (keysets, current_peers) + // } else { + // if current_peers != new_peers && !current_peers.is_empty() { + // warn!( + // "When creating a new set of root keys, current peers should be empty or equivalent to new peers. Skipping the DKG creation for this epoch." + // ); + // (full_key_sets, current_peers) + // } else { + // (empty_key_sets, SimplePeerCollection(vec![])) + // } + // }; + + let (existing_key_sets, new_key_sets) = match get_existing_and_new_key_sets( + peer_state.clone(), + ) + .await + { + Ok((existing_key_sets, new_key_sets)) => (existing_key_sets, new_key_sets), + Err(e) => { + warn!( + "Unable to get existing and new key sets when performing epoch change in realm {}: {}", + realm_id, e + ); + return None; } + }; - res = dkg_manager.change_epoch(&latest_dkg_id, current_epoch, shadow_key_opts, realm_id, ¤t_peers, &new_peers) => { - if res.is_ok() { - let epoch = match dkg_manager.dkg_type { - DkgType::RecoveryParty => RECOVERY_DKG_EPOCH, - DkgType::Standard => current_epoch + 1, - }; + trace!( + "New/existing key sets: {:?} / {:?}", + new_key_sets + .iter() + .map(|ks| ks.identifier.clone()) + .collect::>(), + existing_key_sets + .iter() + .map(|ks| ks.identifier.clone()) + .collect::>() + ); - let lifecycle_id = fsm_worker_metadata.get_lifecycle_id(realm_id); - match key_share_proofs_check(&dkg_manager.tss_state, &res, &new_peers, &latest_dkg_id, realm_id, epoch, lifecycle_id).await { - Err(e) => { - error!("Key share proofs check failed in realm {}: {}", realm_id, e); - return Err(e); - }, - Ok(()) => { - debug!("Key share proofs check passed for realm {}", realm_id); - } - } - } - EpochChangeResOrUpdateNeeded { - epoch_change_res: Some(res.inspect_err(|e| error!("DKG error: {}", e)).ok()), - update_req: None, + // start by processing the epoch change for the new key sets + let mut epoch_change_res_or_update_needed_for_new_keys = None; + if !new_key_sets.is_empty() { + trace!("Processing epoch change for new key sets"); + if current_peers != new_peers && !current_peers.is_empty() { + warn!( + "When creating a new set of root keys, current peers should be empty or equivalent to new peers. DKG will not be performed until the keyset is removed or the current peer set is equivalent to the new peer set." + ); + return None; + } + let empty_peers = SimplePeerCollection(vec![]); + epoch_change_res_or_update_needed_for_new_keys = match process_epoch_for_key_set( + dkg_manager, + fsm_worker_metadata.clone(), + realm_id, + is_shadow, + &new_key_sets, + &latest_dkg_id, + current_epoch, + &shadow_key_opts, + &empty_peers, + &new_peers, + None, + ) + .await + { + Ok(result) => Some(result), + Err(e) => { + warn!( + "Unable to process epoch change for new key sets when performing epoch change in realm {}: {}", + realm_id, e + ); + return None; } + }; + } + + trace!("Processing epoch change for existing key sets"); + let epoch_change_res_or_update_needed = match process_epoch_for_key_set( + dkg_manager, + fsm_worker_metadata.clone(), + realm_id, + is_shadow, + &existing_key_sets, + &latest_dkg_id, + current_epoch, + &shadow_key_opts, + ¤t_peers, + &new_peers, + epoch_change_res_or_update_needed_for_new_keys, + ) + .await + { + Ok(result) => result, + Err(e) => { + warn!( + "Unable to process epoch change for existing key sets when performing epoch change in realm {}: {}", + realm_id, e + ); + return None; } }; let (post_current_peers, post_new_peers) = - match get_current_next_dkg_peers(dkg_manager, realm_id, is_shadow).await { + match get_dkg_peers_and_keysets(dkg_manager, realm_id, is_shadow).await { Ok((current_peers, new_peers)) => (current_peers, new_peers), Err(e) => { error!( "Error in get_current_next_dkg_peers in realm {}: {}", realm_id, e ); - return Err(e); + return None; } }; @@ -148,7 +252,7 @@ pub(crate) async fn perform_epoch_change( } // If there is a result, we immediately return the result. if let Some(res) = epoch_change_res_or_update_needed.epoch_change_res { - return Ok(res); + return res; } // If we are here, that means that we need to update the lifecycle ID and restart the epoch change. @@ -156,10 +260,7 @@ pub(crate) async fn perform_epoch_change( Some(new_lifecycle_id) => new_lifecycle_id, None => { error!("epoch_change_res_or_update_needed.update_req is None"); - return Err(unexpected_err( - "epoch_change_res_or_update_needed.update_req is None", - None, - )); + return None; } }; @@ -169,7 +270,7 @@ pub(crate) async fn perform_epoch_change( Ok(existing_epoch_number) => existing_epoch_number, Err(e) => { error!("Error in parse_epoch_number_from_dkg_id: {}", e); - return Err(e); + return None; } }; trace!( @@ -196,10 +297,139 @@ pub(crate) async fn perform_epoch_change( // If we are here, that means that we have aborted and restarted the epoch change too many times. Just return a failure. error!("Aborted and restarted the epoch change too many times. Aborting the epoch change."); - Err(unexpected_err( - "Aborted and restarted the epoch change too many times. Aborting the epoch change.", - None, - )) + None +} + +#[allow(clippy::too_many_arguments)] +async fn process_epoch_for_key_set( + dkg_manager: &DkgManager, + fsm_worker_metadata: Arc>, + realm_id: u64, + is_shadow: bool, + key_sets: &Vec, + latest_dkg_id: &str, + current_epoch: u64, + shadow_key_opts: &ShadowOptions, + current_peers: &SimplePeerCollection, + new_peers: &SimplePeerCollection, + existing_epoch_change_res_or_update_needed: Option, +) -> Result { + let existing_keys = match existing_epoch_change_res_or_update_needed { + Some(EpochChangeResOrUpdateNeeded { + epoch_change_res: Some(existing_keys), + update_req: None, + }) => existing_keys, + _ => None, + }; + + let epoch_change_res_or_update_needed = tokio::select! { + // We stop polling the other future as soon as `yield_until_update` returns, and + // after we parse the lifecycle IDs. + new_lifecycle_id = fsm_worker_metadata.yield_until_update(realm_id) => { + let existing_lifecycle_id = fsm_worker_metadata.get_lifecycle_id(realm_id); + info!("FSMWorkerMetadata is outdated, updating the lifecycle id from {} to {} in realm {}, aborting the current epoch change and restarting with the new updated lifecycle id", existing_lifecycle_id, new_lifecycle_id, realm_id); + EpochChangeResOrUpdateNeeded { + epoch_change_res: None, + update_req: Some(new_lifecycle_id), + } + } + + res = dkg_manager.change_epoch(latest_dkg_id, current_epoch, shadow_key_opts, realm_id, current_peers, new_peers, key_sets) => { + match res { + Ok(res) => { + let epoch = match dkg_manager.dkg_type { + DkgType::RecoveryParty => RECOVERY_DKG_EPOCH, + DkgType::Standard => current_epoch + 1, + }; + + let lifecycle_id = fsm_worker_metadata.get_lifecycle_id(realm_id); + if false { + match key_share_proofs_check(&dkg_manager.tss_state, &res, new_peers, latest_dkg_id, realm_id, epoch, lifecycle_id).await { + Err(e) => { + warn!("Key share proofs check failed in realm {}: {}", realm_id, e); + return Err(e); + }, + Ok(()) => { + debug!("Key share proofs check passed for realm {}", realm_id); + } + } + } + let mut res = res; + if let Some(existing_keys) = existing_keys { + res.extend(existing_keys); + } + + EpochChangeResOrUpdateNeeded { + epoch_change_res: Some(Some(res)), + update_req: None, + } + } + Err(e) => { + if is_shadow { + error!("DKG error for shadow realm {} / epoch {} : {:?}", realm_id, shadow_key_opts.epoch_number, e); + } else { + error!("DKG error for realm {} {:?}", realm_id, e); + } + return Err(e); + } + } + + } + }; + + Ok(epoch_change_res_or_update_needed) +} + +async fn get_shadow_key_opts( + peer_state: &PeerState, + is_shadow: bool, + epoch_number: U256, + realm_id: u64, +) -> ShadowOptions { + if is_shadow { + let shadow_realm_id = peer_state.shadow_realm_id(); + let shadow_epoch_details = peer_state.get_epoch(shadow_realm_id).await; + + let non_shadow_realm_id = peer_state.realm_id(); + let non_shadow_epoch_details = peer_state.get_epoch(non_shadow_realm_id).await; + + let shadow_epoch_number = match shadow_epoch_details { + Ok(shadow_epoch_details) => shadow_epoch_details.1.as_u64(), + Err(e) => { + warn!( + "get_epoch failed for base epoch when shadow node is starting: {}", + e + ); + return ShadowOptions::new_empty(true); + } + }; + let non_shadow_epoch_number = match non_shadow_epoch_details { + Ok(non_shadow_epoch_details) => non_shadow_epoch_details.1.as_u64(), + Err(e) => { + warn!( + "get_epoch failed for non-shadow epoch when shadow node is starting: {}", + e + ); + return ShadowOptions::new_empty(true); + } + }; + trace!("Shadow epoch number: {}", shadow_epoch_number); + ShadowOptions::new( + true, + shadow_epoch_number, + shadow_realm_id, + non_shadow_epoch_number, + non_shadow_realm_id, + ) + } else { + ShadowOptions::new( + false, + epoch_number.as_u64(), + realm_id, + epoch_number.as_u64(), + realm_id, + ) + } } pub fn derive_dkg_id( @@ -217,7 +447,62 @@ pub fn derive_dkg_id( ) } -pub async fn get_current_next_dkg_peers( +pub async fn get_existing_and_new_key_sets( + peer_state: Arc, +) -> Result<(Vec, Vec)> { + // if there are any key sets that are empty, we need to generate new root keys for them. + // we'll skip doing a regular DKG for already generated root keys / key sets during this epoch change. + let cdm = &peer_state.chain_data_config_manager; + let keysets = DataVersionReader::read_field_unchecked(&cdm.key_sets, |key_sets| { + key_sets.values().cloned().collect::>() + }); + + let mut new_key_sets = Vec::new(); + let mut existing_key_sets = Vec::new(); + for keyset in &keysets { + let curve_type = CurveType::K256; // should inspect the keyset and determine the curve type + let key_set_identifier = Some(keyset.identifier.clone()); + let curve_state = CurveState::new(peer_state.clone(), curve_type, key_set_identifier); + let root_keys = curve_state.root_keys(); + + // we assume that if some keys are present, then all keys are present. + match root_keys { + Ok(root_keys) => { + if root_keys.is_empty() { + new_key_sets.push(keyset.clone()); + } else { + existing_key_sets.push(keyset.clone()); + } + } + Err(e) => { + // this is temporary until we have a proper way to get the root keys from the chain. + warn!( + "Error in getting root keys, thus key set {} will be treated as a new key set: {}", + keyset.identifier, e + ); + new_key_sets.push(keyset.clone()); + } + } + } + + trace!( + "Full key sets: {:?}", + existing_key_sets + .iter() + .map(|ks| ks.identifier.clone()) + .collect::>() + ); + trace!( + "Empty key sets: {:?}", + new_key_sets + .iter() + .map(|ks| ks.identifier.clone()) + .collect::>() + ); + Ok((existing_key_sets, new_key_sets)) +} + +pub async fn get_dkg_peers_and_keysets( dkg_manager: &DkgManager, realm_id: u64, is_shadow: bool, diff --git a/rust/lit-node/lit-node/src/tasks/fsm/mod.rs b/rust/lit-node/lit-node/src/tasks/fsm/mod.rs index 682f02fd..be909317 100644 --- a/rust/lit-node/lit-node/src/tasks/fsm/mod.rs +++ b/rust/lit-node/lit-node/src/tasks/fsm/mod.rs @@ -25,6 +25,7 @@ use lit_node_common::{ client_state::ClientState, config::{CFG_KEY_CHAIN_POLLING_INTERVAL_MS_DEFAULT, LitNodeConfig}, }; +use std::collections::HashMap; use std::sync::Arc; use std::time::Duration; use tokio::sync::mpsc; @@ -42,7 +43,11 @@ pub async fn node_fsm_worker( ) { let peer_state = standard_dkg_manager.tss_state.peer_state.clone(); let cfg = standard_dkg_manager.tss_state.lit_config.clone(); - let realm_id = fsm_realm_id(&peer_state, is_shadow).await; + + let mut root_keys = HashMap::>::new(); + let mut epoch_to_signal_ready = U256::from(0); + let mut previous_included_epoch_number = U256::from(0); // Any initial value will work + let mut previous_retries = U256::from(0); let interval_ms = cfg .load_full() .chain_polling_interval_ms() @@ -50,10 +55,7 @@ pub async fn node_fsm_worker( // These are the state changing variables that are used throughout the FSM loop. let mut interval = tokio::time::interval(Duration::from_millis(interval_ms)); - let mut root_keys: Vec = Vec::new(); - let mut epoch_to_signal_ready = U256::from(0); - let mut previous_included_epoch_number = U256::from(0); // Any initial value will work - let mut previous_retries = U256::from(0); + let realm_id = fsm_realm_id(&peer_state, is_shadow).await; // initialize the node state let mut node_state = NodeState::new(); node_state.next(Transition::Init); @@ -161,7 +163,7 @@ pub async fn node_fsm_worker( } // if the epoch seems to have jumped, we need to figure out why and handle it. - if epoch_number > previous_included_epoch_number { + if epoch_number >= previous_included_epoch_number { // this could be the state if we haven't checked the chain - check it and continue. if network_state == NetworkState::NextValidatorSetLocked { wait_on_next_validator_set_locked( @@ -250,15 +252,9 @@ pub async fn node_fsm_worker( // Get the root keys from the epoch change results root_keys = match epoch_change_results { - Ok(root_keys_result) => match root_keys_result { - Some(root_keys) => root_keys, - None => { - debug!("root_keys_result == None for realm {}", realm_id); - continue; - } - }, - Err(e) => { - error!("Error in perform_epoch_change: {}", e); + Some(root_keys) => root_keys, + None => { + debug!("root_keys_result == None for realm {}", realm_id); continue; } }; @@ -511,13 +507,13 @@ pub async fn get_fsm_state( } pub async fn check_root_key_voting( - root_keys: &mut Vec, + root_keys: &mut HashMap>, cfg: &ReloadableLitConfig, peer_state: &Arc, epoch_number: U256, ) { if !root_keys.is_empty() && epoch_number >= U256::from(1) { - match vote_for_root_pubkeys(cfg, root_keys.clone(), peer_state).await { + match vote_for_root_pubkeys(cfg, root_keys, peer_state).await { Ok(result) => { if !result { info!("vote_for_root_pubkeys returned false"); @@ -535,9 +531,10 @@ pub async fn check_root_key_voting( } } } + pub async fn vote_for_root_pubkeys( cfg: &ReloadableLitConfig, - pubkeys: Vec, + pubkeys: &HashMap>, peer_state: &Arc, ) -> Result { use crate::pkp::utils::vote_for_root_key; @@ -545,19 +542,21 @@ pub async fn vote_for_root_pubkeys( info!("incoming root pubkeys: {:?}", pubkeys); - let mut root_keys: Vec = Vec::new(); - - for dkg_root_key in pubkeys { - let pk_bytes = hex_to_bytes(&dkg_root_key.public_key)?; - let rootkey = RootKey { - pubkey: Bytes::from(pk_bytes), - key_type: dkg_root_key.curve_type.into(), - }; - root_keys.push(rootkey); + let mut res = true; + for (key_set_id, dkg_root_key) in pubkeys { + let mut root_keys: Vec = Vec::with_capacity(dkg_root_key.len()); + for key in dkg_root_key { + let pk_bytes = hex_to_bytes(&key.public_key)?; + let rootkey = RootKey { + pubkey: Bytes::from(pk_bytes), + key_type: key.curve_type.into(), + }; + root_keys.push(rootkey); + } + info!("Root Keys to vote for: {:?}", root_keys); + res &= vote_for_root_key(&cfg.load_full(), key_set_id, root_keys, peer_state).await?; } - - info!("Root Keys to vote for: {:?}", root_keys); - vote_for_root_key(&cfg.load_full(), root_keys, peer_state).await + Ok(res) } pub async fn handle_not_part_of_validators_union( @@ -671,14 +670,6 @@ async fn check_recovery_dkg_complete( ) .await; - let recovery_keys_result = match recovery_keys_result { - Ok(recovery_keys_result) => recovery_keys_result, - Err(e) => { - error!("Error in perform_epoch_change: {}", e); - return false; - } - }; - // NOTE: We can't continue until it's registered on chain as other nodes won't know that the Recovery DKG is completed so they should keep on waiting let recovery_keys_result = match recovery_keys_result { Some(recovery_keys) => recovery_keys, diff --git a/rust/lit-node/lit-node/src/tasks/fsm/restore.rs b/rust/lit-node/lit-node/src/tasks/fsm/restore.rs index 70ec0c79..e6a5d7bf 100644 --- a/rust/lit-node/lit-node/src/tasks/fsm/restore.rs +++ b/rust/lit-node/lit-node/src/tasks/fsm/restore.rs @@ -172,10 +172,18 @@ pub async fn do_network_restore( continue; } }; + let use_raw_peer_ids = match restore_state.pull_use_raw_peer_ids().await { + Ok(use_raw_peer_ids) => use_raw_peer_ids, + Err(e) => { + error!("RestoredState: Failed to pull use raw peer ids: {}", e); + continue; + } + }; standard_dkg_manager.next_dkg_after_restore = DkgAfterRestore::True(DkgAfterRestoreData { peers: vec![], key_cache, + use_raw_peer_ids, }); report_progress(&cfg, NodeRecoveryStatus::AllKeysAreRestored).await; @@ -217,37 +225,38 @@ pub async fn do_network_restore( // Wait until the network is active again loop { - if let Ok(state) = peer_state.network_state(realm_id).await { - if state != NetworkState::Restore && state != NetworkState::Paused { - let recovered_peer_ids = match restore_state - .pull_recovered_peer_ids(&cfg.load_full()) - .await - { - Ok(ids) => ids, - Err(e) => { - error!( - "RestoredState: Failed to read the recovered peer ids: {}", - e - ); - // Try again - continue; - } - }; - let data = match standard_dkg_manager.next_dkg_after_restore.take() { - Some(mut data) => { - data.peers = recovered_peer_ids; - data - } - None => DkgAfterRestoreData { - peers: recovered_peer_ids, - ..Default::default() - }, - }; - standard_dkg_manager.next_dkg_after_restore = DkgAfterRestore::True(data); - - info!("RestoreState: Exiting recovery code, starting the fsm loop."); - break; - } + if let Ok(state) = peer_state.network_state(realm_id).await + && state != NetworkState::Restore + && state != NetworkState::Paused + { + let recovered_peer_ids = match restore_state + .pull_recovered_peer_ids(&cfg.load_full()) + .await + { + Ok(ids) => ids, + Err(e) => { + error!( + "RestoredState: Failed to read the recovered peer ids: {}", + e + ); + // Try again + continue; + } + }; + let data = match standard_dkg_manager.next_dkg_after_restore.take() { + Some(mut data) => { + data.peers = recovered_peer_ids; + data + } + None => DkgAfterRestoreData { + peers: recovered_peer_ids, + ..Default::default() + }, + }; + standard_dkg_manager.next_dkg_after_restore = DkgAfterRestore::True(data); + + info!("RestoreState: Exiting recovery code, starting the fsm loop."); + break; } } } diff --git a/rust/lit-node/lit-node/src/tasks/fsm/utils.rs b/rust/lit-node/lit-node/src/tasks/fsm/utils.rs index db7520c5..34d6580e 100644 --- a/rust/lit-node/lit-node/src/tasks/fsm/utils.rs +++ b/rust/lit-node/lit-node/src/tasks/fsm/utils.rs @@ -8,7 +8,7 @@ use crate::tss::common::tss_state::TssState; use crate::utils::key_share_proof::{ KeyShareProofs, compute_key_share_proofs, verify_key_share_proofs, }; -use crate::version::get_version; +use crate::version::{DataVersionReader, get_version}; use ethers::types::U256; use lit_blockchain::contracts::staking::Version; use lit_core::error::Result; @@ -142,7 +142,7 @@ pub(crate) async fn fsm_realm_id(peer_state: &Arc, is_shadow: bool) - pub(crate) async fn key_share_proofs_check( tss_state: &Arc, - root_key_res: &Result>, + root_key_res: &HashMap>, peers: &SimplePeerCollection, latest_dkg_id: &str, realm_id: u64, @@ -154,108 +154,124 @@ pub(crate) async fn key_share_proofs_check( return Ok(()); // no need to compute key share proofs } - let mut root_keys = Vec::new(); - if let Ok(rk) = root_key_res { - if !rk.is_empty() { - root_keys = rk.clone(); - } - } - if root_keys.is_empty() { - root_keys = tss_state.chain_data_config_manager.root_keys(); - } - - trace!("Root keys for key share proofs: {:?}", root_keys); - let mut root_keys_map = HashMap::>::with_capacity(root_keys.len()); - for root_key in root_keys { - root_keys_map - .entry(root_key.curve_type) - .and_modify(|v| v.push(root_key.public_key.clone())) - .or_insert(vec![root_key.public_key.clone()]); + let mut root_keys = HashMap::new(); + if !root_key_res.is_empty() { + root_keys = root_key_res.clone(); } + trace!( + "Key share proofs check incoming root keys - root keys {:?}", + root_keys + ); + let root_keys_map: Vec<(String, HashMap>)> = if root_keys.is_empty() { + DataVersionReader::read_field_unchecked( + &tss_state.chain_data_config_manager.key_sets, + |key_sets| { + key_sets + .values() + .map(|config| (config.identifier.clone(), config.root_keys_by_curve.clone())) + .collect() + }, + ) + } else { + let mut map = Vec::with_capacity(root_keys.len()); + for (identifier, keys) in &root_keys { + let l = keys.len(); + let mut dkg_keys = HashMap::with_capacity(l); + for k in keys { + dkg_keys + .entry(k.curve_type) + .and_modify(|v: &mut Vec| v.push(k.public_key.clone())) + .or_insert_with(|| { + let mut v = Vec::with_capacity(l); + v.push(k.public_key.clone()); + v + }); + } + map.push((identifier.clone(), dkg_keys)); + } + map + }; + trace!("Key share proof check - root keys: {:?}", root_keys_map); - let noonce = format!("{}-{}", epoch, lifecycle_id); - trace!("Key share proofs nonce signed: {}", noonce); - - let proofs = compute_key_share_proofs( - &noonce, - &root_keys_map, - &tss_state.addr, - peers, - realm_id, - epoch, - ) - .await?; - trace!("Key share proofs generated"); + for (identifier, map) in &root_keys_map { + let noonce = format!("{}-{}-{}", epoch, lifecycle_id, identifier); + trace!("Key share proofs nonce signed: {}", noonce); + let proofs = + compute_key_share_proofs(&noonce, map, &tss_state.addr, peers, realm_id, epoch).await?; + trace!("Key share proofs generated"); - let txn_prefix = format!( - "KEYSHAREPROOFS_{}-{}_1_{}_{}", - epoch, - lifecycle_id, - peers.hash(), - realm_id - ); + let txn_prefix = format!( + "KEYSHAREPROOFS_{}-{}_1_{}_{}", + epoch, + lifecycle_id, + peers.hash(), + realm_id + ); - let cm = CommsManager::new_with_peers(tss_state, &txn_prefix, peers, "10").await?; + let cm = CommsManager::new_with_peers(tss_state, &txn_prefix, peers, "10").await?; - let received: Vec<(PeerId, KeyShareProofs)> = cm.broadcast_and_collect(&proofs).await?; - trace!("Received key share proofs: {}", received.len()); + let received: Vec<(PeerId, KeyShareProofs)> = cm.broadcast_and_collect(&proofs).await?; + trace!("Received key share proofs: {}", received.len()); - let mut any_failed = false; - for (peer_id, key_share_proofs) in received { - trace!( - "Key share proofs for peer: {} - {}", - peer_id, - key_share_proofs.proofs.len() - ); - let peer = peers.peer_by_id(&peer_id)?; - let res = verify_key_share_proofs( - &root_keys_map, - &noonce, - &tss_state.addr, - &peer.socket_address, - &tss_state.peer_state.hex_staker_address(), - &key_share_proofs, - peers, - epoch, - realm_id, - ) - .await?; + let mut any_failed = false; + for (peer_id, key_share_proofs) in received { + trace!( + "Key share proofs for peer: {} - {}", + peer_id, + key_share_proofs.proofs.len() + ); + let peer = peers.peer_by_id(&peer_id)?; + let res = verify_key_share_proofs( + map, + &noonce, + &tss_state.addr, + &peer.socket_address, + &tss_state.peer_state.hex_staker_address(), + &key_share_proofs, + peers, + epoch, + realm_id, + ) + .await?; - for (curve, result) in res { - if result.is_err() { - if !any_failed { - any_failed = true; - error!( - "Key share proof verification failed for peer {} - curve {}: {:?} - complaining", - peer.socket_address, curve, result - ); - tss_state - .peer_state - .complaint_channel - .send_async(PeerComplaint { - complainer: tss_state.peer_state.addr.clone(), - issue: Issue::KeyShareValidationFailure(curve), - peer_node_staker_address: peer.staker_address, - peer_node_socket_address: peer.socket_address.clone(), - }) - .await - .map_err(|e| unexpected_err(e, Some("Unable to complain".to_string())))?; - } else { - error!( - "Key share proof verification failed for peer {} - curve {}: {:?} - already complainted for this DKG.", - peer.socket_address, curve, result - ); + for (curve, result) in res { + if result.is_err() { + if !any_failed { + any_failed = true; + error!( + "Key share proof verification failed for peer {} - curve {}: {:?} - complaining", + peer.socket_address, curve, result + ); + tss_state + .peer_state + .complaint_channel + .send_async(PeerComplaint { + complainer: tss_state.peer_state.addr.clone(), + issue: Issue::KeyShareValidationFailure(curve), + peer_node_staker_address: peer.staker_address, + peer_node_socket_address: peer.socket_address.clone(), + }) + .await + .map_err(|e| { + unexpected_err(e, Some("Unable to complain".to_string())) + })?; + } else { + error!( + "Key share proof verification failed for peer {} - curve {}: {:?} - already complained for this DKG.", + peer.socket_address, curve, result + ); + } } } } + if any_failed { + return Err(unexpected_err( + "Key share proof verification failed".to_string(), + None, + )); + } + trace!("Valid key share proofs for key set {}", identifier); } - if any_failed { - return Err(unexpected_err( - "Key share proof verification failed".to_string(), - None, - )); - } - trace!("Valid key share proofs"); Ok(()) } diff --git a/rust/lit-node/lit-node/src/tasks/payment.rs b/rust/lit-node/lit-node/src/tasks/payment.rs index 9700f0c6..27f462f4 100644 --- a/rust/lit-node/lit-node/src/tasks/payment.rs +++ b/rust/lit-node/lit-node/src/tasks/payment.rs @@ -3,8 +3,8 @@ use ethers::middleware::SignerMiddleware; use ethers::providers::{Http, PendingTransaction, Provider}; use ethers::signers::{Signer, Wallet}; use ethers::types::{Bytes, TxHash, U256}; -use k256::ecdsa::SigningKey; use lit_blockchain::util::ether::middleware::EIP2771GasRelayerMiddleware; +use lit_rust_crypto::k256::ecdsa::SigningKey; use std::sync::Arc; use std::time::Duration; use tokio::sync::mpsc; diff --git a/rust/lit-node/lit-node/src/tasks/peer_checker.rs b/rust/lit-node/lit-node/src/tasks/peer_checker.rs index e110d070..2dc7e597 100644 --- a/rust/lit-node/lit-node/src/tasks/peer_checker.rs +++ b/rust/lit-node/lit-node/src/tasks/peer_checker.rs @@ -9,6 +9,7 @@ use std::time::{Duration, Instant}; use tokio::sync::mpsc; use tokio::time::MissedTickBehavior; +#[allow(clippy::large_enum_variant)] #[derive(Debug, Clone)] pub enum PeerCheckerMessage { AddPeer(PeerItem), @@ -95,6 +96,7 @@ pub async fn peer_checker_worker( info!("Stopped: tasks::peer_checker_worker"); } +#[allow(clippy::collapsible_if)] async fn check_for_peer_updates( peer_state: &Arc, peer_checker_tx: &flume::Sender, diff --git a/rust/lit-node/lit-node/src/tasks/presign_manager/finder.rs b/rust/lit-node/lit-node/src/tasks/presign_manager/finder.rs index c1c1f37c..23b7fb51 100644 --- a/rust/lit-node/lit-node/src/tasks/presign_manager/finder.rs +++ b/rust/lit-node/lit-node/src/tasks/presign_manager/finder.rs @@ -11,10 +11,10 @@ use crate::tss::common::storage::read_presign_from_disk_direct; use async_std::fs::{self, DirEntry}; use async_std::io::Error; use async_std::path::PathBuf; -use elliptic_curve::bigint::{self, U256}; use futures::StreamExt; use lit_node_common::config::presign_path; use lit_node_core::CurveType; +use lit_rust_crypto::elliptic_curve::bigint::{self, U256}; use xorf::Filter; impl PresignManager { @@ -81,13 +81,12 @@ impl PresignManager { let path = entry.path(); Box::pin(self.recurse_dirs(path, presign_list, peers, node_addr, curve_type)) .await?; - } else if filetype.is_file() { - if let Err(r) = self + } else if filetype.is_file() + && let Err(r) = self .attempt_load_presign(entry.clone(), presign_list, peers, node_addr, curve_type) .await - { - error!("Error loading presign {:?}: {:?}", entry, r); - } + { + error!("Error loading presign {:?}: {:?}", entry, r); } } Ok(()) @@ -108,7 +107,7 @@ impl PresignManager { Err(e) => { error!("Error reading filename: {:?}", e); return Err(unexpected_err( - Error::new(std::io::ErrorKind::Other, "file"), + Error::other("file"), Some("Presign filename read error.".into()), )); } @@ -120,7 +119,7 @@ impl PresignManager { None => { error!("Error reading filename: {:?}", entry.path()); return Err(unexpected_err( - Error::new(std::io::ErrorKind::Other, "file"), + Error::other("file"), Some("Presign filename read error.".into()), )); } @@ -194,14 +193,14 @@ impl PresignManager { } if found { // even if there is a peer_group, we need to check if it's empty - if let Some(s) = pregen_list.get(peer_group_id) { - if !s.is_empty() { - info!( - "Found peer group_id {} with threshold {}.", - peer_group_id, xor_filter_with_threshold.threshold - ); - return *peer_group_id; - } + if let Some(s) = pregen_list.get(peer_group_id) + && !s.is_empty() + { + info!( + "Found peer group_id {} with threshold {}.", + peer_group_id, xor_filter_with_threshold.threshold + ); + return *peer_group_id; } } } diff --git a/rust/lit-node/lit-node/src/tasks/presign_manager/listener.rs b/rust/lit-node/lit-node/src/tasks/presign_manager/listener.rs index ff1aa601..5b43be4d 100644 --- a/rust/lit-node/lit-node/src/tasks/presign_manager/listener.rs +++ b/rust/lit-node/lit-node/src/tasks/presign_manager/listener.rs @@ -8,13 +8,14 @@ use crate::tasks::presign_manager::models::Presign; use crate::tss::common::storage::{delete_presign, read_presign_from_disk, write_presign_to_disk}; use crate::tss::ecdsa_damfast::DamFastState; use crate::version::DataVersionReader; -use elliptic_curve::bigint::{self, U256}; use flume::Sender; use lit_core::config::ReloadableLitConfig; use lit_node_common::config::{CFG_KEY_SIGNING_ROUND_TIMEOUT_MS_DEFAULT, LitNodeConfig}; -use lit_node_core::CurveType; -use lit_node_core::PeerId; -use lit_node_core::SigningScheme; +use lit_node_core::{CurveType, PeerId, SigningScheme}; +use lit_rust_crypto::{ + elliptic_curve::bigint::{self, U256}, + k256, p256, p384, +}; use std::num::NonZeroU64; use std::time::Duration; use tracing::instrument; @@ -1114,16 +1115,15 @@ impl PresignManager { } }; - if presign_leader_response.remaining_presigns < min_presigns { - if let Err(e) = local_tx + if presign_leader_response.remaining_presigns < min_presigns + && let Err(e) = local_tx .send_async(PresignMessage::InformNonParticipants( request_key_hash, nonparticipants, )) .await - { - error!("Error sending inform non participants message: {}", e); - } + { + error!("Error sending inform non participants message: {}", e); } let presign_message = PresignMessage::FullfillPresignRequest( diff --git a/rust/lit-node/lit-node/src/tasks/presign_manager/models.rs b/rust/lit-node/lit-node/src/tasks/presign_manager/models.rs index 5cfe145f..c27a4b11 100644 --- a/rust/lit-node/lit-node/src/tasks/presign_manager/models.rs +++ b/rust/lit-node/lit-node/src/tasks/presign_manager/models.rs @@ -2,14 +2,17 @@ use crate::error::{Result, unexpected_err}; use crate::peers::peer_state::models::SimplePeerCollection; use crate::tss::common::tss_state::TssState; use crate::utils::traits::SignatureCurve; -use elliptic_curve::group::GroupEncoding; -use elliptic_curve::{CurveArithmetic, PrimeCurve}; use flume::{Receiver, Sender}; -use hd_keys_curves::{HDDerivable, HDDeriver}; use lit_fast_ecdsa::PreSignature; -use lit_node_core::CurveType; -use lit_node_core::PeerId; -use lit_node_core::SigningScheme; +use lit_node_core::{ + CurveType, PeerId, SigningScheme, + hd_keys_curves_wasm::{HDDerivable, HDDeriver}, +}; +use lit_rust_crypto::{ + elliptic_curve::{CurveArithmetic, PrimeCurve}, + group::GroupEncoding, + k256, p256, p384, +}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::collections::hash_map::DefaultHasher; diff --git a/rust/lit-node/lit-node/src/tss/blsful/mod.rs b/rust/lit-node/lit-node/src/tss/blsful/mod.rs index 264d7190..46c2ae4d 100644 --- a/rust/lit-node/lit-node/src/tss/blsful/mod.rs +++ b/rust/lit-node/lit-node/src/tss/blsful/mod.rs @@ -1,19 +1,27 @@ pub mod models; use crate::error::{Result, unexpected_err}; use crate::tss::blsful::models::BlsState; +use crate::tss::common::curve_state::CurveState; use crate::tss::common::hd_keys::get_derived_keyshare; use crate::tss::common::key_share::KeyShare; use crate::tss::common::traits::signable::Signable; use crate::tss::common::{storage::read_key_share_from_disk, traits::cipherable::Cipherable}; -use blsful::{Pairing, SecretKeyShare, SignatureShare, vsss_rs::Share}; -use elliptic_curve::Group; -use hd_keys_curves::HDDeriver; +use crate::utils::web::get_bls_root_pubkey; use lit_core::error::Unexpected; use lit_core::utils::binary::bytes_to_hex; -use lit_node_core::PeerId; -use lit_node_core::{BlsSignedMessageShare, CurveType, NodeSet, SignableOutput, SigningScheme}; +use lit_node_core::{ + BlsSignedMessageShare, CurveType, NodeSet, PeerId, SignableOutput, SigningScheme, + hd_keys_curves_wasm::HDDeriver, +}; +use lit_rust_crypto::{ + blsful::{ + Bls12381G1Impl, Bls12381G2Impl, Pairing, SecretKeyShare, SignatureSchemes, SignatureShare, + inner_types::{G1Projective, Scalar}, + }, + group::Group, + vsss_rs::{IdentifierPrimeField, Share}, +}; use tracing::instrument; -use vsss_rs::IdentifierPrimeField; #[async_trait::async_trait] impl Cipherable for BlsState { @@ -21,18 +29,11 @@ impl Cipherable for BlsState { async fn sign( &self, message_bytes: &[u8], + key_set_id: Option<&str>, epoch: Option, - ) -> Result<(SignatureShare, PeerId)> { - let dkg_state = self.state.get_dkg_state(CurveType::BLS)?; - let root_keys = dkg_state.root_keys().await; - if root_keys.is_empty() { - return Err(unexpected_err( - "No primary BLS key found!".to_string(), - None, - )); - } - - self.sign_with_pubkey(message_bytes, &root_keys[0], epoch) + ) -> Result<(SignatureShare, PeerId)> { + let bls_root_pubkey = get_bls_root_pubkey(&self.state, key_set_id)?; + self.sign_with_pubkey(message_bytes, &bls_root_pubkey, key_set_id, epoch) .await } @@ -41,8 +42,9 @@ impl Cipherable for BlsState { &self, message_bytes: &[u8], pub_key: &str, + key_set_id: Option<&str>, epoch: Option, - ) -> Result<(SignatureShare, PeerId)> { + ) -> Result<(SignatureShare, PeerId)> { trace!( "Encryption signing with pubkey: {:?} for epoch: {:?}", pub_key, epoch @@ -50,7 +52,7 @@ impl Cipherable for BlsState { let (secret_key_share, share_peer_id) = self.get_keyshare(pub_key, epoch).await?; let sks = secret_key_share - .sign(blsful::SignatureSchemes::ProofOfPossession, &message_bytes) + .sign(SignatureSchemes::ProofOfPossession, &message_bytes) .map_err(|e| unexpected_err(format!("Failed to sign message: {:?}", e), None))?; Ok((sks, share_peer_id)) @@ -62,9 +64,9 @@ impl Signable for BlsState { &mut self, message_bytes: &[u8], public_key: Vec, - root_pubkeys: Option>, tweak_preimage: Option>, request_id: Vec, + key_set_id: Option<&str>, epoch: Option, nodeset: &[NodeSet], ) -> Result { @@ -102,22 +104,20 @@ impl Signable for BlsState { let key_id = tweak_preimage.expect_or_err("No hd_key_id provided!")?; let realm_id = self.state.peer_state.realm_id(); - let dkg_state = self.state.get_dkg_state(CurveType::BLS12381G1)?; - let root_keys = dkg_state.root_keys().await; - if root_keys.is_empty() { - return Err(unexpected_err( - "No primary BLS key found!".to_string(), - None, - )); + let curve_state = CurveState::new( + self.state.peer_state.clone(), + CurveType::BLS12381G1, + key_set_id.map(String::from), + ); + let root_keys = curve_state.root_keys()?; + if root_keys.len() < 2 { + return Err(unexpected_err("No BLS root keys found!".to_string(), None)); } let staker_address = &bytes_to_hex(self_peer.staker_address.as_bytes()); - let deriver = ::create( - &key_id, - self.signing_scheme.id_sign_ctx(), - ); + let deriver = ::create(&key_id, self.signing_scheme.id_sign_ctx()); match self.signing_scheme { SigningScheme::Bls12381G1ProofOfPossession => { - let (sk, vk) = get_derived_keyshare::( + let (sk, vk) = get_derived_keyshare::( deriver, &root_keys, CurveType::BLS12381G1, @@ -129,18 +129,17 @@ impl Signable for BlsState { ) .await?; - let identifier = - <::PublicKey as Group>::Scalar::from( - self_peer.peer_id, - ); + let identifier = <::PublicKey as Group>::Scalar::from( + self_peer.peer_id, + ); let secret_key_share = SecretKeyShare( - ::SecretKeyShare::with_identifier_and_value( + ::SecretKeyShare::with_identifier_and_value( IdentifierPrimeField(identifier), IdentifierPrimeField(sk), ), ); - let signature_share: SignatureShare = secret_key_share - .sign(blsful::SignatureSchemes::ProofOfPossession, message_bytes) + let signature_share: SignatureShare = secret_key_share + .sign(SignatureSchemes::ProofOfPossession, message_bytes) .map_err(|e| { unexpected_err(e, Some("unable to generate signature".to_string())) })?; @@ -151,10 +150,8 @@ impl Signable for BlsState { message: hex::encode(message_bytes), result: "success".to_string(), peer_id: self_peer.peer_id.to_string(), - share_id: serde_json::to_string(&blsful::inner_types::Scalar::from( - self_peer.peer_id, - )) - .expect_or_err("Error serializing share_id")?, + share_id: serde_json::to_string(&Scalar::from(self_peer.peer_id)) + .expect_or_err("Error serializing share_id")?, signature_share: serde_json::to_string(&signature_share) .expect_or_err("Error serializing signature_share")?, verifying_share: serde_json::to_string(&verifying_share) @@ -175,7 +172,7 @@ impl BlsState { &self, pubkey: &str, epoch: Option, - ) -> Result<(SecretKeyShare, PeerId)> { + ) -> Result<(SecretKeyShare, PeerId)> { let realm_id = self.state.peer_state.realm_id(); let self_epoch = self.state.peer_state.epoch(); @@ -214,13 +211,12 @@ impl BlsState { ) .await?; - let identifier = <::PublicKey as Group>::Scalar::from( - bls_key_share.peer_id, - ); - let value = bls_key_share.secret::<::PublicKey>()?; + let identifier = + <::PublicKey as Group>::Scalar::from(bls_key_share.peer_id); + let value = bls_key_share.secret::<::PublicKey>()?; let secret_key_share = SecretKeyShare( - ::SecretKeyShare::with_identifier_and_value( + ::SecretKeyShare::with_identifier_and_value( IdentifierPrimeField(identifier), IdentifierPrimeField(value), ), diff --git a/rust/lit-node/lit-node/src/tss/common/backup.rs b/rust/lit-node/lit-node/src/tss/common/backup.rs index 575bef94..fde76519 100644 --- a/rust/lit-node/lit-node/src/tss/common/backup.rs +++ b/rust/lit-node/lit-node/src/tss/common/backup.rs @@ -1,6 +1,4 @@ -use blsful::inner_types::{G1Projective, InnerBls12381G1}; use bulletproofs::{BulletproofCurveArithmetic as BCA, BulletproofCurveArithmetic}; -use elliptic_curve::bigint::{NonZero, U256}; use ethers::types::H160; use std::marker::PhantomData; use verifiable_share_encryption::VerifiableEncryption; @@ -13,10 +11,14 @@ use crate::utils::traits::SignatureCurve; use lit_blockchain::contracts::backup_recovery::RecoveryKey; use lit_core::config::LitConfig; use lit_node_common::config::LitNodeConfig; -use lit_node_core::CompressedBytes; -use lit_node_core::CurveType; -use lit_node_core::PeerId; +use lit_node_core::{CompressedBytes, CurveType, PeerId}; use lit_recovery::models::EncryptedKeyShare; +use lit_rust_crypto::{ + blsful::inner_types::{G1Projective, InnerBls12381G1}, + decaf377, ed448_goldilocks, + elliptic_curve::bigint::{NonZero, U256}, + jubjub, k256, p256, p384, pallas, vsss_rs, +}; /// Internally kept version #[derive(Default)] @@ -33,6 +35,7 @@ pub struct RecoveryParty { pub jubjub_encryption_key: jubjub::SubgroupPoint, pub decaf377_encryption_key: decaf377::Element, pub bls12381g1_encryption_key: ::Point, + pub pallas_encryption_key: pallas::Point, pub threshold: usize, } @@ -118,6 +121,10 @@ fn set_recovery_party_keys( trace!("Reading bls12381g1 encryption key"); recovery_party.bls12381g1_encryption_key = read_bls_pub_key(&recovery_key.pubkey)?; } + CurveType::RedPallas => { + trace!("Reading pallas encryption key"); + recovery_party.pallas_encryption_key = read_pallas_pub_key(&recovery_key.pubkey)?; + } } } Ok(()) @@ -217,6 +224,11 @@ fn read_decaf377_pub_key(bytes: &[u8]) -> Result { helper.pk_from_bytes(bytes) } +fn read_pallas_pub_key(bytes: &[u8]) -> Result { + let helper = KeyPersistence::::new(CurveType::RedPallas); + helper.pk_from_bytes(bytes) +} + #[cfg(test)] mod tests { use super::*; @@ -225,14 +237,13 @@ mod tests { use crate::tss::common::key_persistence::KeyPersistence; use crate::tss::common::key_share::KeyShare; use bulletproofs::BulletproofCurveArithmetic as BCA; - use elliptic_curve::Field; - use elliptic_curve::ff::PrimeFieldBits; - use lit_node_core::CompressedHex; - use lit_node_core::CurveType; - use lit_node_core::PeerId; + use lit_node_core::{CompressedHex, CurveType, PeerId}; + use lit_rust_crypto::{ + ff::{Field, PrimeFieldBits}, + vsss_rs::{DefaultShare, IdentifierPrimeField}, + }; use test_case::test_case; use verifiable_share_encryption::{VerifiableEncryption, VerifiableEncryptionDecryptor}; - use vsss_rs::{DefaultShare, IdentifierPrimeField}; fn get_enc_dec_key_pair() -> (::Point, C::Scalar) where diff --git a/rust/lit-node/lit-node/src/tss/common/curve_state.rs b/rust/lit-node/lit-node/src/tss/common/curve_state.rs index 394d6a66..cbaae6b5 100644 --- a/rust/lit-node/lit-node/src/tss/common/curve_state.rs +++ b/rust/lit-node/lit-node/src/tss/common/curve_state.rs @@ -1,21 +1,98 @@ -use crate::tss::common::traits::dkg::BasicDkg; -use crate::tss::common::tss_state::TssState; +use crate::error::blockchain_err; +use crate::models::KeySetConfig; +use crate::peers::PeerState; +use crate::version::DataVersionReader; use lit_node_core::CurveType; use std::sync::Arc; #[derive(Clone, Debug)] pub struct CurveState { - pub state: Arc, + pub peer_state: Arc, pub curve_type: CurveType, + pub key_set_identifier: Option, } -#[async_trait::async_trait] -impl BasicDkg for CurveState { - fn tss_state(&self) -> Arc { - self.state.clone() +impl CurveState { + pub fn new( + peer_state: Arc, + curve_type: CurveType, + key_set_identifier: Option, + ) -> Self { + Self { + peer_state, + curve_type, + key_set_identifier, + } } - fn curve_type(&self) -> CurveType { - self.curve_type + pub fn root_keys(&self) -> lit_core::error::Result> { + Ok(match &self.key_set_identifier { + None => { + let default_key_set = DataVersionReader::read_field_unchecked( + &self.peer_state.chain_data_config_manager.generic_config, + |generic_config| generic_config.default_key_set.clone(), + ); + match &default_key_set { + Some(key_set_id) => self.get_root_keys_by_key_set_id(key_set_id)?, + None => DataVersionReader::read_field_unchecked( + &self.peer_state.chain_data_config_manager.key_sets, + |key_sets| { + Ok::, lit_core::error::Error>( + key_sets + .values() + .find(|&config| valid_key_set(config, self.curve_type)) + .ok_or_else(|| { + blockchain_err( + format!( + "No key set with curve type {} exists", + self.curve_type + ), + None, + ) + })? + .root_keys_by_curve[&self.curve_type] + .clone(), + ) + }, + )?, + } + } + Some(key_set_id) => self.get_root_keys_by_key_set_id(key_set_id)?, + }) } + + fn get_root_keys_by_key_set_id( + &self, + key_set_id: &str, + ) -> lit_core::error::Result> { + DataVersionReader::read_field_unchecked( + &self.peer_state.chain_data_config_manager.key_sets, + |key_sets| { + let config = key_sets.get(key_set_id).ok_or_else(|| { + blockchain_err( + format!("No key set with identifier {} exists", key_set_id), + None, + ) + })?; + if valid_key_set(config, self.curve_type) { + Ok(config.root_keys_by_curve[&self.curve_type].clone()) + } else { + Err(blockchain_err( + format!( + "Key set with identifier {} does not contain any root keys with curve type {}", + key_set_id, self.curve_type + ), + None, + )) + } + }, + ) + } +} + +fn valid_key_set(config: &KeySetConfig, curve_type: CurveType) -> bool { + config.root_keys_by_curve.contains_key(&curve_type) + && config.root_key_counts.contains_key(&curve_type) + && config.root_key_counts[&curve_type] > 0 + && !config.root_keys_by_curve[&curve_type].is_empty() } diff --git a/rust/lit-node/lit-node/src/tss/common/hd_keys.rs b/rust/lit-node/lit-node/src/tss/common/hd_keys.rs index 56c628bd..7f2506f7 100644 --- a/rust/lit-node/lit-node/src/tss/common/hd_keys.rs +++ b/rust/lit-node/lit-node/src/tss/common/hd_keys.rs @@ -4,15 +4,13 @@ use crate::{ error::{Result, unexpected_err}, tss::common::storage::read_key_share_from_disk, }; -use elliptic_curve::group::GroupEncoding; -use hd_keys_curves::{HDDerivable, HDDeriver}; -use lit_node_core::CompressedBytes; -use lit_node_core::CurveType; -use lit_node_core::PeerId; +use lit_node_core::{ + CompressedBytes, CurveType, PeerId, + hd_keys_curves_wasm::{HDDerivable, HDDeriver}, +}; +use lit_rust_crypto::group::GroupEncoding; use tracing::instrument; -pub const ID_SIGN_CTX: &[u8] = b"LIT_HD_KEY_ID_K256_XMD:SHA-256_SSWU_RO_NUL_"; - #[allow(clippy::too_many_arguments)] #[instrument(level = "debug", skip_all)] pub async fn get_derived_keyshare( diff --git a/rust/lit-node/lit-node/src/tss/common/key_persistence.rs b/rust/lit-node/lit-node/src/tss/common/key_persistence.rs index 74820a3e..4467bf0e 100644 --- a/rust/lit-node/lit-node/src/tss/common/key_persistence.rs +++ b/rust/lit-node/lit-node/src/tss/common/key_persistence.rs @@ -3,10 +3,8 @@ use crate::error::{Result, unexpected_err}; use crate::peers::peer_state::models::SimplePeerCollection; use crate::tss::common::key_share::KeyShare; use crate::tss::common::storage::{read_key_share_from_disk, write_key_share_to_disk}; -use elliptic_curve::group::{Group, GroupEncoding}; -use lit_node_core::CurveType; -use lit_node_core::PeerId; -use lit_node_core::{CompressedBytes, CompressedHex}; +use lit_node_core::{CompressedBytes, CompressedHex, CurveType, PeerId}; +use lit_rust_crypto::group::{Group, GroupEncoding}; use std::fmt::Debug; pub const RECOVERY_DKG_EPOCH: u64 = 0; diff --git a/rust/lit-node/lit-node/src/tss/common/key_share.rs b/rust/lit-node/lit-node/src/tss/common/key_share.rs index d67affc9..37c8d1d9 100644 --- a/rust/lit-node/lit-node/src/tss/common/key_share.rs +++ b/rust/lit-node/lit-node/src/tss/common/key_share.rs @@ -1,14 +1,13 @@ use crate::error::{Result, parser_err}; use crate::peers::peer_state::models::SimplePeerCollection; use crate::tss::common::key_persistence::KeyPersistence; -use elliptic_curve::Group; -use elliptic_curve::group::GroupEncoding; -use lit_node_core::CompressedBytes; -use lit_node_core::CurveType; -use lit_node_core::PeerId; +use lit_node_core::{CompressedBytes, CurveType, PeerId}; +use lit_rust_crypto::{ + group::{Group, GroupEncoding}, + vsss_rs::{DefaultShare, IdentifierPrimeField}, +}; use serde::{Deserialize, Serialize}; use std::fmt::Debug; -use vsss_rs::{DefaultShare, IdentifierPrimeField}; #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct KeyShare { diff --git a/rust/lit-node/lit-node/src/tss/common/key_share_commitment.rs b/rust/lit-node/lit-node/src/tss/common/key_share_commitment.rs index 90891664..c06c9066 100644 --- a/rust/lit-node/lit-node/src/tss/common/key_share_commitment.rs +++ b/rust/lit-node/lit-node/src/tss/common/key_share_commitment.rs @@ -1,4 +1,4 @@ -use elliptic_curve::{Field, Group, group::GroupEncoding}; +use lit_rust_crypto::elliptic_curve::{Field, Group, group::GroupEncoding}; use serde::{Deserialize, Serialize}; /// KeyShareCommitment is a struct that holds the commitment of a key share. @@ -90,7 +90,7 @@ mod group { let bytes: Vec = Vec::deserialize(d)?; let repr = G::Repr::default(); let len = repr.as_ref().len(); - if bytes.len() % len != 0 { + if !bytes.len().is_multiple_of(len) { return Err(serde::de::Error::custom(format!( "Invalid group element length: expected multiple of {}, found {}", len, diff --git a/rust/lit-node/lit-node/src/tss/common/mod.rs b/rust/lit-node/lit-node/src/tss/common/mod.rs index 6fb478b7..0cb8e8ad 100644 --- a/rust/lit-node/lit-node/src/tss/common/mod.rs +++ b/rust/lit-node/lit-node/src/tss/common/mod.rs @@ -1,6 +1,6 @@ pub mod backup; pub mod contract; -mod curve_state; +pub mod curve_state; pub mod dkg_type; pub mod hd_keys; pub mod key_persistence; @@ -9,7 +9,6 @@ pub mod key_share_commitment; pub mod models; pub mod peer_communication; pub mod restore; -pub mod signing_scheme; pub mod storage; pub mod traits; pub mod tss_state; diff --git a/rust/lit-node/lit-node/src/tss/common/models.rs b/rust/lit-node/lit-node/src/tss/common/models.rs index f6bc170d..e1d08a47 100644 --- a/rust/lit-node/lit-node/src/tss/common/models.rs +++ b/rust/lit-node/lit-node/src/tss/common/models.rs @@ -2,6 +2,7 @@ use crate::peers::peer_reviewer::PeerComplaint; use crate::peers::peer_state::models::SimplePeer; use lit_node_core::PeerId; use lit_observability::channels::TracedSender; +use lit_rust_crypto::k256; use serde::{Deserialize, Serialize}; use std::{ fmt::{self, Debug, Formatter}, diff --git a/rust/lit-node/lit-node/src/tss/common/restore/eks_and_ds.rs b/rust/lit-node/lit-node/src/tss/common/restore/eks_and_ds.rs index ab1f5a9b..22106eb0 100644 --- a/rust/lit-node/lit-node/src/tss/common/restore/eks_and_ds.rs +++ b/rust/lit-node/lit-node/src/tss/common/restore/eks_and_ds.rs @@ -7,19 +7,29 @@ use crate::tss::common::key_share_commitment::KeyShareCommitments; use crate::tss::common::storage::write_key_share_to_cache_only; use crate::utils::traits::SignatureCurve; use bulletproofs::BulletproofCurveArithmetic as BCA; -use elliptic_curve::bigint::{NonZero, U256}; -use lit_node_core::CurveType; -use lit_node_core::PeerId; -use lit_node_core::{CompressedBytes, CompressedHex}; +use lit_node_core::{CompressedBytes, CompressedHex, CurveType, PeerId}; use lit_recovery::models::EncryptedKeyShare; +use lit_rust_crypto::{ + elliptic_curve::bigint::{NonZero, U256}, + vsss_rs::{ + DefaultShare, FeldmanVerifierSet, IdentifierPrimeField, Share, ValueGroup, + VecFeldmanVerifierSet, + }, +}; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; use std::fmt::{Debug, Formatter}; use verifiable_share_encryption::VerifiableEncryptionDecryptor; -use vsss_rs::{ - DefaultShare, FeldmanVerifierSet, IdentifierPrimeField, Share, ValueGroup, - VecFeldmanVerifierSet, -}; + +/// Parameters for restoring key shares +pub struct RestoreParams<'a> { + pub threshold: usize, + pub current_peer_id: &'a PeerId, + pub epoch: u64, + pub realm_id: u64, + pub staker_address: &'a str, + pub restore_key_cache: &'a KeyCache, +} /// Identifier for a Recovery Party member. pub type RecPartyMemberIdType = String; @@ -60,28 +70,10 @@ where ::Point: CompressedBytes, C::Scalar: CompressedBytes + From, { - pub async fn try_restore( - &self, - threshold: usize, - current_peer_id: &PeerId, - epoch: u64, - realm_id: u64, - staker_address: &str, - restore_key_cache: &KeyCache, - ) -> Vec { + pub async fn try_restore(&self, params: &RestoreParams<'_>) -> Vec { let mut restored_keys = Vec::new(); for eks_and_ds in self.eks_and_ds.iter() { - let restore_result = eks_and_ds - .try_restore( - threshold, - &self.blinder, - current_peer_id, - epoch, - realm_id, - staker_address, - restore_key_cache, - ) - .await; + let restore_result = eks_and_ds.try_restore(&self.blinder, params).await; if let Some(public_key) = restore_result { restored_keys.push(public_key); }; @@ -197,20 +189,15 @@ where #[allow(clippy::too_many_arguments)] pub async fn try_restore( &self, - threshold: usize, blinder: &C::Scalar, - current_peer_id: &PeerId, - epoch: u64, - realm_id: u64, - staker_address: &str, - restore_key_cache: &KeyCache, + params: &RestoreParams<'_>, ) -> Option { // If this key is already restored, return. if self.restored { return None; } // If this key does not have enough decryption shares, don't attempt. - if self.decryption_shares.len() < threshold { + if self.decryption_shares.len() < params.threshold { return None; } @@ -266,7 +253,7 @@ where threshold: self.encrypted_key_share.threshold, total_shares: self.encrypted_key_share.total_shares, txn_prefix: self.encrypted_key_share.txn_prefix.clone(), - realm_id, + realm_id: params.realm_id, peers: self .encrypted_key_share .peers @@ -279,11 +266,11 @@ where &self.encrypted_key_share.public_key, // Make sure to compute the file name with the peer id of // the current peer, so that it can later be found by this node. - current_peer_id, - staker_address, - epoch, - realm_id, - restore_key_cache, + params.current_peer_id, + params.staker_address, + params.epoch, + params.realm_id, + params.restore_key_cache, &key_share, ) .await diff --git a/rust/lit-node/lit-node/src/tss/common/restore/point_reader.rs b/rust/lit-node/lit-node/src/tss/common/restore/point_reader.rs index 1a7e49ec..d9dec0c0 100644 --- a/rust/lit-node/lit-node/src/tss/common/restore/point_reader.rs +++ b/rust/lit-node/lit-node/src/tss/common/restore/point_reader.rs @@ -1,9 +1,12 @@ use crate::common::storage::{read_from_disk, write_to_disk}; use crate::error::Result; use async_std::path::PathBuf; -use blsful::inner_types::{G1Projective, InnerBls12381G1}; use bulletproofs::BulletproofCurveArithmetic as BCA; use lit_node_core::CompressedHex; +use lit_rust_crypto::{ + blsful::inner_types::{G1Projective, InnerBls12381G1}, + decaf377, ed448_goldilocks, jubjub, k256, p256, p384, pallas, vsss_rs, +}; #[allow(async_fn_in_trait)] pub trait PointReader: BCA { @@ -115,6 +118,20 @@ impl PointReader for bulletproofs::JubJub { } } +impl PointReader for pallas::Pallas { + async fn read_point(path: PathBuf, file_name: &str) -> Result { + read_from_disk::(path, file_name).await + } + + async fn write_point(path: PathBuf, file_name: &str, point: &Self::Point) -> Result<()> { + write_to_disk(path, file_name, point).await + } + + fn parse_old_backup_public_key(public_key_hex: &str) -> Option { + None + } +} + impl PointReader for bulletproofs::Decaf377 { async fn read_point(path: PathBuf, file_name: &str) -> Result { read_from_disk::(path, file_name).await diff --git a/rust/lit-node/lit-node/src/tss/common/restore/restore_state.rs b/rust/lit-node/lit-node/src/tss/common/restore/restore_state.rs index 273106e5..ac1c06d0 100644 --- a/rust/lit-node/lit-node/src/tss/common/restore/restore_state.rs +++ b/rust/lit-node/lit-node/src/tss/common/restore/restore_state.rs @@ -1,33 +1,38 @@ -use blsful::inner_types::{G1Projective, InnerBls12381G1}; use bulletproofs::BulletproofCurveArithmetic as BCA; -use elliptic_curve::Field; -use elliptic_curve::bigint::{NonZero, U256}; use ethers::types::H160; use sdd::{AtomicShared, Shared}; use serde::{Deserialize, Serialize}; -use std::io::{Error, ErrorKind}; +use std::io::Error; use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use tokio::sync::RwLock; use tracing::{instrument, warn}; use crate::common::key_helper::KeyCache; -use crate::config::chain::CachedRootKey; use crate::error::{Result, conversion_err, parser_err, unexpected_err}; +use crate::models::KeySetConfig; use crate::tss::common::key_persistence::KeyPersistence; use crate::tss::common::restore::eks_and_ds::{ - CurveRecoveryData, EksAndDs, RecPartyMemberIdType, RootKeyRecoveryLog, + CurveRecoveryData, EksAndDs, RecPartyMemberIdType, RestoreParams, RootKeyRecoveryLog, }; use crate::tss::common::restore::point_reader::PointReader; use crate::tss::common::tss_state::TssState; use crate::utils::contract::get_backup_recovery_contract_with_signer; +use crate::utils::traits::SignatureCurve; use crate::version::{DataVersionReader, DataVersionWriter}; use lit_blockchain::contracts::backup_recovery::{BackupRecoveryErrors, RecoveredPeerId}; use lit_core::config::LitConfig; -use lit_node_core::CurveType; -use lit_node_core::PeerId; -use lit_node_core::{Blinders, CompressedBytes, CompressedHex}; +use lit_node_core::{Blinders, CompressedBytes, CompressedHex, CurveType, PeerId}; use lit_recovery::models::UploadedShareData; +use lit_rust_crypto::{ + blsful::inner_types::{G1Projective, InnerBls12381G1}, + decaf377, ed448_goldilocks, + elliptic_curve::{ + Field, + bigint::{NonZero, U256}, + }, + jubjub, k256, p256, p384, pallas, vsss_rs, +}; use verifiable_share_encryption::{DecryptionShare, VerifiableEncryptionDecryptor}; // DATIL_BACKUP: Remove this type once old Datil backup is obsolete. @@ -41,7 +46,7 @@ pub struct RestoreState { blinders: AtomicShared, actively_restoring: AtomicBool, state: RwLock>, - restoring_root_keys: AtomicShared>, + restoring_key_set: AtomicShared, } /// Inner state kept by RestoreState. @@ -59,8 +64,10 @@ pub(crate) struct InnerState { pub jubjub_recovery_data: Option>, pub decaf377_recovery_data: Option>, pub bls12381g1_recovery_data: Option>, + pub pallas_recovery_data: Option>, pub threshold: usize, pub restored_key_cache: KeyCache, + pub use_raw_peer_ids: bool, } impl RestoreState { @@ -70,7 +77,7 @@ impl RestoreState { blinders: AtomicShared::from(Shared::new(Self::generate_blinders())), actively_restoring: AtomicBool::new(false), state: RwLock::new(None), - restoring_root_keys: AtomicShared::from(Shared::new(Vec::new())), + restoring_key_set: AtomicShared::from(Shared::new(KeySetConfig::default())), } } @@ -80,11 +87,47 @@ impl RestoreState { self.init_inner_state().await; tss_state .chain_data_config_manager - .set_root_keys_from_chain() + .set_all_config_from_chain() + .await?; + tss_state + .chain_data_config_manager + .set_key_sets_from_chain() .await?; - let root_keys = tss_state.chain_data_config_manager.root_keys(); - debug!("Restoring root keys: {:?}", &root_keys); - DataVersionWriter::store(&self.restoring_root_keys, root_keys); + let default_key_set = DataVersionReader::read_field_unchecked( + &tss_state.chain_data_config_manager.generic_config, + |generic_config| generic_config.default_key_set.clone(), + ); + let key_set = DataVersionReader::read_field_unchecked( + &tss_state.chain_data_config_manager.key_sets, + |key_sets| { + let key_set = match &default_key_set { + Some(id) => match key_sets.get(id) { + Some(key_set) => key_set.clone(), + None => { + return Err(unexpected_err( + format!( + "Expected key set config information for {} but it doesn't exist", + id + ), + None, + )); + } + }, + None => match key_sets.first_key_value() { + Some((_id, key_set)) => key_set.clone(), + None => { + return Err(unexpected_err( + "No key sets exist to restore".to_string(), + None, + )); + } + }, + }; + Ok(key_set) + }, + )?; + debug!("Restoring key set: {:?}", &key_set); + DataVersionWriter::store(&self.restoring_key_set, key_set); Ok(()) } @@ -105,6 +148,7 @@ impl RestoreState { let jubjub_blinder = jubjub::Scalar::random(&mut rng); let decaf377_blinder = decaf377::Fr::random(&mut rng); let bls12381g1_blinder = ::Scalar::random(&mut rng); + let pallas_blinder = pallas::Scalar::random(&mut rng); Blinders { bls_blinder: Some(bls_blinder), k256_blinder: Some(k256_blinder), @@ -116,6 +160,7 @@ impl RestoreState { jubjub_blinder: Some(jubjub_blinder), decaf377_blinder: Some(decaf377_blinder), bls12381g1_blinder: Some(bls12381g1_blinder), + pallas_blinder: Some(pallas_blinder), } } @@ -140,7 +185,7 @@ impl RestoreState { Ok(curve) => curve, Err(e) => { let err_msg = format!("Not a valid curve: {}", share.curve); - return Err(parser_err(Error::new(ErrorKind::Other, err_msg), None)); + return Err(parser_err(Error::other(err_msg), None)); } }; @@ -159,6 +204,7 @@ impl RestoreState { helper.pk_to_hex(&point) }); let decryption_share = DecryptionShare::from(datil_decryption_share); + inner.use_raw_peer_ids = true; return Self::do_add_decryption_share( &mut inner.bls_recovery_data, rpm_id, @@ -184,6 +230,7 @@ impl RestoreState { helper.pk_to_hex(&point) }); let decryption_share = DecryptionShare::from(datil_decryption_share); + inner.use_raw_peer_ids = true; return Self::do_add_decryption_share( &mut inner.k256_recovery_data, rpm_id, @@ -227,6 +274,9 @@ impl RestoreState { CurveType::BLS12381G1 => { Self::add_decryption_share(&mut inner.bls12381g1_recovery_data, rpm_id, share)? } + CurveType::RedPallas => { + Self::add_decryption_share(&mut inner.pallas_recovery_data, rpm_id, share)? + } }; } Ok(()) @@ -251,134 +301,56 @@ impl RestoreState { return restored_key_shares; }; + let params = RestoreParams { + threshold: state.threshold, + current_peer_id: peer_id, + epoch, + realm_id, + staker_address, + restore_key_cache: &state.restored_key_cache, + }; + if let Some(recovery_data) = &state.bls_recovery_data { - restored_key_shares.bls_shares = recovery_data - .try_restore( - state.threshold, - peer_id, - epoch, - realm_id, - staker_address, - &state.restored_key_cache, - ) - .await; + restored_key_shares.bls_shares = recovery_data.try_restore(¶ms).await; } if let Some(recovery_data) = &state.k256_recovery_data { - restored_key_shares.k256_shares = recovery_data - .try_restore( - state.threshold, - peer_id, - epoch, - realm_id, - staker_address, - &state.restored_key_cache, - ) - .await; + restored_key_shares.k256_shares = recovery_data.try_restore(¶ms).await; } if let Some(recovery_data) = &state.p256_recovery_data { - restored_key_shares.p256_shares = recovery_data - .try_restore( - state.threshold, - peer_id, - epoch, - realm_id, - staker_address, - &state.restored_key_cache, - ) - .await; + restored_key_shares.p256_shares = recovery_data.try_restore(¶ms).await; } if let Some(recovery_data) = &state.p384_recovery_data { - restored_key_shares.p384_shares = recovery_data - .try_restore( - state.threshold, - peer_id, - epoch, - realm_id, - staker_address, - &state.restored_key_cache, - ) - .await; + restored_key_shares.p384_shares = recovery_data.try_restore(¶ms).await; } if let Some(recovery_data) = &state.ed25519_recovery_data { - restored_key_shares.ed25519_shares = recovery_data - .try_restore( - state.threshold, - peer_id, - epoch, - realm_id, - staker_address, - &state.restored_key_cache, - ) - .await; + restored_key_shares.ed25519_shares = recovery_data.try_restore(¶ms).await; } if let Some(recovery_data) = &state.ristretto25519_recovery_data { - restored_key_shares.ristretto25519_shares = recovery_data - .try_restore( - state.threshold, - peer_id, - epoch, - realm_id, - staker_address, - &state.restored_key_cache, - ) - .await; + restored_key_shares.ristretto25519_shares = recovery_data.try_restore(¶ms).await; } if let Some(recovery_data) = &state.ed448_recovery_data { - restored_key_shares.ed448_shares = recovery_data - .try_restore( - state.threshold, - peer_id, - epoch, - realm_id, - staker_address, - &state.restored_key_cache, - ) - .await; + restored_key_shares.ed448_shares = recovery_data.try_restore(¶ms).await; } if let Some(recovery_data) = &state.jubjub_recovery_data { - restored_key_shares.jubjub_shares = recovery_data - .try_restore( - state.threshold, - peer_id, - epoch, - realm_id, - staker_address, - &state.restored_key_cache, - ) - .await; + restored_key_shares.jubjub_shares = recovery_data.try_restore(¶ms).await; } if let Some(recovery_data) = &state.decaf377_recovery_data { - restored_key_shares.decaf377_shares = recovery_data - .try_restore( - state.threshold, - peer_id, - epoch, - realm_id, - staker_address, - &state.restored_key_cache, - ) - .await; + restored_key_shares.decaf377_shares = recovery_data.try_restore(¶ms).await; } if let Some(recovery_data) = &state.bls12381g1_recovery_data { - restored_key_shares.bls12381g1_shares = recovery_data - .try_restore( - state.threshold, - peer_id, - epoch, - realm_id, - staker_address, - &state.restored_key_cache, - ) - .await; + restored_key_shares.bls12381g1_shares = recovery_data.try_restore(¶ms).await; + } + if let Some(recovery_data) = &state.pallas_recovery_data { + restored_key_shares.pallas_shares = recovery_data.try_restore(¶ms).await; } restored_key_shares @@ -429,13 +401,16 @@ impl RestoreState { &restored_key_shares.bls12381g1_shares, ); } + if let Some(data) = &mut state.pallas_recovery_data { + EksAndDs::mark_keys_restored(&mut data.eks_and_ds, &restored_key_shares.pallas_shares); + } } pub fn get_blinders(&self) -> DataVersionReader { DataVersionReader::new_unchecked(&self.blinders) } - pub fn get_blinders_mut(&self) -> DataVersionWriter { + pub fn get_blinders_mut(&self) -> DataVersionWriter<'_, Blinders> { DataVersionWriter::new_unchecked(&self.blinders) } @@ -448,56 +423,90 @@ impl RestoreState { return false; }; - let restoring_root_keys = DataVersionReader::new_unchecked(&self.restoring_root_keys); + let root_keys_by_curve = { + DataVersionReader::new_unchecked(&self.restoring_key_set) + .root_keys_by_curve + .clone() + }; let mut restored = true; - for root_key in restoring_root_keys.iter() { - let r = match root_key.curve_type { - CurveType::BLS => CurveRecoveryData::are_all_keys_restored( + for (curve_type, root_keys) in root_keys_by_curve.iter() { + let r = match curve_type { + CurveType::BLS => Self::are_all_curve_keys_restored( + *curve_type, &state.bls_recovery_data, - &root_key.public_key, + root_keys, ), - CurveType::K256 => CurveRecoveryData::are_all_keys_restored( + CurveType::K256 => Self::are_all_curve_keys_restored( + *curve_type, &state.k256_recovery_data, - &root_key.public_key, + root_keys, ), - CurveType::P256 => CurveRecoveryData::are_all_keys_restored( + CurveType::P256 => Self::are_all_curve_keys_restored( + *curve_type, &state.p256_recovery_data, - &root_key.public_key, + root_keys, ), - CurveType::P384 => CurveRecoveryData::are_all_keys_restored( + CurveType::P384 => Self::are_all_curve_keys_restored( + *curve_type, &state.p384_recovery_data, - &root_key.public_key, + root_keys, ), - CurveType::Ed25519 => CurveRecoveryData::are_all_keys_restored( + CurveType::Ed25519 => Self::are_all_curve_keys_restored( + *curve_type, &state.ed25519_recovery_data, - &root_key.public_key, + root_keys, ), - CurveType::Ed448 => CurveRecoveryData::are_all_keys_restored( + CurveType::Ed448 => Self::are_all_curve_keys_restored( + *curve_type, &state.ed448_recovery_data, - &root_key.public_key, + root_keys, ), - CurveType::Ristretto25519 => CurveRecoveryData::are_all_keys_restored( + CurveType::Ristretto25519 => Self::are_all_curve_keys_restored( + *curve_type, &state.ristretto25519_recovery_data, - &root_key.public_key, + root_keys, ), - CurveType::RedJubjub => CurveRecoveryData::are_all_keys_restored( + CurveType::RedJubjub => Self::are_all_curve_keys_restored( + *curve_type, &state.jubjub_recovery_data, - &root_key.public_key, + root_keys, ), - CurveType::RedDecaf377 => CurveRecoveryData::are_all_keys_restored( + CurveType::RedDecaf377 => Self::are_all_curve_keys_restored( + *curve_type, &state.decaf377_recovery_data, - &root_key.public_key, + root_keys, ), - CurveType::BLS12381G1 => CurveRecoveryData::are_all_keys_restored( + CurveType::BLS12381G1 => Self::are_all_curve_keys_restored( + *curve_type, &state.bls12381g1_recovery_data, - &root_key.public_key, + root_keys, + ), + CurveType::RedPallas => Self::are_all_curve_keys_restored( + *curve_type, + &state.pallas_recovery_data, + root_keys, ), }; - debug!( - "Root key is restored: {} {} {}", - root_key.curve_type, root_key.public_key, r - ); + restored &= r; + } + restored + } + + fn are_all_curve_keys_restored( + curve_type: CurveType, + recovery_data: &Option>, + root_keys: &[String], + ) -> bool + where + C: VerifiableEncryptionDecryptor + SignatureCurve::Point>, + ::Point: CompressedBytes, + C::Scalar: CompressedBytes + From, + { + let mut restored = true; + for root_key in root_keys { + let r = CurveRecoveryData::are_all_keys_restored(recovery_data, root_key); + debug!("Root key is restored: {} {} {}", curve_type, root_key, r); restored &= r; } restored @@ -520,10 +529,7 @@ impl RestoreState { pub fn assert_actively_restoring(&self) -> Result<()> { match self.actively_restoring.load(Ordering::Acquire) { true => Ok(()), - false => Err(unexpected_err( - Error::new(ErrorKind::Other, "Not in RESTORE state"), - None, - )), + false => Err(unexpected_err(Error::other("Not in RESTORE state"), None)), } } @@ -548,7 +554,8 @@ impl RestoreState { .or(inner.ed448_recovery_data.as_ref().and_then(|d| d.original_peer_id())) .or(inner.jubjub_recovery_data.as_ref().and_then(|d| d.original_peer_id())) .or(inner.decaf377_recovery_data.as_ref().and_then(|d| d.original_peer_id())) - .or(inner.bls12381g1_recovery_data.as_ref().and_then(|d| d.original_peer_id())); + .or(inner.bls12381g1_recovery_data.as_ref().and_then(|d| d.original_peer_id()) + .or(inner.pallas_recovery_data.as_ref().and_then(|d| d.original_peer_id()))); match peer_id { Some(peer_id) => Ok(PeerId(NonZero::::from_uint(peer_id))), @@ -556,16 +563,32 @@ impl RestoreState { } } + pub fn get_expected_recovery_session_id(&self) -> String { + DataVersionReader::new_unchecked(&self.restoring_key_set) + .recovery_session_id + .clone() + } + pub async fn pull_recovered_key_cache(&self) -> Result { self.assert_actively_restoring()?; - let Some(inner) = &mut *self.state.write().await else { + let Some(ref inner) = *self.state.read().await else { return Err(Self::ciphertexts_not_set()); }; Ok(inner.restored_key_cache.clone()) } + pub async fn pull_use_raw_peer_ids(&self) -> Result { + self.assert_actively_restoring()?; + + let Some(ref inner) = *self.state.read().await else { + return Err(Self::ciphertexts_not_set()); + }; + + Ok(inner.use_raw_peer_ids) + } + pub async fn report_recovered_peer_id( &self, cfg: &LitConfig, @@ -748,10 +771,7 @@ impl RestoreState { } fn ciphertexts_not_set() -> crate::error::Error { - unexpected_err( - Error::new(ErrorKind::Other, "Ciphertexts are not yet set"), - None, - ) + unexpected_err(Error::other("Ciphertexts are not yet set"), None) } #[instrument(level = "debug", skip_all)] @@ -791,7 +811,7 @@ impl RestoreState { Some(rd) => rd, None => { let err_msg = format!("Curve is not being restored: {}", share_data.curve); - return Err(parser_err(Error::new(ErrorKind::Other, err_msg), None)); + return Err(parser_err(Error::other(err_msg), None)); } }; @@ -804,7 +824,7 @@ impl RestoreState { recovery_data.encryption_key.to_compressed_hex(), share_data.encryption_key, ); - return Err(unexpected_err(Error::new(ErrorKind::Other, err_msg), None)); + return Err(unexpected_err(Error::other(err_msg), None)); } for eks_and_ds in recovery_data.eks_and_ds.iter_mut() { @@ -824,7 +844,7 @@ impl RestoreState { "An encrypted key share with pub_key {} does not exist.", share_data.verification_key ); - Err(unexpected_err(Error::new(ErrorKind::Other, err_msg), None)) + Err(unexpected_err(Error::other(err_msg), None)) } } @@ -840,10 +860,11 @@ pub struct RestoredKeyShares { pub jubjub_shares: Vec, pub decaf377_shares: Vec, pub bls12381g1_shares: Vec, + pub pallas_shares: Vec, } /// Used to log the state of the disaster recovery. -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Default, Serialize, Deserialize)] pub struct RestoreStateLog { actively_restoring: bool, backups_loaded: bool, @@ -858,6 +879,7 @@ pub struct RestoreStateLog { jubjub_enc_key: Option, decaf377_enc_key: Option, bls12381g1_enc_key: Option, + pallas_enc_key: Option, bls_shares: Vec, k256_shares: Vec, p256_shares: Vec, @@ -868,6 +890,7 @@ pub struct RestoreStateLog { jubjub_shares: Vec, decaf377_shares: Vec, bls12381g1_shares: Vec, + pallas_shares: Vec, threshold: usize, } @@ -893,6 +916,7 @@ impl RestoreStateLog { bls12381g1_enc_key: CurveRecoveryData::encryption_key( &state.bls12381g1_recovery_data, ), + pallas_enc_key: CurveRecoveryData::encryption_key(&state.pallas_recovery_data), bls_shares: CurveRecoveryData::log_shares(&state.bls_recovery_data), k256_shares: CurveRecoveryData::log_shares(&state.k256_recovery_data), p256_shares: CurveRecoveryData::log_shares(&state.p256_recovery_data), @@ -905,33 +929,12 @@ impl RestoreStateLog { jubjub_shares: CurveRecoveryData::log_shares(&state.jubjub_recovery_data), decaf377_shares: CurveRecoveryData::log_shares(&state.decaf377_recovery_data), bls12381g1_shares: CurveRecoveryData::log_shares(&state.bls12381g1_recovery_data), + pallas_shares: CurveRecoveryData::log_shares(&state.pallas_recovery_data), threshold: state.threshold, }, None => Self { actively_restoring: restore_state.actively_restoring.load(Ordering::Acquire), - backups_loaded: false, - recovery_party_members: Default::default(), - bls_enc_key: Default::default(), - k256_enc_key: Default::default(), - p256_enc_key: Default::default(), - p384_enc_key: Default::default(), - ed25519_enc_key: Default::default(), - ristretto25519_enc_key: Default::default(), - ed448_enc_key: Default::default(), - jubjub_enc_key: Default::default(), - decaf377_enc_key: Default::default(), - bls12381g1_enc_key: Default::default(), - bls_shares: Default::default(), - k256_shares: Default::default(), - p256_shares: Default::default(), - p384_shares: Default::default(), - ed25519_shares: Default::default(), - ristretto25519_shares: Default::default(), - ed448_shares: Default::default(), - jubjub_shares: Default::default(), - decaf377_shares: Default::default(), - bls12381g1_shares: Default::default(), - threshold: 0, + ..Default::default() }, } } @@ -1005,15 +1008,15 @@ mod tests { use crate::tss::common::storage::{ StorageType, read_key_share_from_disk, read_recovery_data_from_disk, }; + use crate::tss::util::DEFAULT_KEY_SET_NAME; use async_std::path::PathBuf; - use blsful::inner_types::G1Projective; - use elliptic_curve::Group; - use elliptic_curve::group::GroupEncoding; use k256::Secp256k1; - use lit_node_core::CompressedBytes; - use lit_node_core::CompressedHex; - use lit_node_core::CurveType; + use lit_node_core::{CompressedBytes, CompressedHex, CurveType}; use lit_recovery::models::{EncryptedKeyShare, OldEncryptedKeyShare, UploadedShareData}; + use lit_rust_crypto::{ + blsful::inner_types::G1Projective, + group::{Group, GroupEncoding}, + }; use verifiable_share_encryption::VerifiableEncryption; use vsss_rs::{DefaultShare, IdentifierPrimeField}; @@ -1107,16 +1110,23 @@ mod tests { blinders: AtomicShared::new(blinders), actively_restoring: AtomicBool::new(true), state: RwLock::new(None), - restoring_root_keys: AtomicShared::new(vec![ - CachedRootKey { - curve_type: CurveType::BLS, - public_key: BLS_ROOT_KEY.to_string(), + restoring_key_set: AtomicShared::new(KeySetConfig { + identifier: DEFAULT_KEY_SET_NAME.to_string(), + description: String::new(), + minimum_threshold: 3, + monetary_value: 0, + complete_isolation: false, + realms: maplit::hashset![1], + root_keys_by_curve: maplit::hashmap! { + CurveType::BLS => vec![BLS_ROOT_KEY.to_string()], + CurveType::K256 => vec![K256_ROOT_KEY.to_string()] }, - CachedRootKey { - curve_type: CurveType::K256, - public_key: K256_ROOT_KEY.to_string(), + root_key_counts: maplit::hashmap! { + CurveType::BLS => 1, + CurveType::K256 => 1, }, - ]), + recovery_session_id: "".to_string(), + }), }; // Generate recovery party members @@ -1305,7 +1315,7 @@ mod tests { where C: VerifiableEncryption + VerifiableEncryptionDecryptor, { - use elliptic_curve::PrimeField; + use lit_rust_crypto::ff::PrimeField; let mut decryption_key_bytes = hex::decode(decryption_key_share).unwrap(); if curve_type == CurveType::BLS { decryption_key_bytes.reverse(); // Converting from Big Endian to Little Endian which is required by DecryptionShare diff --git a/rust/lit-node/lit-node/src/tss/common/signing_scheme.rs b/rust/lit-node/lit-node/src/tss/common/signing_scheme.rs deleted file mode 100644 index b39a27f3..00000000 --- a/rust/lit-node/lit-node/src/tss/common/signing_scheme.rs +++ /dev/null @@ -1,26 +0,0 @@ -use crate::error::{Result, unexpected_err}; -use lit_node_core::SigningScheme; - -pub fn signing_scheme_to_frost_scheme(value: SigningScheme) -> Result { - match value { - SigningScheme::Bls12381 | SigningScheme::Bls12381G1ProofOfPossession => Err( - unexpected_err("BLS signatures are not supported by FROST", None), - ), - SigningScheme::EcdsaK256Sha256 - | SigningScheme::EcdsaP256Sha256 - | SigningScheme::EcdsaP384Sha384 => Err(unexpected_err( - "ECDSA signatures are not supported by FROST", - None, - )), - SigningScheme::SchnorrEd25519Sha512 => Ok(lit_frost::Scheme::Ed25519Sha512), - SigningScheme::SchnorrK256Sha256 => Ok(lit_frost::Scheme::K256Sha256), - SigningScheme::SchnorrP256Sha256 => Ok(lit_frost::Scheme::P256Sha256), - SigningScheme::SchnorrP384Sha384 => Ok(lit_frost::Scheme::P384Sha384), - SigningScheme::SchnorrRistretto25519Sha512 => Ok(lit_frost::Scheme::Ristretto25519Sha512), - SigningScheme::SchnorrEd448Shake256 => Ok(lit_frost::Scheme::Ed448Shake256), - SigningScheme::SchnorrRedJubjubBlake2b512 => Ok(lit_frost::Scheme::RedJubjubBlake2b512), - SigningScheme::SchnorrK256Taproot => Ok(lit_frost::Scheme::K256Taproot), - SigningScheme::SchnorrRedDecaf377Blake2b512 => Ok(lit_frost::Scheme::RedDecaf377Blake2b512), - SigningScheme::SchnorrkelSubstrate => Ok(lit_frost::Scheme::SchnorrkelSubstrate), - } -} diff --git a/rust/lit-node/lit-node/src/tss/common/storage.rs b/rust/lit-node/lit-node/src/tss/common/storage.rs index c4b64a0c..bc858837 100644 --- a/rust/lit-node/lit-node/src/tss/common/storage.rs +++ b/rust/lit-node/lit-node/src/tss/common/storage.rs @@ -486,7 +486,7 @@ async fn delete_from_disk(path: PathBuf, key_cache: &KeyCache) -> Result<()> { .to_str() .expect("Could not convert path to string") .to_string(); - key_cache.as_ref().remove(&key_path); + key_cache.as_ref().remove_sync(&key_path); Ok(()) } @@ -743,15 +743,15 @@ impl StorableFile { ) })?; - if file_type.is_file() { - if let Some(file_name) = entry.file_name().to_str() { - let storable_file: StorableFile = file_name.parse()?; - if storable_file.realm_id == self.realm_id - && storable_file.epoch < self.epoch - && storable_file.epoch != RECOVERY_DKG_EPOCH - { - let _r = delete_from_disk(entry.path(), key_cache).await; - } + if file_type.is_file() + && let Some(file_name) = entry.file_name().to_str() + { + let storable_file: StorableFile = file_name.parse()?; + if storable_file.realm_id == self.realm_id + && storable_file.epoch < self.epoch + && storable_file.epoch != RECOVERY_DKG_EPOCH + { + let _r = delete_from_disk(entry.path(), key_cache).await; } } } @@ -771,9 +771,12 @@ mod test { delete_keyshares_older_than_epoch, read_key_share_commitments_from_disk, write_key_share_commitments_to_disk, }; - use elliptic_curve::Group; - use lit_node_core::PeerId; - use lit_node_core::{CompressedHex, CurveType}; + use lit_node_core::{CompressedHex, CurveType, PeerId}; + use lit_rust_crypto::{ + blsful::inner_types::{G1Projective, Scalar}, + group::Group, + k256, + }; use rand_core::SeedableRng; use semver::Version; @@ -792,16 +795,15 @@ mod test { #[tokio::test] async fn delete_key_shares_older_than_epoch_test() { let peer_id = PeerId::from_u8(7); - let sk = blsful::inner_types::Scalar::from_bytes_wide(&[1u8; 64]); - let pk = blsful::inner_types::G1Projective::GENERATOR * sk; + let sk = Scalar::from_bytes_wide(&[1u8; 64]); + let pk = G1Projective::GENERATOR * sk; let pubkey = pk.to_compressed_hex(); let stkr = k256::Scalar::from(137u64); let stkr_pub = k256::ProjectivePoint::GENERATOR * stkr; let staker_address = stkr_pub.to_compressed_hex(); - let key_persistence = - KeyPersistence::::new(CurveType::BLS); + let key_persistence = KeyPersistence::::new(CurveType::BLS); let key_cache = KeyCache::default(); let peers = dummy_peers(); diff --git a/rust/lit-node/lit-node/src/tss/common/traits/cipherable.rs b/rust/lit-node/lit-node/src/tss/common/traits/cipherable.rs index 26c79140..db0faca6 100644 --- a/rust/lit-node/lit-node/src/tss/common/traits/cipherable.rs +++ b/rust/lit-node/lit-node/src/tss/common/traits/cipherable.rs @@ -1,6 +1,6 @@ use crate::error::Result; // EC , conversion_err_code -use blsful::{Bls12381G2Impl, SignatureShare}; use lit_node_core::PeerId; +use lit_rust_crypto::blsful::{Bls12381G2Impl, SignatureShare}; use std::fmt::Debug; #[async_trait::async_trait] @@ -8,6 +8,7 @@ pub trait Cipherable: Debug + Send + Sync { async fn sign( &self, message_bytes: &[u8], + key_set_id: Option<&str>, epoch: Option, ) -> Result<(SignatureShare, PeerId)>; @@ -15,6 +16,7 @@ pub trait Cipherable: Debug + Send + Sync { &self, message_bytes: &[u8], public_key: &str, + key_set_id: Option<&str>, epoch: Option, ) -> Result<(SignatureShare, PeerId)>; } diff --git a/rust/lit-node/lit-node/src/tss/common/traits/dkg.rs b/rust/lit-node/lit-node/src/tss/common/traits/dkg.rs deleted file mode 100644 index 95ba3532..00000000 --- a/rust/lit-node/lit-node/src/tss/common/traits/dkg.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::version::DataVersionReader; -use lit_node_core::CurveType; -use std::{fmt::Debug, sync::Arc}; - -#[async_trait::async_trait] -pub trait BasicDkg: Debug + Send + Sync { - fn tss_state(&self) -> Arc; - fn curve_type(&self) -> CurveType; - async fn root_keys(&self) -> Vec { - let curve_type = self.curve_type(); - DataVersionReader::read_field_unchecked( - &self.tss_state().chain_data_config_manager.root_keys, - |crk| { - crk.iter() - .filter_map(|k| match k.curve_type == curve_type { - true => Some(k.public_key.clone()), - false => None, - }) - .collect() - }, - ) - } -} diff --git a/rust/lit-node/lit-node/src/tss/common/traits/mod.rs b/rust/lit-node/lit-node/src/tss/common/traits/mod.rs index 15aa9bb3..763859fe 100644 --- a/rust/lit-node/lit-node/src/tss/common/traits/mod.rs +++ b/rust/lit-node/lit-node/src/tss/common/traits/mod.rs @@ -1,5 +1,4 @@ pub mod cipherable; -pub mod dkg; pub mod fsm_worker_metadata; pub mod signable; mod vrf; diff --git a/rust/lit-node/lit-node/src/tss/common/traits/signable.rs b/rust/lit-node/lit-node/src/tss/common/traits/signable.rs index 24f07a6d..e3131233 100644 --- a/rust/lit-node/lit-node/src/tss/common/traits/signable.rs +++ b/rust/lit-node/lit-node/src/tss/common/traits/signable.rs @@ -9,9 +9,9 @@ pub trait Signable: Debug + Send + Sync { &mut self, message_bytes: &[u8], public_key: Vec, - root_pubkeys: Option>, tweak_preimage: Option>, request_id: Vec, + key_set_id: Option<&str>, epoch: Option, nodeset: &[NodeSet], ) -> Result; diff --git a/rust/lit-node/lit-node/src/tss/common/traits/vrf.rs b/rust/lit-node/lit-node/src/tss/common/traits/vrf.rs index 5b13f966..620aed06 100644 --- a/rust/lit-node/lit-node/src/tss/common/traits/vrf.rs +++ b/rust/lit-node/lit-node/src/tss/common/traits/vrf.rs @@ -1,14 +1,16 @@ use crate::error::Result; -use crate::tss::common::traits::dkg::BasicDkg; -use elliptic_curve::{Group, group::GroupEncoding}; +use crate::tss::common::curve_state::CurveState; +use lit_rust_crypto::elliptic_curve::{Group, group::GroupEncoding}; use lit_vrf::Proof; #[allow(dead_code)] #[async_trait::async_trait] -pub trait Vrf: BasicDkg +pub trait Vrf where G: Group + GroupEncoding + Default, { + fn curve_state(&self) -> CurveState; + async fn prove(&self, message: &[u8]) -> Result>; async fn verify(&self, message: &[u8], proof: Proof) -> Result<()>; diff --git a/rust/lit-node/lit-node/src/tss/common/tss_state.rs b/rust/lit-node/lit-node/src/tss/common/tss_state.rs index 05aea556..f2d561a9 100644 --- a/rust/lit-node/lit-node/src/tss/common/tss_state.rs +++ b/rust/lit-node/lit-node/src/tss/common/tss_state.rs @@ -1,6 +1,5 @@ use super::models::{NodeTransmissionDetails, RoundData}; use super::traits::cipherable::Cipherable; -use super::traits::dkg::BasicDkg; use super::traits::signable::Signable; use crate::common::key_helper::KeyCache; use crate::config::chain::ChainDataConfigManager; @@ -153,6 +152,7 @@ impl TssState { | SigningScheme::SchnorrEd448Shake256 | SigningScheme::SchnorrRedJubjubBlake2b512 | SigningScheme::SchnorrRedDecaf377Blake2b512 + | SigningScheme::SchnorrRedPallasBlake2b512 | SigningScheme::SchnorrkelSubstrate => { Box::new(FrostState::new(state, signing_scheme)) as Box } @@ -161,7 +161,7 @@ impl TssState { } _ => { return Err(unexpected_err( - "Unsupported key type when for Signable.", + "Unsupported key type when creating signing state.", None, )); } @@ -187,12 +187,6 @@ impl TssState { Ok(cipher_state) } - #[instrument(level = "debug", skip(self))] - pub fn get_dkg_state(&self, curve_type: CurveType) -> Result> { - let state = Arc::new(self.clone()); - Ok(Box::new(CurveState { state, curve_type }) as Box) - } - pub async fn get_threshold_using_current_epoch_realm_peers_for_curve( &self, peers: &SimplePeerCollection, @@ -201,8 +195,10 @@ impl TssState { ) -> Result { let self_peer = peers.peer_at_address(&self.addr)?; - let dkg_state = self.get_dkg_state(curve_type)?; - let root_keys = dkg_state.root_keys().await; + // Shouldn't matter which key set is used, all the keys on this + // node should have the same threshold + let curve_state = CurveState::new(self.peer_state.clone(), curve_type, None); + let root_keys = curve_state.root_keys()?; if root_keys.is_empty() { return Err(unexpected_err( @@ -213,10 +209,7 @@ impl TssState { let staker_address = &bytes_to_hex(self_peer.staker_address.as_bytes()); let realm_id = self.peer_state.realm_id(); - let epoch = match epoch { - Some(e) => e, - None => self.peer_state.epoch(), - }; + let epoch = epoch.unwrap_or_else(|| self.peer_state.epoch()); let keyshare = read_key_share_from_disk::( curve_type, diff --git a/rust/lit-node/lit-node/src/tss/dkg/engine.rs b/rust/lit-node/lit-node/src/tss/dkg/engine.rs index 9983253c..07981f6a 100644 --- a/rust/lit-node/lit-node/src/tss/dkg/engine.rs +++ b/rust/lit-node/lit-node/src/tss/dkg/engine.rs @@ -4,6 +4,7 @@ use crate::error::{Result, unexpected_err}; use crate::metrics; use crate::p2p_comms::CommsManager; use crate::peers::peer_state::models::{SimplePeer, SimplePeerCollection}; +use crate::tasks::fsm::epoch_change::ShadowOptions; use crate::tss::common::dkg_type::DkgType; use crate::tss::common::key_persistence::{KeyPersistence, RECOVERY_DKG_EPOCH}; use crate::tss::common::key_share::KeyShare; @@ -15,21 +16,24 @@ use crate::tss::common::storage::{ }; use crate::tss::common::tss_state::TssState; use crate::tss::dkg::models::{DkgOutput, Mode}; -use elliptic_curve::group::GroupEncoding; -use frost_dkg::elliptic_curve_tools::SumOfProducts; +use crate::version::DataVersionReader; +use elliptic_curve_tools::SumOfProducts; use frost_dkg::*; use lit_blockchain::contracts::backup_recovery::RecoveredPeerId; use lit_core::error::Unexpected; -use lit_node_core::CurveType; -use lit_node_core::PeerId; -use lit_node_core::{CompressedBytes, CompressedHex}; +use lit_node_core::{CompressedBytes, CompressedHex, CurveType, PeerId}; +use lit_rust_crypto::{ + blsful, decaf377, ed448_goldilocks, + group::GroupEncoding, + jubjub, k256, p256, p384, pallas, + vsss_rs::{self, DefaultShare, IdentifierPrimeField, ParticipantIdGeneratorType}, +}; use serde::{Deserialize, Serialize}; use std::collections::btree_map::Values; use std::collections::{BTreeMap, HashMap, HashSet}; use std::num::NonZeroUsize; use std::sync::Arc; use tracing::instrument; -use vsss_rs::{DefaultShare, IdentifierPrimeField, ParticipantIdGeneratorType}; const MIN_EPOCH_FOR_COMMITMENT_DELETION: u64 = 1; #[derive(Clone, Debug)] @@ -39,7 +43,7 @@ pub struct DkgEngine { dkg_type: DkgType, epoch: u64, threshold: usize, - shadow_key_opts: (u64, u64), + shadow_key_opts: ShadowOptions, current_peers: SimplePeerCollection, next_peers: SimplePeerCollection, next_dkg_after_restore: DkgAfterRestore, @@ -70,6 +74,7 @@ impl DkgAfterRestore { pub struct DkgAfterRestoreData { pub peers: Vec, pub key_cache: KeyCache, + pub use_raw_peer_ids: bool, } impl DkgEngine { @@ -80,7 +85,7 @@ impl DkgEngine { dkg_type: DkgType, epoch: u64, threshold: usize, - shadow_key_opts: (u64, u64), + shadow_key_opts: &ShadowOptions, current_peers: &SimplePeerCollection, next_peers: &SimplePeerCollection, next_dkg_after_restore: DkgAfterRestore, @@ -90,7 +95,7 @@ impl DkgEngine { dkg_type, epoch, threshold, - shadow_key_opts, + shadow_key_opts: shadow_key_opts.clone(), current_peers: current_peers.clone(), next_peers: next_peers.clone(), dkgs: BTreeMap::new(), @@ -99,10 +104,17 @@ impl DkgEngine { } /// Add a DKG to be computed - pub fn add_dkg(&mut self, dkg_id: &str, curve_type: CurveType, pubkey: Option) { + pub fn add_dkg( + &mut self, + dkg_id: &str, + key_set_id: &str, + curve_type: CurveType, + pubkey: Option, + ) { let dkg_data = DkgData { dkg_id: dkg_id.to_string(), curve_type, + key_set_id: key_set_id.to_string(), pubkey: pubkey.clone(), result: None, }; @@ -276,11 +288,20 @@ impl DkgEngine { let participant = self .create_participant::( &create_participant_args, - Some(lit_frost::red_jubjub_generator()), + Some(lit_rust_crypto::red_jubjub_signing_generator()), ) .await?; dkg_participants.push(DkgCurve::JubJub(participant)); } + CurveType::RedPallas => { + let participant = self + .create_participant::( + &create_participant_args, + Some(lit_rust_crypto::red_pallas_signing_generator()), + ) + .await?; + dkg_participants.push(DkgCurve::Pallas(participant)); + } CurveType::RedDecaf377 => { let participant = self .create_participant::(&create_participant_args, None) @@ -299,7 +320,7 @@ impl DkgEngine { } } - let txn_prefix = format!("{}.{}_keyset1", root_dkg_id, self.dkg_type); + let txn_prefix = format!("{}.{}_keyset", root_dkg_id, self.dkg_type); trace!( "Node {} - Using DKG txn prefix: {}, realm_id: {}", self_peer.peer_id, txn_prefix, realm_id @@ -497,6 +518,10 @@ impl DkgEngine { self.create_dkg_result::(&args, p.as_ref()) .await?, ), + DkgCurve::Pallas(p) => DkgResult::Pallas( + self.create_dkg_result::(&args, p.as_ref()) + .await?, + ), DkgCurve::Decaf377(p) => DkgResult::Decaf377( self.create_dkg_result::(&args, p.as_ref()) .await?, @@ -670,34 +695,46 @@ impl DkgEngine { .await?; if delete_epoch > MIN_EPOCH_FOR_COMMITMENT_DELETION { - debug!( - "Removing old key share commitments for epochs less than {}", - delete_epoch - ); - let _ = delete_key_share_commitments_older_than_epoch( - args.curve_type, - &pubkey, - staker_address, - &args.peer_id, - delete_epoch, - args.realm_id, - &self.tss_state.key_cache, - ) - .await; - debug!( - "Removing old key shares for epochs less than {}", - delete_epoch + let shadow_realm_id = DataVersionReader::read_field_unchecked( + &self.tss_state.chain_data_config_manager.shadow_realm_id, + |realm| realm.as_u64(), ); - let _ = delete_keyshares_older_than_epoch( - args.curve_type, - &pubkey, - staker_address, - &args.peer_id, - delete_epoch, - args.realm_id, - &self.tss_state.key_cache, - ) - .await; + + if shadow_realm_id > 0 { + debug!( + "Holding on to key shares and commitments while processing shadow realm {} / epoch {}", + args.realm_id, delete_epoch + ); + } else { + debug!( + "Removing old key share commitments for epochs less than {}", + delete_epoch + ); + let _ = delete_key_share_commitments_older_than_epoch( + args.curve_type, + &pubkey, + staker_address, + &args.peer_id, + delete_epoch, + args.realm_id, + &self.tss_state.key_cache, + ) + .await; + debug!( + "Removing old key shares for epochs less than {}", + delete_epoch + ); + let _ = delete_keyshares_older_than_epoch( + args.curve_type, + &pubkey, + staker_address, + &args.peer_id, + delete_epoch, + args.realm_id, + &self.tss_state.key_cache, + ) + .await; + } } Ok(DkgOutput { @@ -739,10 +776,16 @@ impl DkgEngine { args.realm_id, args.dkg_data.dkg_id, args.dkg_data.curve_type, - id.0.to_compressed_hex(), + format!( + "{}...", + id.0.to_compressed_hex().chars().take(6).collect::() + ), new_id_scalars .iter() - .map(|x| x.0.to_compressed_hex()) + .map(|x| format!( + "{}...", + x.0.to_compressed_hex().chars().take(6).collect::() + )) .collect::>() .join(", "), ); @@ -822,52 +865,50 @@ impl DkgEngine { DkgAfterRestore::False => &dummy_key_cache, }; + // in the initial epoch when we're shadow splicing we actually use the same key share as regular DKG... + // this is specific to the first nodes in the realm, and only for the first epoch. + let (read_epoch, read_realm_id) = if self.shadow_key_opts.is_shadow + && self.shadow_key_opts.epoch_number > 1 + { + trace!("Using shadow key opts to read key share from disk."); + ( + self.shadow_key_opts.epoch_number, + self.shadow_key_opts.realm_id, + ) + } else if self.shadow_key_opts.is_shadow { + trace!( + "Using normal key opts to read key share from disk while in shadow realm." + ); + ( + self.shadow_key_opts.non_shadow_epoch_number, + self.shadow_key_opts.non_shadow_realm_id, + ) + } else { + trace!("Using normal key opts to read key share from disk."); + + (self.epoch, realm_id) + }; + let key_share = match read_key_share_from_disk::( key_state.curve_type, pubkey, staker_address, &args.peer_id, - self.epoch, - realm_id, + read_epoch, + read_realm_id, key_cache, ) .await { Ok(share) => share, Err(e) => { - if self.shadow_key_opts.0 == self.epoch - && self.shadow_key_opts.1 == realm_id - { - let err_msg = - format!("Error reading key share for public key {}", pubkey); - error!("{}", err_msg); - return Err(unexpected_err(e, Some(err_msg))); - } else { - trace!( - "Key share not found on disk for public key {}, using key epoch {} / realm {} to retry. Original error: {}", - pubkey, self.shadow_key_opts.0, self.shadow_key_opts.1, e - ); - } - - match read_key_share_from_disk::( - key_state.curve_type, - pubkey, - staker_address, - &args.peer_id, - self.shadow_key_opts.0, - self.shadow_key_opts.1, - key_cache, - ) - .await - { - Ok(share) => share, - Err(e) => { - let err_msg = - format!("Error reading key share for public key {}", pubkey); - error!("{}", err_msg); - return Err(unexpected_err(e, Some(err_msg))); - } - } + let err_msg = format!( + "Error reading key share in realm {}, epoch {}, for public key {}", + read_realm_id, read_epoch, pubkey + ); + error!("{}", err_msg); + error!("Shadow key opts: {:?}", self.shadow_key_opts); + return Err(unexpected_err(e, Some(err_msg))); } }; @@ -892,7 +933,7 @@ impl DkgEngine { ); }; let private_share = key_state.secret_from_hex(&key_share.hex_private_share)?; - let old_share = DefaultShare { + let mut old_share = DefaultShare { identifier: IdentifierPrimeField(G::Scalar::from(key_share.peer_id)), value: IdentifierPrimeField(private_share), }; @@ -901,6 +942,10 @@ impl DkgEngine { // share is no longer used, the corresponding peer id should be dropped as well. let old_ids = match &self.next_dkg_after_restore { DkgAfterRestore::True(data) => { + if data.use_raw_peer_ids { + old_share.identifier.0 = + G::Scalar::from(key_share.peer_id.0.as_words()[0]); + } let mut old_ids = vec![]; for pair in data.peers.iter() { let new_peer_id = PeerId::try_from(pair.new_peer_id) @@ -908,7 +953,14 @@ impl DkgEngine { let old_peer_id = PeerId::try_from(pair.old_peer_id) .map_err(|e| unexpected_err(e, None))?; if args.next_ids.contains(&new_peer_id) { - old_ids.push(IdentifierPrimeField(G::Scalar::from(old_peer_id))); + if data.use_raw_peer_ids { + old_ids.push(IdentifierPrimeField(G::Scalar::from( + pair.old_peer_id.as_u64(), + ))) + } else { + old_ids + .push(IdentifierPrimeField(G::Scalar::from(old_peer_id))); + } } } old_ids @@ -940,30 +992,24 @@ impl DkgEngine { } } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Default)] pub struct DkgData { pub(crate) dkg_id: String, + pub(crate) key_set_id: String, pub(crate) curve_type: CurveType, pub(crate) pubkey: Option, pub(crate) result: Option, } -impl Default for DkgData { - fn default() -> Self { - Self { - dkg_id: "".to_string(), - curve_type: CurveType::BLS, - pubkey: None, - result: None, - } - } -} - impl DkgData { pub fn dkg_id(&self) -> &str { &self.dkg_id } + pub fn key_set_id(&self) -> &str { + &self.key_set_id + } + pub fn curve_type(&self) -> CurveType { self.curve_type } @@ -988,6 +1034,7 @@ pub enum DkgScalar { Ed448(ed448_goldilocks::Scalar), JubJub(jubjub::Scalar), Decaf377(decaf377::Fr), + Pallas(pallas::Scalar), Bls12381G1ProofOfPossession(blsful::inner_types::Scalar), } @@ -1003,6 +1050,7 @@ impl std::fmt::Display for DkgScalar { Self::Ed448(scalar) => scalar.to_compressed_hex(), Self::JubJub(scalar) => scalar.to_compressed_hex(), Self::Decaf377(scalar) => scalar.to_compressed_hex(), + Self::Pallas(scalar) => scalar.to_compressed_hex(), Self::Bls12381G1ProofOfPossession(scalar) => scalar.to_compressed_hex(), }; write!(f, "{}", hex) @@ -1019,6 +1067,7 @@ pub enum DkgResult { Ristretto256(DkgOutput), Ed448(DkgOutput), JubJub(DkgOutput), + Pallas(DkgOutput), Decaf377(DkgOutput), Bls12381G1ProofOfPossession(DkgOutput), } @@ -1063,6 +1112,10 @@ impl DkgResult { let helper = KeyPersistence::::new(CurveType::RedJubjub); helper.pk_to_hex(&output.pk) } + Self::Pallas(output) => { + let helper = KeyPersistence::::new(CurveType::RedPallas); + helper.pk_to_hex(&output.pk) + } Self::Decaf377(output) => { let helper = KeyPersistence::::new(CurveType::RedDecaf377); helper.pk_to_hex(&output.pk) @@ -1138,6 +1191,13 @@ impl DkgResult { public_key: helper.pk_to_hex(&output.pk), } } + Self::Pallas(output) => { + let helper = KeyPersistence::::new(CurveType::RedPallas); + CachedRootKey { + curve_type: CurveType::RedPallas, + public_key: helper.pk_to_hex(&output.pk), + } + } Self::Decaf377(output) => { let helper = KeyPersistence::::new(CurveType::RedDecaf377); CachedRootKey { @@ -1168,6 +1228,7 @@ pub enum DkgCurve { Ed448(Box>), JubJub(Box>), Decaf377(Box>), + Pallas(Box>), Bls12381G1ProofOfPossession(Box>), } @@ -1182,6 +1243,7 @@ impl DkgCurve { Self::Ristretto25519(participant) => participant.get_round(), Self::Ed448(participant) => participant.get_round(), Self::JubJub(participant) => participant.get_round(), + Self::Pallas(participant) => participant.get_round(), Self::Decaf377(participant) => participant.get_round(), Self::Bls12381G1ProofOfPossession(participant) => participant.get_round(), } @@ -1262,6 +1324,15 @@ impl DkgCurve { })?; Ok(DkgRoundOutputGenerator::JubJub(output)) } + DkgCurve::Pallas(participant) => { + let output = participant.run().map_err(|e| { + unexpected_err( + e, + Some("an error occurred while computing next round".to_string()), + ) + })?; + Ok(DkgRoundOutputGenerator::Pallas(output)) + } DkgCurve::Decaf377(participant) => { let output = participant.run().map_err(|e| { unexpected_err( @@ -1294,6 +1365,7 @@ impl DkgCurve { DkgCurve::Ristretto25519(participant) => participant.completed(), DkgCurve::Ed448(participant) => participant.completed(), DkgCurve::JubJub(participant) => participant.completed(), + DkgCurve::Pallas(participant) => participant.completed(), DkgCurve::Decaf377(participant) => participant.completed(), DkgCurve::Bls12381G1ProofOfPossession(participant) => participant.completed(), } @@ -1345,6 +1417,12 @@ impl DkgCurve { ) => participant.receive(&participant_data.data).map_err(|e| { unexpected_err(e, Some("an error occurred while receiving".to_string())) }), + ( + DkgCurve::Pallas(participant), + DkgParticipantRoundOutput::Pallas(participant_data), + ) => participant.receive(&participant_data.data).map_err(|e| { + unexpected_err(e, Some("an error occurred while receiving".to_string())) + }), ( DkgCurve::Decaf377(participant), DkgParticipantRoundOutput::Decaf377(participant_data), @@ -1390,6 +1468,9 @@ impl DkgCurve { DkgCurve::JubJub(participant) => participant .get_public_key() .map(|pk| ::to_compressed(&pk)), + DkgCurve::Pallas(participant) => participant + .get_public_key() + .map(|pk| ::to_compressed(&pk)), DkgCurve::Decaf377(participant) => participant .get_public_key() .map(|pk| ::to_compressed(&pk)), @@ -1431,6 +1512,9 @@ impl DkgCurve { DkgCurve::JubJub(participant) => participant .get_secret_share() .map(|share| ::to_compressed(&share.value.0)), + DkgCurve::Pallas(participant) => participant + .get_secret_share() + .map(|share| ::to_compressed(&share.value.0)), DkgCurve::Decaf377(participant) => participant .get_secret_share() .map(|share| ::to_compressed(&share.value.0)), @@ -1453,6 +1537,7 @@ pub enum DkgRoundOutputGenerator { Ristretto25519(RoundOutputGenerator), Ed448(RoundOutputGenerator), JubJub(RoundOutputGenerator), + Pallas(RoundOutputGenerator), Decaf377(RoundOutputGenerator), Bls12381G1ProofOfPossession(RoundOutputGenerator), } @@ -1486,6 +1571,9 @@ impl DkgRoundOutputGenerator { DkgRoundOutputGenerator::JubJub(generator) => { Box::new(generator.iter().map(DkgParticipantRoundOutput::JubJub)) } + DkgRoundOutputGenerator::Pallas(generator) => { + Box::new(generator.iter().map(DkgParticipantRoundOutput::Pallas)) + } DkgRoundOutputGenerator::Decaf377(generator) => { Box::new(generator.iter().map(DkgParticipantRoundOutput::Decaf377)) } @@ -1514,6 +1602,7 @@ pub enum DkgParticipantRoundOutput { Ristretto25519(ParticipantRoundOutput), Ed448(ParticipantRoundOutput), JubJub(ParticipantRoundOutput), + Pallas(ParticipantRoundOutput), Decaf377(ParticipantRoundOutput), Bls12381G1ProofOfPossession(ParticipantRoundOutput), } @@ -1530,6 +1619,7 @@ impl DkgParticipantRoundOutput { Self::Ed448(data) => DkgScalar::Ed448(data.dst_id.0), Self::JubJub(data) => DkgScalar::JubJub(data.dst_id.0), Self::Decaf377(data) => DkgScalar::Decaf377(data.dst_id.0), + Self::Pallas(data) => DkgScalar::Pallas(data.dst_id.0), Self::Bls12381G1ProofOfPossession(data) => { DkgScalar::Bls12381G1ProofOfPossession(data.dst_id.0) } @@ -1546,6 +1636,7 @@ impl DkgParticipantRoundOutput { Self::Ristretto25519(data) => data.dst_ordinal, Self::Ed448(data) => data.dst_ordinal, Self::JubJub(data) => data.dst_ordinal, + Self::Pallas(data) => data.dst_ordinal, Self::Decaf377(data) => data.dst_ordinal, Self::Bls12381G1ProofOfPossession(data) => data.dst_ordinal, } @@ -1561,6 +1652,7 @@ impl DkgParticipantRoundOutput { Self::Ristretto25519(data) => data.data.clone(), Self::Ed448(data) => data.data.clone(), Self::JubJub(data) => data.data.clone(), + Self::Pallas(data) => data.data.clone(), Self::Decaf377(data) => data.data.clone(), Self::Bls12381G1ProofOfPossession(data) => data.data.clone(), } diff --git a/rust/lit-node/lit-node/src/tss/dkg/manager.rs b/rust/lit-node/lit-node/src/tss/dkg/manager.rs index 020e03dc..f28d3922 100644 --- a/rust/lit-node/lit-node/src/tss/dkg/manager.rs +++ b/rust/lit-node/lit-node/src/tss/dkg/manager.rs @@ -1,13 +1,15 @@ use crate::config::chain::CachedRootKey; use crate::error::{Result, unexpected_err}; +use crate::models::KeySetConfig; use crate::peers::peer_state::models::SimplePeerCollection; +use crate::tasks::fsm::epoch_change::ShadowOptions; use crate::tss::common::dkg_type::DkgType; use crate::tss::common::tss_state::TssState; use crate::tss::dkg::engine::{DkgAfterRestore, DkgEngine}; use crate::tss::dkg::models::Mode; -use crate::tss::util::DEFAULT_KEY_SET_NAME; +use crate::version::DataVersionWriter; use lit_core::error::Unexpected; -use lit_node_core::CurveType; +use std::collections::HashMap; use std::sync::Arc; use tracing::instrument; @@ -27,26 +29,18 @@ impl DkgManager { } } + #[allow(clippy::too_many_arguments)] #[instrument(level = "debug", skip(self, current_peers, new_peers))] pub async fn change_epoch( &self, dkg_id: &str, epoch_number: u64, - shadow_key_opts: (u64, u64), + shadow_key_opts: &ShadowOptions, realm_id: u64, current_peers: &SimplePeerCollection, new_peers: &SimplePeerCollection, - ) -> Result> { - let key_set_config = self - .tss_state - .peer_state - .staking_contract - .get_key_set(DEFAULT_KEY_SET_NAME.to_string()) - .call() - .await - .map_err(|e| unexpected_err(e, None))?; - - let mut root_keys: Vec = Vec::new(); + key_sets: &Vec, + ) -> Result>> { let threshold = self .tss_state .peer_state @@ -63,46 +57,42 @@ impl DkgManager { new_peers, self.next_dkg_after_restore.clone(), ); - let chain_root_keys = if current_peers.is_empty() { - Vec::new() - } else { - self.root_keys() - }; - for (curve_type, hd_root_key_count) in key_set_config - .curves - .iter() - .zip(key_set_config.counts.iter()) - { - let curve_type = - CurveType::try_from(*curve_type).map_err(|e| unexpected_err(e, None))?; - let hd_root_key_count = match self.dkg_type { - DkgType::RecoveryParty => 1, - DkgType::Standard => hd_root_key_count.as_usize(), - }; - let epoch_dkg_id = format!("{}.{}.{}", dkg_id, curve_type, self.dkg_type); - let existing_root_keys = if current_peers.is_empty() { - Vec::new() - } else { - chain_root_keys - .iter() - .filter_map(|k| match k.curve_type == curve_type { - true => Some(k.public_key.clone()), - false => None, - }) - .collect() - }; - for i in 0..hd_root_key_count { - if current_peers.is_empty() { - let dkg_id = format!("{}_key_{}", epoch_dkg_id, i); - dkg_engine.add_dkg(&dkg_id, curve_type, None); - } else { - let root_key = existing_root_keys.get(i).expect_or_err(format!( - "root key missing at index {} for curve: {}", - i, curve_type - ))?; + if key_sets.is_empty() { + error!("No key sets exist to do DKGs"); + return Err(unexpected_err( + "No key sets exist to do DKGs".to_string(), + None, + )); + } + + for key_set_config in key_sets { + for (&curve_type, &hd_root_key_count) in &key_set_config.root_key_counts { + let hd_root_key_count = match self.dkg_type { + DkgType::RecoveryParty => 1, + DkgType::Standard => hd_root_key_count, + }; + let epoch_dkg_id = format!( + "{}.{}.{}.{}", + dkg_id, &key_set_config.identifier, curve_type, self.dkg_type + ); + let existing_root_keys = key_set_config + .root_keys_by_curve + .get(&curve_type) + .expect("expected existing root keys but got none") + .clone(); + for i in 0..hd_root_key_count { let dkg_id = format!("{}_key_{}", epoch_dkg_id, i); - dkg_engine.add_dkg(&dkg_id, curve_type, Some(root_key.clone())); + if current_peers.is_empty() { + dkg_engine.add_dkg(&dkg_id, &key_set_config.identifier, curve_type, None); + } else { + let root_key = existing_root_keys.get(i).expect_or_err(format!( + "root key missing at index {} for curve: {}", + i, curve_type + ))?; + let key = Some(root_key.clone()); + dkg_engine.add_dkg(&dkg_id, &key_set_config.identifier, curve_type, key); + } } } } @@ -112,29 +102,51 @@ impl DkgManager { "DKG {} with ID {} completed: {:?}", self.dkg_type, dkg_id, mode ); - if let Some(m) = mode { - if m == Mode::Initial { - for dkg in dkg_engine.get_dkgs() { - match dkg.result { - Some(ref result) => { - debug!( - "DKG for epoch change complete for {} {}.", - dkg.dkg_id, dkg.curve_type - ); - root_keys.push(result.dkg_root_key()); - } - None => { - error!("DKG failed!"); - return Err(unexpected_err("DKG failed", None)); - } + let mut root_keys = HashMap::with_capacity(key_sets.len()); + if let Some(m) = mode + && m == Mode::Initial + { + let mut key_sets = DataVersionWriter::new_unchecked( + &self.tss_state.chain_data_config_manager.key_sets, + ); + for dkg in dkg_engine.get_dkgs() { + match dkg.result { + Some(ref result) => { + debug!( + "DKG for epoch change complete for {} {}.", + dkg.dkg_id, dkg.curve_type + ); + let key_set = key_sets + .get_mut(&dkg.key_set_id) + .expect("How can key set have a DKG but not exist in the key set?"); + let counts = key_set.root_key_counts[&dkg.curve_type]; + key_set + .root_keys_by_curve + .entry(dkg.curve_type) + .and_modify(|v: &mut Vec| v.push(result.public_key())) + .or_insert_with(|| { + let mut v = Vec::with_capacity(counts); + v.push(result.public_key()); + v + }); + root_keys + .entry(dkg.key_set_id.clone()) + .and_modify(|v: &mut Vec| v.push(result.dkg_root_key())) + .or_insert_with(|| { + let mut v = Vec::with_capacity(counts); + v.push(result.dkg_root_key()); + v + }); + } + None => { + error!("DKG failed!"); + return Err(unexpected_err("DKG failed", None)); } } } + key_sets.commit(); } - Ok(root_keys) - } - pub fn root_keys(&self) -> Vec { - self.tss_state.chain_data_config_manager.root_keys() + Ok(root_keys) } } diff --git a/rust/lit-node/lit-node/src/tss/dkg/models.rs b/rust/lit-node/lit-node/src/tss/dkg/models.rs index 4bf60ea7..ed1c4300 100644 --- a/rust/lit-node/lit-node/src/tss/dkg/models.rs +++ b/rust/lit-node/lit-node/src/tss/dkg/models.rs @@ -1,5 +1,5 @@ -use elliptic_curve::group::{Group, GroupEncoding}; use lit_node_core::PeerId; +use lit_rust_crypto::group::{Group, GroupEncoding}; use serde::{Deserialize, Serialize}; use std::fmt::{self, Display, Formatter}; diff --git a/rust/lit-node/lit-node/src/tss/ecdsa_damfast/mod.rs b/rust/lit-node/lit-node/src/tss/ecdsa_damfast/mod.rs index 35d68099..b0f5e061 100644 --- a/rust/lit-node/lit-node/src/tss/ecdsa_damfast/mod.rs +++ b/rust/lit-node/lit-node/src/tss/ecdsa_damfast/mod.rs @@ -9,7 +9,6 @@ use crate::{ peers::peer_state::models::SimplePeerCollection, tss::common::{dkg_type::DkgType, tss_state::TssState}, }; -use elliptic_curve::{CurveArithmetic, FieldBytesSize, NonZeroScalar, PrimeCurve}; use lit_core::error::Unexpected; use lit_core::utils::binary::bytes_to_hex; use lit_fast_ecdsa::{ @@ -22,14 +21,21 @@ use tracing::trace; use super::common::traits::signable::Signable; use crate::tasks::utils::generate_hash; +use crate::tss::common::curve_state::CurveState; use crate::utils::traits::SignatureCurve; -use elliptic_curve::generic_array::ArrayLength; -use elliptic_curve::group::{Curve, GroupEncoding}; -use hd_keys_curves::{HDDerivable, HDDeriver}; -use k256::ecdsa::hazmat::DigestPrimitive; -use lit_node_core::PeerId; -use lit_node_core::SigningScheme; -use lit_node_core::{CompressedBytes, CompressedHex}; +use lit_node_core::{ + CompressedBytes, CompressedHex, PeerId, SigningScheme, + hd_keys_curves_wasm::{HDDerivable, HDDeriver}, +}; +use lit_rust_crypto::{ + elliptic_curve::{ + CurveArithmetic, FieldBytesSize, NonZeroScalar, PrimeCurve, ScalarPrimitive, + generic_array::ArrayLength, + }, + group::{Curve, GroupEncoding}, + k256::{self, ecdsa::hazmat::DigestPrimitive}, + p256, p384, +}; use serde::Serialize; use std::sync::Arc; use tracing::instrument; @@ -217,7 +223,7 @@ impl DamFastState { pub async fn sign_with_pubkey_internal( &mut self, message_bytes: &[u8], - root_pubkeys: Option>, + root_pubkeys: &[String], tweak_preimage: Option>, request_id: Vec, epoch: Option, @@ -304,7 +310,7 @@ impl DamFastState { pub async fn generate_signature_share_from_key_id( &mut self, message_bytes: &[u8], - root_pubkeys: Option>, + root_pubkeys: &[String], presig: &PreSignature, request_id: &[u8], peers: &SimplePeerCollection, @@ -340,11 +346,10 @@ impl DamFastState { debug!("Participants: {:?}", participants); let participant_list = ParticipantList::new(participants.as_slice()) .map_err(|e| unexpected_err(e, Some("Error creating participant list".to_owned())))?; - let root_pubkeys = root_pubkeys.expect_or_err("No root pubkeys provided!")?; let (sk, pk) = get_derived_keyshare::( deriver, - &root_pubkeys, + root_pubkeys, self.signing_scheme.curve_type(), staker_address, &self_peer.peer_id, @@ -366,13 +371,12 @@ impl DamFastState { )); } - let scalar_primitive = elliptic_curve::ScalarPrimitive::::from_slice(message_bytes) - .map_err(|e| { - unexpected_err( - e, - Some("Could not convert message to sign into ScalarPrimitive".into()), - ) - })?; + let scalar_primitive = ScalarPrimitive::::from_slice(message_bytes).map_err(|e| { + unexpected_err( + e, + Some("Could not convert message to sign into ScalarPrimitive".into()), + ) + })?; let msg_digest = C::Scalar::from(scalar_primitive); let peer_id = Option::>::from(NonZeroScalar::::new(C::Scalar::from( @@ -405,19 +409,25 @@ impl Signable for DamFastState { &mut self, message_bytes: &[u8], public_key: Vec, - root_pubkeys: Option>, tweak_preimage: Option>, request_id: Vec, + key_set_id: Option<&str>, epoch: Option, nodeset: &[NodeSet], ) -> Result { let txn_id = generate_hash(request_id.clone()); + let curve_state = CurveState::new( + self.state.peer_state.clone(), + self.signing_scheme.curve_type(), + key_set_id.map(String::from), + ); + let root_pubkeys = curve_state.root_keys()?; let df_sig_share = match self.signing_scheme { SigningScheme::EcdsaK256Sha256 => { self.sign_with_pubkey_internal::( message_bytes, - root_pubkeys, + &root_pubkeys, tweak_preimage, request_id, epoch, @@ -428,7 +438,7 @@ impl Signable for DamFastState { SigningScheme::EcdsaP256Sha256 => { self.sign_with_pubkey_internal::( message_bytes, - root_pubkeys, + &root_pubkeys, tweak_preimage, request_id, epoch, @@ -439,7 +449,7 @@ impl Signable for DamFastState { SigningScheme::EcdsaP384Sha384 => { self.sign_with_pubkey_internal::( message_bytes, - root_pubkeys, + &root_pubkeys, tweak_preimage, request_id, epoch, diff --git a/rust/lit-node/lit-node/src/tss/frost/mod.rs b/rust/lit-node/lit-node/src/tss/frost/mod.rs index 03d3039f..8f7d0a34 100644 --- a/rust/lit-node/lit-node/src/tss/frost/mod.rs +++ b/rust/lit-node/lit-node/src/tss/frost/mod.rs @@ -1,8 +1,8 @@ use crate::error::{EC, parser_err, unexpected_err, unexpected_err_code}; use crate::p2p_comms::CommsManager; use crate::peers::peer_state::models::SimplePeer; +use crate::tss::common::curve_state::CurveState; use crate::tss::common::hd_keys::get_derived_keyshare; -use crate::tss::common::signing_scheme::signing_scheme_to_frost_scheme; use crate::tss::common::traits::signable::Signable; use crate::{ error::Result, @@ -10,19 +10,22 @@ use crate::{ peers::peer_state::models::SimplePeerCollection, tss::common::{dkg_type::DkgType, tss_state::TssState}, }; -use blsful::inner_types::GroupEncoding; -use hd_keys_curves::{HDDerivable, HDDeriver}; use lit_core::error::Unexpected; use lit_core::utils::binary::bytes_to_hex; use lit_frost::{ Identifier, KeyPackage, Scheme, SignatureShare, SigningCommitments, SigningShare, VerifyingKey, VerifyingShare, }; -use lit_node_core::CompressedBytes; -use lit_node_core::CurveType; -use lit_node_core::NodeSet; -use lit_node_core::PeerId; -use lit_node_core::{FrostSignedMessageShare, SignableOutput, SigningAlgorithm, SigningScheme}; +use lit_node_core::{ + CompressedBytes, CurveType, FrostSignedMessageShare, NodeSet, PeerId, SignableOutput, + SigningAlgorithm, SigningScheme, + hd_keys_curves_wasm::{HDDerivable, HDDeriver}, +}; +use lit_rust_crypto::{ + curve25519_dalek, decaf377, ed448_goldilocks, group::GroupEncoding, jubjub, k256, p256, p384, + pallas, vsss_rs, +}; +use lit_sdk::signature::signing_scheme_to_frost_scheme; use std::{num::NonZeroU16, sync::Arc}; use verifiable_share_encryption::legacy_vsss_rs::ShareIdentifier; @@ -85,7 +88,8 @@ impl FrostState { // setup signing protocol let mut rng = rand::rngs::OsRng; let self_peer = peers.peer_at_address(&self.state.addr)?; - let scheme: Scheme = signing_scheme_to_frost_scheme(signature_scheme)?; + let scheme: Scheme = signing_scheme_to_frost_scheme(signature_scheme) + .map_err(|e| unexpected_err(e, None))?; let identifier = self.peer_id_to_frost_identifier(self_peer.peer_id)?; let verifying_share = scheme.verifying_share(secret_share).map_err(|e| { @@ -148,7 +152,7 @@ impl FrostState { async fn derive_frost_signing_components( &self, deriver: G::Scalar, - root_pubkeys: Option>, + root_pubkeys: &[String], self_peer: &SimplePeer, epoch: u64, ) -> Result<(VerifyingKey, SigningShare)> @@ -156,13 +160,12 @@ impl FrostState { G: HDDerivable + GroupEncoding + Default + CompressedBytes, G::Scalar: HDDeriver + CompressedBytes, { - let root_pubkeys = root_pubkeys.expect_or_err("No root pubkeys provided!")?; let staker_address = &bytes_to_hex(self_peer.staker_address.as_bytes()); let realm_id = self.state.peer_state.realm_id(); let (sk, pk) = get_derived_keyshare::( deriver, - &root_pubkeys, + root_pubkeys, self.signing_scheme.curve_type(), staker_address, &self_peer.peer_id, @@ -172,7 +175,8 @@ impl FrostState { ) .await?; - let scheme = signing_scheme_to_frost_scheme(self.signing_scheme)?; + let scheme = signing_scheme_to_frost_scheme(self.signing_scheme) + .map_err(|e| unexpected_err(e, None))?; let vk = VerifyingKey { scheme, value: pk.to_compressed(), @@ -197,6 +201,7 @@ impl FrostState { .to_vec(), CurveType::RedJubjub => jubjub::Scalar::from(peer_id).to_bytes().to_vec(), CurveType::RedDecaf377 => decaf377::Fr::from(peer_id).to_bytes().to_vec(), + CurveType::RedPallas => pallas::Scalar::from(peer_id).to_le_bytes().to_vec(), _ => { // Shouldn't happen but just in case return Err(unexpected_err( @@ -205,7 +210,8 @@ impl FrostState { )); } }; - let scheme = signing_scheme_to_frost_scheme(self.signing_scheme)?; + let scheme = signing_scheme_to_frost_scheme(self.signing_scheme) + .map_err(|e| unexpected_err(e, None))?; Ok(Identifier { scheme, id: bytes }) } } @@ -216,9 +222,9 @@ impl Signable for FrostState { &mut self, message_bytes: &[u8], public_key: Vec, - root_pubkeys: Option>, tweak_preimage: Option>, request_id: Vec, + key_set_id: Option<&str>, epoch: Option, nodeset: &[NodeSet], ) -> Result { @@ -229,13 +235,19 @@ impl Signable for FrostState { let threshold = nodeset.len(); let key_id = tweak_preimage.expect_or_err("No hd_key_id provided!")?; let realm_id = self.state.peer_state.realm_id(); - let epoch = epoch.unwrap_or(self.state.peer_state.epoch()); + let epoch = epoch.unwrap_or_else(|| self.state.peer_state.epoch()); + let curve_state = CurveState::new( + self.state.peer_state.clone(), + self.signing_scheme.curve_type(), + key_set_id.map(String::from), + ); + let root_pubkeys = curve_state.root_keys()?; let (vk, signing_share) = match self.signing_scheme { SigningScheme::SchnorrK256Sha256 | SigningScheme::SchnorrK256Taproot => { let deriver = k256::Scalar::create(&key_id, self.signing_scheme.id_sign_ctx()); self.derive_frost_signing_components::( deriver, - root_pubkeys, + &root_pubkeys, &self_peer, epoch, ) @@ -245,7 +257,7 @@ impl Signable for FrostState { let deriver = p256::Scalar::create(&key_id, self.signing_scheme.id_sign_ctx()); self.derive_frost_signing_components::( deriver, - root_pubkeys, + &root_pubkeys, &self_peer, epoch, ) @@ -255,7 +267,7 @@ impl Signable for FrostState { let deriver = p384::Scalar::create(&key_id, self.signing_scheme.id_sign_ctx()); self.derive_frost_signing_components::( deriver, - root_pubkeys, + &root_pubkeys, &self_peer, epoch, ) @@ -268,7 +280,7 @@ impl Signable for FrostState { ); self.derive_frost_signing_components::( deriver, - root_pubkeys, + &root_pubkeys, &self_peer, epoch, ) @@ -281,7 +293,7 @@ impl Signable for FrostState { ); self.derive_frost_signing_components::( deriver, - root_pubkeys, + &root_pubkeys, &self_peer, epoch, ) @@ -292,7 +304,7 @@ impl Signable for FrostState { ed448_goldilocks::Scalar::create(&key_id, self.signing_scheme.id_sign_ctx()); self.derive_frost_signing_components::( deriver, - root_pubkeys, + &root_pubkeys, &self_peer, epoch, ) @@ -302,7 +314,7 @@ impl Signable for FrostState { let deriver = jubjub::Scalar::create(&key_id, self.signing_scheme.id_sign_ctx()); self.derive_frost_signing_components::( deriver, - root_pubkeys, + &root_pubkeys, &self_peer, epoch, ) @@ -312,7 +324,17 @@ impl Signable for FrostState { let deriver = decaf377::Fr::create(&key_id, self.signing_scheme.id_sign_ctx()); self.derive_frost_signing_components::( deriver, - root_pubkeys, + &root_pubkeys, + &self_peer, + epoch, + ) + .await? + } + SigningScheme::SchnorrRedPallasBlake2b512 => { + let deriver = pallas::Scalar::create(&key_id, self.signing_scheme.id_sign_ctx()); + self.derive_frost_signing_components::( + deriver, + &root_pubkeys, &self_peer, epoch, ) diff --git a/rust/lit-node/lit-node/src/utils/contract.rs b/rust/lit-node/lit-node/src/utils/contract.rs index 830c40b5..0919f984 100644 --- a/rust/lit-node/lit-node/src/utils/contract.rs +++ b/rust/lit-node/lit-node/src/utils/contract.rs @@ -4,7 +4,6 @@ use crate::error::{Result, unexpected_err}; use ethers::middleware::SignerMiddleware; use ethers::providers::{Http, Provider}; use ethers::signers::Wallet; -use k256::ecdsa::SigningKey; use lit_blockchain::contracts::backup_recovery::BackupRecovery; use lit_blockchain::contracts::ledger::Ledger; use lit_blockchain::contracts::pkp_permissions::PKPPermissions; @@ -14,6 +13,7 @@ use lit_blockchain::contracts::pubkey_router::PubkeyRouter; use lit_blockchain::resolver::contract::ContractResolver; use lit_blockchain::util::ether::middleware::EIP2771GasRelayerMiddleware; use lit_core::config::LitConfig; +use lit_rust_crypto::k256::ecdsa::SigningKey; use std::sync::Arc; pub async fn get_pkp_permissions_contract( diff --git a/rust/lit-node/lit-node/src/utils/eth.rs b/rust/lit-node/lit-node/src/utils/eth.rs index 0ff2c86f..09fe8add 100644 --- a/rust/lit-node/lit-node/src/utils/eth.rs +++ b/rust/lit-node/lit-node/src/utils/eth.rs @@ -3,7 +3,7 @@ use crate::error::{Result, conversion_err}; use ethers::prelude::H160; use ethers::types::Address; -use k256::ecdsa::{SigningKey, VerifyingKey}; +use lit_rust_crypto::k256::ecdsa::{SigningKey, VerifyingKey}; use sha3::{Keccak256, digest::Digest}; pub trait EthereumAddress { diff --git a/rust/lit-node/lit-node/src/utils/key_share_proof.rs b/rust/lit-node/lit-node/src/utils/key_share_proof.rs index fa6b13d9..ce351dd4 100644 --- a/rust/lit-node/lit-node/src/utils/key_share_proof.rs +++ b/rust/lit-node/lit-node/src/utils/key_share_proof.rs @@ -10,13 +10,24 @@ use crate::{ storage::read_key_share_commitments_from_disk, }, }; -use blsful::{Pairing, SecretKeyShare, Signature}; -use elliptic_curve::Group; use futures::future::join_all; -use hd_keys_curves::{HDDerivable, HDDeriver}; use lit_core::error::Result; use lit_core::utils::binary::bytes_to_hex; -use lit_node_core::{CompressedBytes, CurveType, PeerId}; +use lit_node_core::{ + CompressedBytes, CurveType, PeerId, + hd_keys_curves_wasm::{HDDerivable, HDDeriver}, +}; +use lit_rust_crypto::{ + blsful::{ + Bls12381G2Impl, Pairing, PublicKey, SecretKey, SecretKeyShare, Signature, SignatureSchemes, + SignatureShare, + inner_types::{G1Projective, Scalar}, + }, + ed448_goldilocks, + group::Group, + k256, p256, p384, pallas, + vsss_rs::{IdentifierPrimeField, Share}, +}; use lit_vrf::*; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -25,7 +36,6 @@ use std::{ fmt::{self, Debug, Display, Formatter}, }; use tracing::instrument; -use vsss_rs::{IdentifierPrimeField, Share}; const VRF_KEY_SHARE_VALIDATION_PREFIX: &str = "vrf-key-share-validation-"; /// Proofs for key share validation @@ -181,23 +191,19 @@ pub async fn compute_key_share_proof( ) .await?; - let identifier = <::PublicKey as Group>::Scalar::from( - bls_key_share.peer_id, - ); - let value = bls_key_share.secret::<::PublicKey>()?; + let identifier = + <::PublicKey as Group>::Scalar::from(bls_key_share.peer_id); + let value = bls_key_share.secret::<::PublicKey>()?; - let secret_key_share: SecretKeyShare = SecretKeyShare( - ::SecretKeyShare::with_identifier_and_value( + let secret_key_share: SecretKeyShare = SecretKeyShare( + ::SecretKeyShare::with_identifier_and_value( IdentifierPrimeField(identifier), IdentifierPrimeField(value), ), ); let sks = secret_key_share - .sign( - blsful::SignatureSchemes::ProofOfPossession, - noonce.as_bytes(), - ) + .sign(SignatureSchemes::ProofOfPossession, noonce.as_bytes()) .map_err(|e| unexpected_err(format!("Failed to sign message: {:?}", e), None))?; return postcard::to_stdvec(&sks) @@ -230,13 +236,20 @@ pub async fn compute_key_share_proof( CurveType::RedJubjub => { compute_key_share_proof_internal::( &args, - Some(lit_frost::red_jubjub_generator()), + Some(lit_rust_crypto::red_jubjub_signing_generator()), ) .await } CurveType::RedDecaf377 => { compute_key_share_proof_internal::(&args, None).await } + CurveType::RedPallas => { + compute_key_share_proof_internal::( + &args, + Some(lit_rust_crypto::red_pallas_signing_generator()), + ) + .await + } CurveType::BLS12381G1 => { if root_keys.is_empty() { return Err(unexpected_err( @@ -247,12 +260,10 @@ pub async fn compute_key_share_proof( let vrf_deriver_id = format!("{}{}", VRF_KEY_SHARE_VALIDATION_PREFIX, curve_type.as_str()); - let deriver = ::create( - vrf_deriver_id.as_bytes(), - curve_type.vrf_ctx(), - ); + let deriver = + ::create(vrf_deriver_id.as_bytes(), curve_type.vrf_ctx()); let key_cache = KeyCache::default(); - let (sk, _) = get_derived_keyshare::( + let (sk, _) = get_derived_keyshare::( deriver, root_keys, curve_type, @@ -263,11 +274,8 @@ pub async fn compute_key_share_proof( &key_cache, ) .await?; - let signature: Signature = blsful::SecretKey(sk) - .sign( - blsful::SignatureSchemes::ProofOfPossession, - noonce.as_bytes(), - ) + let signature: Signature = SecretKey(sk) + .sign(SignatureSchemes::ProofOfPossession, noonce.as_bytes()) .map_err(|_| unexpected_err("cannot generate BLS proof".to_string(), None))?; postcard::to_stdvec(&signature) @@ -413,42 +421,37 @@ pub async fn verify_key_share_proofs( return Err(unexpected_err("No root keys found!".to_string(), None)); } let key_cache = KeyCache::default(); - let commitments = read_key_share_commitments_from_disk::< - KeyShareCommitments, - >( - curve_type, - &args.root_keys[0], - staker_address, - &self_peer.peer_id, - epoch, // this will possibly not be the same epoch as the node doing the request, and the results will be mismatched proofs. - realm_id, - &key_cache, - ) - .await?; - let sig_share = postcard::from_bytes::< - blsful::SignatureShare, - >(args.proof) - .map_err(|e| unexpected_err(e, Some("cannot deserialize BLS proof".to_string())))?; + let commitments = + read_key_share_commitments_from_disk::>( + curve_type, + &args.root_keys[0], + staker_address, + &self_peer.peer_id, + epoch, // this will possibly not be the same epoch as the node doing the request, and the results will be mismatched proofs. + realm_id, + &key_cache, + ) + .await?; + let sig_share = postcard::from_bytes::>(args.proof) + .map_err(|e| { + unexpected_err(e, Some("cannot deserialize BLS proof".to_string())) + })?; let signature_point = sig_share.as_raw_value().0.value.0; let signature = match sig_share { - blsful::SignatureShare::Basic(sig) => { - blsful::Signature::::Basic(signature_point) + SignatureShare::Basic(sig) => { + Signature::::Basic(signature_point) } - blsful::SignatureShare::MessageAugmentation(sig) => { - blsful::Signature::::MessageAugmentation( - signature_point, - ) + SignatureShare::MessageAugmentation(sig) => { + Signature::::MessageAugmentation(signature_point) } - blsful::SignatureShare::ProofOfPossession(sig) => { - blsful::Signature::::ProofOfPossession( - signature_point, - ) + SignatureShare::ProofOfPossession(sig) => { + Signature::::ProofOfPossession(signature_point) } }; - let key_share_commitment = commitments - .compute_key_share_commitment(&blsful::inner_types::Scalar::from(peer_id)); - let pub_key = blsful::PublicKey::(key_share_commitment); + let key_share_commitment = + commitments.compute_key_share_commitment(&Scalar::from(peer_id)); + let pub_key = PublicKey::(key_share_commitment); verification_checks.insert( curve_type, signature.verify(&pub_key, noonce.as_bytes()).map_err(|e| { @@ -498,7 +501,7 @@ pub async fn verify_key_share_proofs( curve_type, verify_key_share_proofs_internal::( &args, - Some(lit_frost::red_jubjub_generator()), + Some(lit_rust_crypto::red_jubjub_signing_generator()), ) .await, ); @@ -509,48 +512,52 @@ pub async fn verify_key_share_proofs( verify_key_share_proofs_internal::(&args, None).await, ); } + CurveType::RedPallas => { + verification_checks.insert( + curve_type, + verify_key_share_proofs_internal::( + &args, + Some(lit_rust_crypto::red_pallas_signing_generator()), + ) + .await, + ); + } CurveType::BLS12381G1 => { if args.root_keys.is_empty() { return Err(unexpected_err("No root keys found!".to_string(), None)); } - let peer_id_scalar = blsful::inner_types::Scalar::from(peer_id); + let peer_id_scalar = Scalar::from(peer_id); let mut key_share_commitments = Vec::with_capacity(root_keys.len()); let key_cache = KeyCache::default(); for (i, root_key) in args.root_keys.iter().enumerate() { - let commitments = read_key_share_commitments_from_disk::< - KeyShareCommitments, - >( - curve_type, - root_key, - staker_address, - &self_peer.peer_id, - epoch, // this will possibly not be the same epoch as the node doing the request, and the results will be mismatched proofs. - realm_id, - &key_cache, - ) - .await?; + let commitments = + read_key_share_commitments_from_disk::>( + curve_type, + root_key, + staker_address, + &self_peer.peer_id, + epoch, // this will possibly not be the same epoch as the node doing the request, and the results will be mismatched proofs. + realm_id, + &key_cache, + ) + .await?; let key_share_commitment = commitments.compute_key_share_commitment(&peer_id_scalar); key_share_commitments.push(key_share_commitment); } - let signature = postcard::from_bytes::>( - args.proof, - ) - .map_err(|e| unexpected_err(e, Some("cannot deserialize BLS proof".to_string())))?; + let signature = postcard::from_bytes::>(args.proof) + .map_err(|e| { + unexpected_err(e, Some("cannot deserialize BLS proof".to_string())) + })?; let vrf_deriver_id = format!("{}{}", VRF_KEY_SHARE_VALIDATION_PREFIX, curve_type.as_str()); - let deriver = ::create( - vrf_deriver_id.as_bytes(), - curve_type.vrf_ctx(), - ); + let deriver = + ::create(vrf_deriver_id.as_bytes(), curve_type.vrf_ctx()); let key_share_commitment = - ::hd_derive_public_key( - &deriver, - &key_share_commitments, - ); - let pub_key = blsful::PublicKey::(key_share_commitment); + ::hd_derive_public_key(&deriver, &key_share_commitments); + let pub_key = PublicKey::(key_share_commitment); verification_checks.insert( curve_type, signature.verify(&pub_key, noonce.as_bytes()).map_err(|e| { @@ -634,9 +641,11 @@ struct VerifyKeyShareProofArgs<'a> { #[cfg(test)] mod tests { use super::*; - use elliptic_curve::Field; + use lit_rust_crypto::{ + ff::Field, + vsss_rs::{DefaultShare, IdentifierPrimeField, shamir}, + }; use rand::{RngCore, SeedableRng}; - use vsss_rs::{DefaultShare, IdentifierPrimeField, shamir}; #[test] fn dkg_and_test_vrf() { diff --git a/rust/lit-node/lit-node/src/utils/traits.rs b/rust/lit-node/lit-node/src/utils/traits.rs index 7f18df08..ab971630 100644 --- a/rust/lit-node/lit-node/src/utils/traits.rs +++ b/rust/lit-node/lit-node/src/utils/traits.rs @@ -1,5 +1,8 @@ -use elliptic_curve::Group; use lit_node_core::CurveType; +use lit_rust_crypto::{ + blsful::inner_types, decaf377, ed448_goldilocks, group::Group, jubjub, k256, p256, p384, + pallas, vsss_rs, +}; pub trait SignatureCurve { const CURVE_TYPE: CurveType; @@ -67,7 +70,16 @@ impl SignatureCurve for bulletproofs::JubJub { type Point = jubjub::SubgroupPoint; fn signing_generator() -> Self::Point { - lit_frost::red_jubjub_generator() + lit_rust_crypto::red_jubjub_signing_generator() + } +} + +impl SignatureCurve for pallas::Pallas { + const CURVE_TYPE: CurveType = CurveType::RedPallas; + type Point = pallas::Point; + + fn signing_generator() -> Self::Point { + lit_rust_crypto::red_pallas_signing_generator() } } @@ -80,11 +92,11 @@ impl SignatureCurve for bulletproofs::Decaf377 { } } -impl SignatureCurve for blsful::inner_types::InnerBls12381G1 { +impl SignatureCurve for inner_types::InnerBls12381G1 { const CURVE_TYPE: CurveType = CurveType::BLS12381G1; - type Point = blsful::inner_types::G1Projective; + type Point = inner_types::G1Projective; fn signing_generator() -> Self::Point { - blsful::inner_types::G1Projective::GENERATOR + inner_types::G1Projective::GENERATOR } } diff --git a/rust/lit-node/lit-node/src/utils/web.rs b/rust/lit-node/lit-node/src/utils/web.rs index c59dcc08..22e13eaf 100644 --- a/rust/lit-node/lit-node/src/utils/web.rs +++ b/rust/lit-node/lit-node/src/utils/web.rs @@ -7,6 +7,7 @@ use crate::models; use crate::models::AuthContext; use crate::models::RequestConditions; use crate::models::auth::SessionKeySignedMessageV2; +use crate::tss::common::curve_state::CurveState; use crate::tss::common::tss_state::TssState; use crate::utils::encoding; use ethers::utils::keccak256; @@ -683,11 +684,11 @@ pub fn hash_access_control_conditions(req: RequestConditions) -> Result // hash differently if this is v1 or v2 conditions let mut is_v2 = false; for condition_item in sol_rpc_conditions { - if let SolRpcConditionItem::Condition(condition) = condition_item { - if condition.pda_params.is_some() { - is_v2 = true; - break; - } + if let SolRpcConditionItem::Condition(condition) = condition_item + && condition.pda_params.is_some() + { + is_v2 = true; + break; } } if is_v2 { @@ -800,10 +801,13 @@ pub fn pubkey_to_token_id(pubkey: &str) -> Result { Ok(token_id) } -pub async fn get_bls_root_pubkey(tss_state: &TssState) -> Result { - let curve_state = tss_state.get_dkg_state(CurveType::BLS)?; - let bls_root_pubkeys = curve_state.root_keys().await; - match bls_root_pubkeys.first() { +pub fn get_bls_root_pubkey(tss_state: &Arc, key_set_id: Option<&str>) -> Result { + let curve_state = CurveState::new( + tss_state.peer_state.clone(), + CurveType::BLS, + key_set_id.map(|k| k.to_string()), + ); + match curve_state.root_keys()?.first() { Some(bls_root_key) => Ok(bls_root_key.clone()), None => Err(unexpected_err_code( "No BLS root key found", diff --git a/rust/lit-node/lit-node/tests/acceptance/chain_interaction.rs b/rust/lit-node/lit-node/tests/acceptance/chain_interaction.rs index 1f92a6f5..67483c5e 100644 --- a/rust/lit-node/lit-node/tests/acceptance/chain_interaction.rs +++ b/rust/lit-node/lit-node/tests/acceptance/chain_interaction.rs @@ -34,6 +34,7 @@ use lit_node_core::{ CHAIN_LOCALCHAIN, }, }; +use lit_rust_crypto::blsful::PublicKey; use lit_node::models::RequestConditions; @@ -146,7 +147,7 @@ async fn test_encryption_decryption_eip1271( )) .get_resource_key() .into_bytes(); - let pubkey = blsful::PublicKey::try_from(&hex::decode(&network_pubkey).unwrap()).unwrap(); + let pubkey = PublicKey::try_from(&hex::decode(&network_pubkey).unwrap()).unwrap(); let ciphertext = lit_sdk::encryption::encrypt_time_lock(&pubkey, message_bytes, &identity_param) .expect("Unable to encrypt"); diff --git a/rust/lit-node/lit-node/tests/acceptance/payment.rs b/rust/lit-node/lit-node/tests/acceptance/payment.rs index baaf42a2..486abeec 100644 --- a/rust/lit-node/lit-node/tests/acceptance/payment.rs +++ b/rust/lit-node/lit-node/tests/acceptance/payment.rs @@ -48,7 +48,9 @@ async fn test_all_payment_methods_for_user() { let test_encryption_parameters = prepare_test_encryption_parameters(); let network_pubkey = get_network_pubkey(&actions).await; let message_bytes = test_encryption_parameters.to_encrypt.as_bytes(); - let pubkey = blsful::PublicKey::try_from(&hex::decode(&network_pubkey).unwrap()).unwrap(); + let pubkey = + lit_rust_crypto::blsful::PublicKey::try_from(&hex::decode(&network_pubkey).unwrap()) + .unwrap(); let ciphertext = lit_sdk::encryption::encrypt_time_lock( &pubkey, message_bytes, @@ -290,7 +292,7 @@ async fn test_all_payment_methods_for_user() { let auth_sig = generate_authsig_item(&self_pay_user.wallet).await.unwrap(); - let (network_pubkey, _token_id, eth_address) = self_pay_user.first_pkp().info(); + let (network_pubkey, _token_id, eth_address, _key_set_id) = self_pay_user.first_pkp().info(); let signing_key = ed25519_dalek::SigningKey::generate(&mut OsRng); let verifying_key = signing_key.verifying_key(); @@ -793,7 +795,7 @@ async fn test_all_payment_methods_for_pkp() { pkp_owner.new_pkp().await.expect("Failed to mint PKP"); // add the PKP itself as a permitted address, so that our session sig from the PKP will be able to sign with it - let (pubkey, _token_id, eth_address) = pkp_owner.first_pkp().info(); + let (pubkey, _token_id, eth_address, _key_set_id) = pkp_owner.first_pkp().info(); let pkp = pkp_owner.pkp_by_pubkey(pubkey.clone()); pkp.add_permitted_address_to_pkp(eth_address, &[U256::from(1)]) .await @@ -805,7 +807,9 @@ async fn test_all_payment_methods_for_pkp() { let network_pubkey = get_network_pubkey(&actions).await; let message_bytes = test_encryption_parameters.to_encrypt.as_bytes(); - let bls_pubkey = blsful::PublicKey::try_from(&hex::decode(&network_pubkey).unwrap()).unwrap(); + let bls_pubkey = + lit_rust_crypto::blsful::PublicKey::try_from(&hex::decode(&network_pubkey).unwrap()) + .unwrap(); let ciphertext = lit_sdk::encryption::encrypt_time_lock( &bls_pubkey, @@ -1212,7 +1216,9 @@ async fn test_pending_payments_block_usage() { let test_encryption_parameters = prepare_test_encryption_parameters(); let network_pubkey = get_network_pubkey(&actions).await; let message_bytes = test_encryption_parameters.to_encrypt.as_bytes(); - let pubkey = blsful::PublicKey::try_from(&hex::decode(&network_pubkey).unwrap()).unwrap(); + let pubkey = + lit_rust_crypto::blsful::PublicKey::try_from(&hex::decode(&network_pubkey).unwrap()) + .unwrap(); let ciphertext = lit_sdk::encryption::encrypt_time_lock( &pubkey, message_bytes, diff --git a/rust/lit-node/lit-node/tests/common/assertions.rs b/rust/lit-node/lit-node/tests/common/assertions.rs index b6063b5b..a3dfd68b 100644 --- a/rust/lit-node/lit-node/tests/common/assertions.rs +++ b/rust/lit-node/lit-node/tests/common/assertions.rs @@ -28,7 +28,7 @@ impl NetworkIntegrityChecker { let initial_bls_pubkey = get_network_pubkey(&actions).await; // Use the first PKP for the network integrity check. - let (pubkey, token_id, _) = end_user.first_pkp().info(); + let (pubkey, token_id, _, _) = end_user.first_pkp().info(); info!( "PKP for network integrity check: {:?} / token_id: {:?}", pubkey, token_id diff --git a/rust/lit-node/lit-node/tests/common/auth_sig.rs b/rust/lit-node/lit-node/tests/common/auth_sig.rs index 391650d2..142b786d 100644 --- a/rust/lit-node/lit-node/tests/common/auth_sig.rs +++ b/rust/lit-node/lit-node/tests/common/auth_sig.rs @@ -4,7 +4,6 @@ use std::ops::Add; use std::str::FromStr; use anyhow::Result; -use blsful::{Bls12381G2Impl, Signature, SignatureShare}; use chrono::{Duration, SecondsFormat}; use ed25519_dalek::Signer; use ethers::core::k256::ecdsa::SigningKey; @@ -16,12 +15,13 @@ use lit_core::config::LitConfig; use lit_node::models::auth::SessionKeySignedMessageV2; use lit_node::payment::payed_endpoint::PayedEndpoint; use lit_node::utils::encoding::{self, hex_to_bytes}; -use lit_node_core::CurveType; -use lit_node_core::response::JsonSignSessionKeyResponseV2; use lit_node_core::{ - AuthMethod, AuthSigItem, JsonAuthSig, LitResourceAbilityRequest, LitResourcePrefix, NodeSet, + AuthMethod, AuthSigItem, CurveType, JsonAuthSig, LitResourceAbilityRequest, LitResourcePrefix, + NodeSet, constants::{AUTH_SIG_DERIVED_VIA_SESSION_SIG, AUTH_SIG_SESSION_SIG_ALGO}, + response::JsonSignSessionKeyResponseV2, }; +use lit_rust_crypto::blsful::{Bls12381G2Impl, PublicKey, Signature, SignatureShare}; use serde_json::Value; use siwe::Message; use siwe_recap::Capability; @@ -38,6 +38,7 @@ use rand_core::RngCore; use super::session_sigs::SessionSigAndNodeSet; use lit_node_testnet::node_collection::NodeIdentityKey; +use lit_rust_crypto::k256; use lit_sdk::UrlPrefix; pub fn node_wallet(cfg: &LitConfig) -> Result> { @@ -387,7 +388,7 @@ pub async fn get_session_delegation_sig_for_pkp( let signature = Signature::from_shares(&shares)?; - let bls_root_key = blsful::PublicKey::::try_from( + let bls_root_key = PublicKey::::try_from( &hex::decode(&one_response_with_share.bls_root_pubkey).expect("Failed to decode root key"), ) .expect("Failed to convert bls public key from bytes"); diff --git a/rust/lit-node/lit-node/tests/common/interpolation.rs b/rust/lit-node/lit-node/tests/common/interpolation.rs index 57212143..65679176 100644 --- a/rust/lit-node/lit-node/tests/common/interpolation.rs +++ b/rust/lit-node/lit-node/tests/common/interpolation.rs @@ -1,5 +1,3 @@ -use elliptic_curve::group::GroupEncoding; -use elliptic_curve::{Group, PrimeField}; use lit_core::utils::binary::bytes_to_hex; use lit_node::common::key_helper::KeyCache; use lit_node::error::Result; @@ -7,12 +5,17 @@ use lit_node::peers::peer_state::models::{SimplePeer, SimplePeerCollection}; use lit_node::tss::common::key_persistence::KeyPersistence; use lit_node::tss::common::key_share::KeyShare; use lit_node::tss::common::storage::{read_key_share_from_disk, write_key_share_to_disk}; -use lit_node_core::CompressedBytes; -use lit_node_core::CurveType; -use lit_node_core::PeerId; -use vsss_rs::{ - DefaultShare, IdentifierPrimeField, ReadableShareSet, ValuePrimeField, - curve25519::{WrappedEdwards, WrappedRistretto, WrappedScalar}, +use lit_node_core::{CompressedBytes, CurveType, PeerId}; +use lit_rust_crypto::{ + blsful::inner_types::{G1Projective, Scalar}, + decaf377, ed448_goldilocks, + ff::PrimeField, + group::{Group, GroupEncoding}, + jubjub, k256, p256, p384, pallas, vsss_rs, + vsss_rs::{ + DefaultShare, IdentifierPrimeField, ReadableShareSet, ValuePrimeField, + curve25519::{WrappedEdwards, WrappedRistretto, WrappedScalar}, + }, }; pub async fn get_secret_and_shares( @@ -36,7 +39,7 @@ where #[derive(Copy, Clone, Debug)] pub enum CurveScalar { - Bls(blsful::inner_types::Scalar), + Bls(Scalar), K256(k256::Scalar), P256(p256::Scalar), P384(p384::Scalar), @@ -44,6 +47,7 @@ pub enum CurveScalar { Ristretto25519(WrappedScalar), Ed448(ed448_goldilocks::Scalar), Jubjub(jubjub::Scalar), + Pallas(pallas::Scalar), Decaf377(decaf377::Fr), Schnorrkel(WrappedScalar), } @@ -58,18 +62,21 @@ impl PartialEq for CurveScalar { (Self::P256(a), Self::P256(b)) => a == b, (Self::P384(a), Self::P384(b)) => a == b, (Self::Ed25519(a), Self::Ed25519(b)) => a == b, + (Self::Ed25519(a), Self::Ristretto25519(b)) => a == b, (Self::Ristretto25519(a), Self::Ristretto25519(b)) => a == b, + (Self::Ristretto25519(a), Self::Ed25519(b)) => a == b, (Self::Ed448(a), Self::Ed448(b)) => a == b, (Self::Jubjub(a), Self::Jubjub(b)) => a == b, (Self::Decaf377(a), Self::Decaf377(b)) => a == b, (Self::Schnorrkel(a), Self::Schnorrkel(b)) => a == b, + (Self::Pallas(a), Self::Pallas(b)) => a == b, _ => false, } } } -impl From for CurveScalar { - fn from(scalar: blsful::inner_types::Scalar) -> Self { +impl From for CurveScalar { + fn from(scalar: Scalar) -> Self { Self::Bls(scalar) } } @@ -110,6 +117,12 @@ impl From for CurveScalar { } } +impl From for CurveScalar { + fn from(scalar: decaf377::Fr) -> Self { + Self::Decaf377(scalar) + } +} + impl CurveScalar { pub(crate) fn to_bytes(self) -> Vec { let repr: Box> = match self { @@ -122,6 +135,7 @@ impl CurveScalar { Self::Ed448(scalar) => Box::new(scalar.to_repr()), Self::Jubjub(scalar) => Box::new(scalar.to_repr()), Self::Decaf377(scalar) => Box::new(scalar.to_repr()), + Self::Pallas(scalar) => Box::new(scalar.to_repr()), Self::Schnorrkel(scalar) => Box::new(scalar.to_repr()), }; (*repr).as_ref().to_vec() @@ -139,7 +153,7 @@ pub async fn remap_secret_to_new_peer_ids( let realm_id = 1; match curve_type { CurveType::BLS => { - remap_secret_helper::( + remap_secret_helper::( curve_type, old_peers, new_peers, @@ -247,7 +261,19 @@ pub async fn remap_secret_to_new_peer_ids( .await } CurveType::BLS12381G1 => { - remap_secret_helper::( + remap_secret_helper::( + curve_type, + old_peers, + new_peers, + pubkey, + read_epoch, + write_epoch, + realm_id, + ) + .await + } + CurveType::RedPallas => { + remap_secret_helper::( curve_type, old_peers, new_peers, @@ -336,10 +362,8 @@ pub async fn interpolate_secret( ) -> CurveScalar { match curve_type { CurveType::BLS => CurveScalar::Bls( - interpolate_secret_for_key::( - peers, pubkey, epoch, curve_type, realm_id, - ) - .await, + interpolate_secret_for_key::(peers, pubkey, epoch, curve_type, realm_id) + .await, ), CurveType::K256 => CurveScalar::K256( interpolate_secret_for_key::( @@ -390,10 +414,12 @@ pub async fn interpolate_secret( .await, ), CurveType::BLS12381G1 => CurveScalar::Bls( - interpolate_secret_for_key::( - peers, pubkey, epoch, curve_type, realm_id, - ) - .await, + interpolate_secret_for_key::(peers, pubkey, epoch, curve_type, realm_id) + .await, + ), + CurveType::RedPallas => CurveScalar::Pallas( + interpolate_secret_for_key::(peers, pubkey, epoch, curve_type, realm_id) + .await, ), } } @@ -422,6 +448,7 @@ pub fn splice_secret( CurveScalar::Schnorrkel(s) => { split_secret_with_peers(s, peers, threshold, CurveScalar::Schnorrkel) } + CurveScalar::Pallas(s) => split_secret_with_peers(s, peers, threshold, CurveScalar::Pallas), } } diff --git a/rust/lit-node/lit-node/tests/common/lit_actions.rs b/rust/lit-node/lit-node/tests/common/lit_actions.rs index e5f2db4e..aed49029 100644 --- a/rust/lit-node/lit-node/tests/common/lit_actions.rs +++ b/rust/lit-node/lit-node/tests/common/lit_actions.rs @@ -19,6 +19,7 @@ use lit_node_core::{ request::JsonExecutionRequest, response::{GenericResponse, JsonExecutionResponse}, }; +use lit_rust_crypto::{k256, p256, p384}; use rand::Rng; use rand_core::OsRng; use std::collections::HashMap; @@ -118,7 +119,7 @@ pub async fn sign_using_child_lit_action( let lit_action_code = CALL_CHILD_LIT_ACTION_CODE.to_string(); - let (pubkey, _token_id, _eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, _eth_address, _key_set_id) = end_user.first_pkp().info(); let (lit_action_code, ipfs_id, js_params, auth_methods) = lit_action_params(lit_action_code, pubkey).await?; @@ -282,7 +283,7 @@ pub async fn prepare_sign_from_file_parameters( info!("Attempting to run lit action from file: {}", file_name); let lit_action_code = std::fs::read_to_string(file_name)?; - let (pubkey, _token_id, _eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, _eth_address, _key_set_id) = end_user.first_pkp().info(); Ok(lit_action_params(lit_action_code, pubkey).await?) } @@ -422,7 +423,7 @@ pub async fn generate_pkp_check_get_permitted_pkp_action( let cfg = lit_node_common::config::load_cfg().expect("failed to load LitConfig"); let loaded_config = &cfg.load_full(); - let (pkp_pubkey, token_id, _) = end_user.first_pkp().info(); + let (pkp_pubkey, token_id, _, _) = end_user.first_pkp().info(); let pkp = end_user.pkp_by_pubkey(pkp_pubkey.clone()); let res = pkp @@ -457,7 +458,7 @@ pub async fn generate_pkp_check_is_permitted_pkp_action( let cfg = lit_node_common::config::load_cfg().expect("failed to load LitConfig"); let loaded_config = &cfg.load_full(); - let (pkp_pubkey, token_id, _) = end_user.first_pkp().info(); + let (pkp_pubkey, token_id, _, _) = end_user.first_pkp().info(); let pkp = end_user.pkp_by_pubkey(pkp_pubkey); let res = pkp diff --git a/rust/lit-node/lit-node/tests/common/mod.rs b/rust/lit-node/lit-node/tests/common/mod.rs index cea53d82..3741808d 100644 --- a/rust/lit-node/lit-node/tests/common/mod.rs +++ b/rust/lit-node/lit-node/tests/common/mod.rs @@ -25,6 +25,7 @@ use lit_core::config::ENV_LIT_CONFIG_FILE; use lit_node::tss::util::DEFAULT_KEY_SET_NAME; use lit_node_common::config::load_cfg; use lit_node_core::CurveType; +use lit_node_core::ethers::prelude::Bytes; use lit_observability::logging::simple_logging_subscriber; use once_cell::sync::Lazy; use std::sync::Mutex; @@ -84,6 +85,6 @@ pub fn default_keyset_config() -> KeySetConfig { counts: std::iter::once(U256::from(1)) .chain(CurveType::into_iter().skip(1).map(|_| U256::from(2))) .collect(), - recovery_party_members: Vec::new(), + recovery_session_id: Bytes::new(), } } diff --git a/rust/lit-node/lit-node/tests/common/pkp.rs b/rust/lit-node/lit-node/tests/common/pkp.rs index 5de0e7f2..ffef933e 100644 --- a/rust/lit-node/lit-node/tests/common/pkp.rs +++ b/rust/lit-node/lit-node/tests/common/pkp.rs @@ -7,26 +7,19 @@ use ethers::signers::Wallet; use lit_core::utils::binary::hex_to_bytes; use lit_node_core::{ AuthSigItem, LitAbility, LitResourceAbilityRequest, LitResourceAbilityRequestResource, - LitResourcePrefix, NodeSet, SignableOutput, SigningScheme, + LitResourcePrefix, NodeSet, SigningScheme, request::JsonPKPSigningRequest, response::{GenericResponse, JsonPKPSigningResponse}, }; use lit_node_testnet::end_user::EndUser; use lit_node_testnet::node_collection::NodeIdentityKey; +use lit_rust_crypto::k256; use lit_sdk::signature::combine_and_verify_signature_shares; use rand::Rng; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use tracing::{debug, info}; -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -struct SignWithPKPReturn { - success: bool, - signed_data: Vec, - signature_share: SignableOutput, -} - // copied from lit_ecdsa_wasm_combine #[derive(Clone, Serialize, Deserialize, Debug)] pub struct SignedDatak256 { @@ -194,7 +187,7 @@ pub async fn sign_with_pkp_request( signing_scheme, ) .await; - debug!("endpoint_responses: {:?}", endpoint_responses); + info!("endpoint_responses: {:?}", endpoint_responses); assert!(endpoint_responses.len() >= expected_responses); diff --git a/rust/lit-node/lit-node/tests/common/recovery_party.rs b/rust/lit-node/lit-node/tests/common/recovery_party.rs index 96644e53..d4a8f8ab 100644 --- a/rust/lit-node/lit-node/tests/common/recovery_party.rs +++ b/rust/lit-node/lit-node/tests/common/recovery_party.rs @@ -1,7 +1,5 @@ -use blsful::inner_types::{G1Projective, InnerBls12381G1}; use bulletproofs::BulletproofCurveArithmetic as BCA; use ethers::types::{Address, H160}; -use k256::ecdsa::{RecoveryId, Signature, SigningKey, VerifyingKey}; use sha3::{Keccak256, digest::Digest}; use std::time::{SystemTime, UNIX_EPOCH}; @@ -13,9 +11,16 @@ use lit_blockchain::contracts::{ backup_recovery::BackupRecovery, staking::{AddressMapping, Staking, Validator}, }; -use lit_node_core::CompressedBytes; -use lit_node_core::JsonAuthSig; +use lit_node_core::{CompressedBytes, JsonAuthSig}; use lit_recovery::models::DownloadedShareData; +use lit_rust_crypto::{ + blsful::inner_types::{G1Projective, InnerBls12381G1}, + elliptic_curve::ScalarPrimitive, + k256::{ + self, + ecdsa::{RecoveryId, Signature, SigningKey, VerifyingKey}, + }, +}; use reqwest::Url; use std::sync::Arc; use tracing::info; @@ -284,9 +289,8 @@ pub fn check_share_data(mut share_data: Vec) { k256::ProjectivePoint::from_compressed(&hex::decode(&ecdsa_share.encryption_key).unwrap()) .unwrap(); // Parse ECDSA private key - let scalar_primitive = elliptic_curve::scalar::ScalarPrimitive::from_slice( - &hex::decode(&ecdsa_share.decryption_key_share).unwrap(), - ) - .unwrap(); + let scalar_primitive = + ScalarPrimitive::from_slice(&hex::decode(&ecdsa_share.decryption_key_share).unwrap()) + .unwrap(); let _ = k256::Scalar::from(&scalar_primitive); } diff --git a/rust/lit-node/lit-node/tests/common/web_user_tests.rs b/rust/lit-node/lit-node/tests/common/web_user_tests.rs index a2b87f45..e78003ad 100644 --- a/rust/lit-node/lit-node/tests/common/web_user_tests.rs +++ b/rust/lit-node/lit-node/tests/common/web_user_tests.rs @@ -10,7 +10,6 @@ use std::collections::HashMap; use crate::common::auth_sig::generate_authsig; use anyhow::Result; -use blsful::Bls12381G2Impl; use ethers::signers::LocalWallet; use ethers::types::U256; use rand::Rng; @@ -23,16 +22,16 @@ use lit_node_core::{ EVMContractConditionItem, JsonAccessControlCondition, JsonAuthSig, JsonReturnValueTest, LitAbility, LitResource, LitResourceAbilityRequest, LitResourceAbilityRequestResource, NodeSet, SolRpcConditionItem, UnifiedAccessControlCondition, UnifiedAccessControlConditionItem, - constants::CHAIN_LOCALCHAIN, request::EncryptionSignRequest, response::EncryptionSignResponse, + constants::CHAIN_LOCALCHAIN, + request::EncryptionSignRequest, + response::{EncryptionSignResponse, GenericResponse, JsonExecutionResponse}, }; +use lit_rust_crypto::blsful::{Bls12381G2Impl, PublicKey, TimeCryptCiphertext}; use lit_node::models::RequestConditions; -use lit_node_core::response::JsonExecutionResponse; - use lit_node::utils::web::hash_access_control_conditions; use super::session_sigs::SessionSigAndNodeSet; -use lit_node_core::response::GenericResponse; use tracing::{debug, info}; #[derive(Debug, Clone)] @@ -174,9 +173,7 @@ pub async fn test_encryption_decryption_auth_sig( let message_bytes = test_encryption_parameters.to_encrypt.as_bytes(); let network_pubkey = get_network_pubkey_from_node_set(node_set.iter().map(|(n, _)| n)).await; - let pubkey = - lit_sdk::lit_node_core::blsful::PublicKey::try_from(hex::decode(network_pubkey).unwrap()) - .unwrap(); + let pubkey = PublicKey::try_from(hex::decode(network_pubkey).unwrap()).unwrap(); let ciphertext = lit_sdk::encryption::encrypt_time_lock( &pubkey, @@ -269,7 +266,7 @@ pub async fn test_encryption_decryption_session_sigs( .get_resource_key() .into_bytes(); - let pubkey = blsful::PublicKey::try_from(hex::decode(&network_pubkey).unwrap()).unwrap(); + let pubkey = PublicKey::try_from(hex::decode(&network_pubkey).unwrap()).unwrap(); let ciphertext = lit_sdk::encryption::encrypt_time_lock(&pubkey, message_bytes, &identity_param) .expect("Unable to encrypt"); @@ -398,10 +395,10 @@ pub async fn retrieve_decryption_key_session_sigs_with_version( } pub fn assert_decrypted( - network_pubkey: &blsful::PublicKey, + network_pubkey: &PublicKey, identity_param: Vec, expected_plaintext: &str, - ciphertext: &blsful::TimeCryptCiphertext, + ciphertext: &TimeCryptCiphertext, decryption_resp: Vec>, ) { // assert_eq!(decryption_resp.len(), num_staked as usize); @@ -454,7 +451,7 @@ pub async fn generate_session_sigs_execute_lit_action( end_user: &EndUser, ) -> Result>> { - let (pubkey, _token_id, pkp_eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, pkp_eth_address, _key_set_id) = end_user.first_pkp().info(); let wallet = end_user.wallet.clone(); // add the PKP itself as a permitted address, so that our session sig from the PKP will be able to sign with it end_user diff --git a/rust/lit-node/lit-node/tests/component/dkg.rs b/rust/lit-node/lit-node/tests/component/dkg.rs index ab3d450c..f6ddda45 100644 --- a/rust/lit-node/lit-node/tests/component/dkg.rs +++ b/rust/lit-node/lit-node/tests/component/dkg.rs @@ -1,14 +1,13 @@ use super::utils::virtual_node_collection::{VirtualNode, VirtualNodeCollection}; -use crate::common::interpolation::{get_secret_and_shares, interpolate_secret}; -use ed448_goldilocks::EdwardsPoint; -use elliptic_curve::{Group, group::GroupEncoding}; +use crate::common::interpolation::{CurveScalar, get_secret_and_shares, interpolate_secret}; use ethers::types::{H160, U256}; use futures::future::join_all; use lit_blockchain::contracts::backup_recovery::RecoveredPeerId; use lit_core::utils::binary::bytes_to_hex; use lit_node::common::key_helper::KeyCache; -use lit_node::config::chain::CachedRootKey; +use lit_node::models::KeySetConfig; use lit_node::peers::peer_state::models::SimplePeerCollection; +use lit_node::tasks::fsm::epoch_change::ShadowOptions; use lit_node::tss::common::dkg_type::DkgType; use lit_node::tss::common::key_share::KeyShare; use lit_node::tss::common::storage::{ @@ -16,16 +15,26 @@ use lit_node::tss::common::storage::{ write_key_share_to_cache_only, }; use lit_node::tss::dkg::engine::{DkgAfterRestore, DkgAfterRestoreData, DkgEngine}; +use lit_node::tss::util::DEFAULT_KEY_SET_NAME; use lit_node::utils::key_share_proof::{compute_key_share_proofs, verify_key_share_proofs}; use lit_node::version::DataVersionWriter; -use lit_node_core::CompressedBytes; -use lit_node_core::CurveType; -use lit_node_core::PeerId; -use std::collections::HashMap; +use lit_node_core::{CompressedBytes, CompressedHex, CurveType, LeBytes, PeerId}; +use lit_rust_crypto::{ + blsful, decaf377, + ed448_goldilocks::{self, EdwardsPoint}, + elliptic_curve, + elliptic_curve::{Group, group::GroupEncoding}, + jubjub, k256, p256, p384, pallas, + vsss_rs::{ + self, IdentifierPrimeField, + curve25519::{WrappedEdwards, WrappedRistretto}, + }, +}; + +use std::collections::{HashMap, HashSet}; use test_case::test_case; use tokio::task::JoinHandle; use tracing::{error, info}; -use vsss_rs::curve25519::{WrappedEdwards, WrappedRistretto}; // The following tests show how components can be tested in isolation. #[test_case(CurveType::K256; "K256 Key generation")] @@ -36,6 +45,7 @@ use vsss_rs::curve25519::{WrappedEdwards, WrappedRistretto}; #[test_case(CurveType::P256; "P256 Key generation")] #[test_case(CurveType::P384; "P384 Key generation")] #[test_case(CurveType::RedJubjub; "RedJubjub Key generation")] +#[test_case(CurveType::RedPallas; "RedPallas Key generation")] #[test_case(CurveType::RedDecaf377; "RedDecaf377 Key generation")] #[test_case(CurveType::BLS12381G1; "Bls12381G1 Key Generation")] #[tokio::test] @@ -52,6 +62,7 @@ pub async fn dkg_only(curve_type: CurveType) { #[test_case(CurveType::P256; "P256 Key Share Proofs")] #[test_case(CurveType::P384; "P384 Key Share Proofs")] #[test_case(CurveType::RedJubjub; "RedJubjub Key Share Proofs")] +#[test_case(CurveType::RedPallas; "RedPallas Key Share Proofs")] #[test_case(CurveType::RedDecaf377; "RedDecaf377 Key Share Proofs")] #[test_case(CurveType::BLS12381G1; "Bls12381G1 Key Share Proofs")] #[tokio::test] @@ -70,14 +81,32 @@ pub async fn dkg_and_key_share_proofs(curve_type: CurveType) { ); peers_in_current_epoch.epoch_number = epoch; peers_in_current_epoch.commit(); - let mut root_keys = DataVersionWriter::new_unchecked( - &node.tss_state.chain_data_config_manager.root_keys, + let mut key_sets = DataVersionWriter::new_unchecked( + &node.tss_state.chain_data_config_manager.key_sets, ); - root_keys.push(CachedRootKey { - curve_type, - public_key: pubkey.clone(), - }); - root_keys.commit(); + let mut realms = HashSet::with_capacity(1); + realms.insert(1); + let mut root_keys_by_curve = HashMap::with_capacity(1); + root_keys_by_curve.insert(curve_type, vec![pubkey.clone()]); + let mut root_key_counts = HashMap::with_capacity(1); + root_key_counts.insert(curve_type, 1); + + key_sets.insert( + DEFAULT_KEY_SET_NAME.to_string(), + KeySetConfig { + identifier: DEFAULT_KEY_SET_NAME.to_string(), + description: "".to_string(), + minimum_threshold: 3, + monetary_value: 0, + complete_isolation: false, + realms, + root_keys_by_curve, + root_key_counts, + recovery_session_id: "".to_string(), + }, + ); + + key_sets.commit(); root_keys_map .entry(curve_type) .and_modify(|v| v.push(pubkey.clone())) @@ -136,6 +165,7 @@ pub async fn dkg_and_key_share_proofs(curve_type: CurveType) { #[test_case(p256::ProjectivePoint::default(), CurveType::P256; "P256 Refresh")] #[test_case(p384::ProjectivePoint::default(), CurveType::P384; "P384 Refresh")] #[test_case(jubjub::SubgroupPoint::default(), CurveType::RedJubjub; "RedJubjub Refresh")] +#[test_case(pallas::Point::default(), CurveType::RedPallas; "RedPallas Refresh")] #[test_case(decaf377::Element::default(), CurveType::RedDecaf377; "RedDecaf377 Refresh")] #[test_case(blsful::inner_types::G1Projective::default(), CurveType::BLS12381G1; "Bls12381G1 Key Generation")] #[tokio::test] @@ -160,10 +190,11 @@ where #[test_case(blsful::inner_types::G1Projective::default(), CurveType::BLS12381G1, 3, [1, 0].to_vec(); "Bls12381G1 add node, keep threshold")] #[test_case(WrappedEdwards::default(), CurveType::Ed25519, 3, [1, 0].to_vec(); "Ed25519 add node, keep threshold")] #[test_case(WrappedRistretto::default(), CurveType::Ristretto25519, 3, [1, 0].to_vec(); "Ristretto25519 add node, keep threshold")] -#[test_case(ed448_goldilocks::EdwardsPoint::default(), CurveType::Ed448, 3, [1, 0].to_vec(); "Ed448 add node, keep threshold")] +#[test_case(EdwardsPoint::default(), CurveType::Ed448, 3, [1, 0].to_vec(); "Ed448 add node, keep threshold")] #[test_case(p256::ProjectivePoint::default(), CurveType::P256, 3, [1, 0].to_vec(); "P256 add node, keep threshold")] #[test_case(p384::ProjectivePoint::default(), CurveType::P384, 3, [1, 0].to_vec(); "P384 add node, keep threshold")] #[test_case(jubjub::SubgroupPoint::default(), CurveType::RedJubjub, 3, [1, 0].to_vec(); "RedJubjub add node, keep threshold")] +#[test_case(pallas::Point::default(), CurveType::RedPallas, 3, [1, 0].to_vec(); "RedPallas add node, keep threshold")] #[test_case(decaf377::Element::default(), CurveType::RedDecaf377, 3, [1, 0].to_vec(); "RedDecaf377 add node, keep threshold")] // #[test_case( CurveType::K256, 4, [-2,0].to_vec() ; "ECDSA remove node, keep threshold")] // #[test_case( CurveType::BLS, 4, [-2,0].to_vec() ; "BLS remove node, keep threshold")] @@ -261,11 +292,12 @@ pub async fn dkg_and_reshare( #[test_case(blsful::inner_types::G1Projective::default(), CurveType::BLS12381G1, 3, 3; "Bls12381G1 restore 3 nodes")] #[test_case(WrappedEdwards::default(), CurveType::Ed25519, 5, 4; "Ed25519 restore 5 nodes")] #[test_case(WrappedRistretto::default(), CurveType::Ristretto25519, 5, 3; "Ristretto25519 restore 5 nodes")] -#[test_case(ed448_goldilocks::EdwardsPoint::default(), CurveType::Ed448, 3, 3; "Ed448 restore 3 nodes")] +#[test_case(EdwardsPoint::default(), CurveType::Ed448, 3, 3; "Ed448 restore 3 nodes")] #[test_case(p256::ProjectivePoint::default(), CurveType::P256, 3, 3; "P256 restore 3 nodes")] #[test_case(p384::ProjectivePoint::default(), CurveType::P384, 3, 3; "P384 restore 3 nodes")] #[test_case(jubjub::SubgroupPoint::default(), CurveType::RedJubjub, 5, 4; "RedJubjub restore 5 nodes")] #[test_case(decaf377::Element::default(), CurveType::RedDecaf377, 3, 3; "RedDecaf377 restore 3 nodes")] +#[test_case(pallas::Point::default(), CurveType::RedPallas, 3, 3; "RedPallas restore 3 nodes")] #[tokio::test] pub async fn dkg_after_restore( _g: G, @@ -286,6 +318,7 @@ pub async fn dkg_after_restore( let threshold = next_peers.threshold_for_set_testing_only(); let mut join_set = tokio::task::JoinSet::new(); + let shadow_key_opts = ShadowOptions::new(false, 1, realm_id, 1, realm_id); for node in vnc_before.nodes.iter() { tokio::time::sleep(std::time::Duration::from_millis(10)).await; let mut dkg_engine = DkgEngine::new( @@ -293,14 +326,14 @@ pub async fn dkg_after_restore( DkgType::Standard, 1, threshold, - (1, realm_id), + &shadow_key_opts, ¤t_peers, &next_peers, DkgAfterRestore::False, ); for i in 0..2 { let dkg_id = format!("{}{}_key_{}", dkg_id, curve_type, i + 1); - dkg_engine.add_dkg(&dkg_id, curve_type, None); + dkg_engine.add_dkg(&dkg_id, DEFAULT_KEY_SET_NAME, curve_type, None); } join_set.spawn(async move { let r = dkg_engine.execute(dkg_id, realm_id).await; @@ -376,22 +409,29 @@ pub async fn dkg_after_restore( // assume this wait is because the join set starts executing immediately on creation tokio::time::sleep(std::time::Duration::from_millis(10)).await; + let shadow_key_opts = ShadowOptions::new(false, 2, realm_id, 2, realm_id); let mut dkg_engine = DkgEngine::new( node.tss_state.clone(), DkgType::Standard, 2, threshold, - (2, realm_id), + &shadow_key_opts, ¤t_peers, &next_peers, DkgAfterRestore::True(DkgAfterRestoreData { peers: recovered_peer_ids.clone(), key_cache: recovery_key_cache.clone(), + use_raw_peer_ids: false, }), ); for (i, pubkey) in root_keys.iter().enumerate() { let dkg_id = format!("{}{}_key_{}", dkg_id, curve_type, i + 1); - dkg_engine.add_dkg(&dkg_id, curve_type, Some(pubkey.clone())); + dkg_engine.add_dkg( + &dkg_id, + DEFAULT_KEY_SET_NAME, + curve_type, + Some(pubkey.clone()), + ); } join_set.spawn(async move { let r = dkg_engine.execute(dkg_id, realm_id).await; @@ -419,6 +459,163 @@ pub async fn dkg_after_restore( } } +#[test_case(k256::ProjectivePoint::GENERATOR, CurveType::K256, 5, 5; "K256 restore 5 nodes")] +#[test_case(blsful::inner_types::G1Projective::GENERATOR, CurveType::BLS, 5, 3; "BLS restore 5 nodes")] +#[test_case(blsful::inner_types::G1Projective::GENERATOR, CurveType::BLS12381G1, 3, 3; "Bls12381G1 restore 3 nodes")] +#[test_case(WrappedEdwards::generator(), CurveType::Ed25519, 5, 4; "Ed25519 restore 5 nodes")] +#[test_case(WrappedRistretto::generator(), CurveType::Ristretto25519, 5, 3; "Ristretto25519 restore 5 nodes")] +#[test_case(ed448_goldilocks::EdwardsPoint::generator(), CurveType::Ed448, 3, 3; "Ed448 restore 3 nodes")] +#[test_case(p256::ProjectivePoint::generator(), CurveType::P256, 3, 3; "P256 restore 3 nodes")] +#[test_case(p384::ProjectivePoint::generator(), CurveType::P384, 3, 3; "P384 restore 3 nodes")] +#[test_case(lit_frost::red_jubjub_generator(), CurveType::RedJubjub, 5, 4; "RedJubjub restore 5 nodes")] +#[test_case(decaf377::Element::generator(), CurveType::RedDecaf377, 3, 3; "RedDecaf377 restore 3 nodes")] +#[tokio::test] +pub async fn dkg_after_restore_datil( + generator: G, + curve_type: CurveType, + num_nodes_before: usize, + num_nodes_after: usize, +) where + G: Group + GroupEncoding + Default + CompressedBytes, + G::Scalar: From + CompressedBytes + LeBytes, + CurveScalar: From, +{ + use elliptic_curve::ff::Field; + + crate::common::setup_logging(); + let vnc_after = VirtualNodeCollection::new(num_nodes_after).await; + let current_peers = SimplePeerCollection(vec![]); + let next_peers = vnc_after.peers(); + let realm_id = 1; + let threshold = next_peers.threshold_for_set_testing_only(); + + let initial_secrets = vec![ + G::Scalar::random(rand::rngs::OsRng), + G::Scalar::random(rand::rngs::OsRng), + ]; + let root_keys = vec![ + (generator * initial_secrets[0]).to_compressed_hex(), + (generator * initial_secrets[1]).to_compressed_hex(), + ]; + + let mut key_shares = HashMap::with_capacity(num_nodes_before); + for (secret, pubkey) in initial_secrets.iter().zip(root_keys.iter()) { + let shared_secret = IdentifierPrimeField(*secret); + let shares = vsss_rs::shamir::split_secret::< + vsss_rs::DefaultShare, IdentifierPrimeField>, + >( + threshold, + num_nodes_before, + &shared_secret, + rand::rngs::OsRng, + ) + .unwrap(); + let peers = shares + .iter() + .map(|s| PeerId::from_u8(s.identifier.0.to_le_bytes()[0])) + .collect::>(); + let node_shares = shares + .iter() + .map(|s| KeyShare { + hex_private_share: s.value.0.to_compressed_hex(), + hex_public_key: pubkey.to_string(), + curve_type, + peer_id: PeerId::from_u8(s.identifier.0.to_le_bytes()[0]), + threshold: num_nodes_before, + total_shares: num_nodes_before, + txn_prefix: "".to_string(), + realm_id, + peers: peers.clone(), + }) + .collect::>(); + key_shares.insert(pubkey.clone(), node_shares); + } + + let mut recovered_peer_ids = vec![]; + let mut recovery_key_cache = KeyCache::default(); + for (index, new_node) in vnc_after.nodes.iter().enumerate() { + for pub_key in &root_keys { + let key_share = &key_shares[pub_key][index]; + assert_eq!(key_share.peer_id, PeerId::from_usize(index + 1)); + write_key_share_to_cache_only( + curve_type, + pub_key, + &new_node.peer.peer_id, + &new_node.hex_staker_address, + 2, + realm_id, + &mut recovery_key_cache, + key_share, + ) + .await + .expect("write key share to disk failed"); + } + recovered_peer_ids.push(RecoveredPeerId { + node_address: H160::random(), + old_peer_id: U256::from(index + 1), + new_peer_id: U256::from(new_node.peer.peer_id), + }); + } + + let dkg_id = "TEST_DKG_1_2."; + let mut join_set = tokio::task::JoinSet::new(); + + let next_peers = vnc_after.peers(); + let threshold = next_peers.threshold_for_set_testing_only(); + for node in vnc_after.nodes.iter() { + // assume this wait is because the join set starts executing immediately on creation + tokio::time::sleep(std::time::Duration::from_millis(10)).await; + + let mut dkg_engine = DkgEngine::new( + node.tss_state.clone(), + DkgType::Standard, + 2, + threshold, + &ShadowOptions::new(false, 2, realm_id, 2, realm_id), + ¤t_peers, + &next_peers, + DkgAfterRestore::True(DkgAfterRestoreData { + peers: recovered_peer_ids.clone(), + key_cache: recovery_key_cache.clone(), + use_raw_peer_ids: true, + }), + ); + for (i, pubkey) in root_keys.iter().enumerate() { + let dkg_id = format!("{}{}_key_{}", dkg_id, curve_type, i + 1); + dkg_engine.add_dkg( + &dkg_id, + DEFAULT_KEY_SET_NAME, + curve_type, + Some(pubkey.clone()), + ); + } + join_set.spawn(async move { + let r = dkg_engine.execute(dkg_id, realm_id).await; + info!("change epoch result: {:?}", r); + let _ = r.expect("error from dkg manager change epoch"); + let root_keys = dkg_engine.get_dkgs().collect::>(); + assert_eq!(root_keys.len(), 2); + root_keys + .iter() + .map(|r| r.result().unwrap().public_key()) + .collect::>() + }); + } + + while let Some(node_info) = join_set.join_next().await { + let _ = node_info.expect("error from dkg engine"); + } + + for (i, pubkey) in root_keys.iter().enumerate() { + let secret = interpolate_secret(curve_type, &next_peers, pubkey, 3, realm_id).await; + assert_eq!( + secret, + initial_secrets[i].into(), + "secrets do not match after restore" + ); + } +} + #[tokio::test] pub async fn dkg_only_all_curves() { crate::common::setup_logging(); @@ -431,7 +628,7 @@ pub async fn dkg_only_all_curves() { let pubkeys = dkg_all_curves(&vnc, epoch, ¤t_peers).await; info!("Generated {} pubkeys", pubkeys.len()); - assert_eq!(pubkeys.len(), 20); + assert_eq!(pubkeys.len(), 22); } async fn restore( @@ -617,18 +814,19 @@ pub async fn dkg( for node in vnc.nodes.iter() { // this is a representation of what happens - but is not exhaustive + let shadow_key_opts = ShadowOptions::new(false, epoch, realm_id, epoch, realm_id); tokio::time::sleep(std::time::Duration::from_millis(10)).await; let mut dkg_engine = DkgEngine::new( node.tss_state.clone(), DkgType::Standard, epoch, threshold, - (epoch, realm_id), + &shadow_key_opts, current_peers, &next_peers, DkgAfterRestore::False, ); - dkg_engine.add_dkg(dkg_id, curve_type, pubkey.clone()); + dkg_engine.add_dkg(dkg_id, DEFAULT_KEY_SET_NAME, curve_type, pubkey.clone()); let jh: JoinHandle = tokio::task::spawn(async move { let r = dkg_engine.execute(dkg_id, realm_id).await; @@ -692,13 +890,14 @@ pub async fn dkg_all_curves( for node in vnc.nodes.iter() { // this is a representation of what happens - but is not exhaustive + let shadow_key_opts = ShadowOptions::new(false, epoch, realm_id, epoch, realm_id); tokio::time::sleep(std::time::Duration::from_millis(10)).await; let mut dkg_engine = DkgEngine::new( node.tss_state.clone(), DkgType::Standard, epoch, threshold, - (epoch, realm_id), + &shadow_key_opts, current_peers, &next_peers, DkgAfterRestore::False, @@ -706,7 +905,7 @@ pub async fn dkg_all_curves( for curve_type in CurveType::into_iter() { for i in 0..2 { let dkg_id = format!("{}{}_key_{}", dkg_id, curve_type, i); - dkg_engine.add_dkg(&dkg_id, curve_type, None); + dkg_engine.add_dkg(&dkg_id, DEFAULT_KEY_SET_NAME, curve_type, None); } } @@ -715,7 +914,7 @@ pub async fn dkg_all_curves( info!("change epoch result: {:?}", r); let _ = r.expect("error from dkg manager change epoch"); let root_keys = dkg_engine.get_dkgs().collect::>(); - assert_eq!(root_keys.len(), 20); + assert_eq!(root_keys.len(), 22); root_keys .iter() .map(|r| r.result().unwrap().public_key()) diff --git a/rust/lit-node/lit-node/tests/component/encryption/bls.rs b/rust/lit-node/lit-node/tests/component/encryption/bls.rs index ff4f8ddf..e3d9d60f 100644 --- a/rust/lit-node/lit-node/tests/component/encryption/bls.rs +++ b/rust/lit-node/lit-node/tests/component/encryption/bls.rs @@ -1,8 +1,8 @@ use crate::component::{dkg::dkg, utils::virtual_node_collection::VirtualNodeCollection}; use core::panic; use lit_node::peers::peer_state::models::SimplePeerCollection; -use lit_node_core::CurveType; -use lit_node_core::SigningScheme; +use lit_node_core::{CurveType, SigningScheme}; +use lit_rust_crypto::blsful::{Bls12381G2Impl, PublicKey, Signature}; use tracing::info; #[tokio::test] @@ -19,9 +19,7 @@ pub async fn sign_min_threshold() { let peers = SimplePeerCollection::default(); let pubkey = dkg(&vnc, CurveType::BLS, epoch, None, &peers).await; - let pub_key = - blsful::PublicKey::::try_from(hex::decode(&pubkey).unwrap()) - .unwrap(); + let pub_key = PublicKey::::try_from(hex::decode(&pubkey).unwrap()).unwrap(); let epoch = 2; vnc.update_cdm_epoch(epoch).await; @@ -43,7 +41,7 @@ pub async fn sign_min_threshold() { // Sign the message using the blsful secret key share. let (signature_share, _share_index) = match cipher_state - .sign_with_pubkey(&message_bytes.clone(), &pubkey, None) + .sign_with_pubkey(&message_bytes.clone(), &pubkey, None, None) .await { Ok(signature_share) => signature_share, @@ -54,7 +52,7 @@ pub async fn sign_min_threshold() { signature_shares.push(signature_share); } - let sig = blsful::Signature::from_shares(&signature_shares); + let sig = Signature::from_shares(&signature_shares); assert!(sig.is_ok()); let sig = sig.unwrap(); assert!( @@ -96,7 +94,7 @@ pub async fn sign_with_pubkey() { // Sign the message using the blsful secret key share. let (signature_share, _share_index) = match cipher_state - .sign_with_pubkey(&message_bytes.clone(), &pubkey, None) + .sign_with_pubkey(&message_bytes.clone(), &pubkey, None, None) .await { Ok(signature_share) => signature_share, @@ -107,7 +105,7 @@ pub async fn sign_with_pubkey() { signature_shares.push(signature_share); } - let sig = blsful::Signature::from_shares(&signature_shares); + let sig = Signature::from_shares(&signature_shares); assert!(sig.is_ok()); let _sig = sig.unwrap(); diff --git a/rust/lit-node/lit-node/tests/component/precompute/damfast_presignatures.rs b/rust/lit-node/lit-node/tests/component/precompute/damfast_presignatures.rs index 08f005f5..4bd5c545 100644 --- a/rust/lit-node/lit-node/tests/component/precompute/damfast_presignatures.rs +++ b/rust/lit-node/lit-node/tests/component/precompute/damfast_presignatures.rs @@ -3,9 +3,8 @@ use futures::future::join_all; use lit_fast_ecdsa::SignatureShare; use lit_node::peers::peer_state::models::SimplePeerCollection; use lit_node::tasks::presign_manager::models::PreSignatureValue; -use lit_node_core::CurveType; -use lit_node_core::NodeSet; -use lit_node_core::SigningScheme; +use lit_node_core::{CurveType, NodeSet, SigningScheme}; +use lit_rust_crypto::{k256, p256, p384}; use tokio::task::JoinHandle; #[tokio::test] @@ -105,7 +104,7 @@ async fn damfast_signature(vnc: &VirtualNodeCollection) -> bool { let _pubkey = super::super::dkg::dkg(&vnc, CurveType::K256, 0, None, ¤t_peers).await; let message_bytes = b"DamFast Test!"; - let root_pubkeys = None; + let root_pubkeys = []; let tweak_preimage = None; let request_id = b"damfasttxn"; let epoch = Some(1); @@ -131,7 +130,7 @@ async fn damfast_signature(vnc: &VirtualNodeCollection) -> bool { let r = damfast_state .sign_with_pubkey_internal::( message_bytes, - root_pubkeys, + &root_pubkeys, tweak_preimage, request_id.to_vec(), epoch, diff --git a/rust/lit-node/lit-node/tests/component/sign/ecdsa_damfast.rs b/rust/lit-node/lit-node/tests/component/sign/ecdsa_damfast.rs index eea76fa9..77aa18c5 100644 --- a/rust/lit-node/lit-node/tests/component/sign/ecdsa_damfast.rs +++ b/rust/lit-node/lit-node/tests/component/sign/ecdsa_damfast.rs @@ -1,11 +1,6 @@ use crate::component::{dkg::dkg, utils::virtual_node_collection::VirtualNodeCollection}; -use elliptic_curve::generic_array::ArrayLength; -use elliptic_curve::group::{Curve, GroupEncoding}; -use elliptic_curve::{CurveArithmetic, FieldBytesSize, NonZeroScalar, PrimeCurve}; use ethers::utils::keccak256; use futures::future::join_all; -use hd_keys_curves::{HDDerivable, HDDeriver}; -use k256::ecdsa::hazmat::DigestPrimitive; use lit_fast_ecdsa::SignatureShare; use lit_node::peers::peer_state::models::SimplePeerCollection; use lit_node::tasks::presign_manager::models::{PreSignatureValue, Presign}; @@ -13,9 +8,18 @@ use lit_node::tss::common::dkg_type::DkgType; use lit_node::tss::common::tss_state::TssState; use lit_node::tss::ecdsa_damfast::DamFastState; use lit_node::utils::traits::SignatureCurve; -use lit_node_core::CompressedBytes; -use lit_node_core::PeerId; -use lit_node_core::SigningScheme; +use lit_node_core::{ + CompressedBytes, PeerId, SigningScheme, + hd_keys_curves_wasm::{HDDerivable, HDDeriver}, +}; +use lit_rust_crypto::{ + elliptic_curve::{ + CurveArithmetic, FieldBytesSize, NonZeroScalar, PrimeCurve, generic_array::ArrayLength, + }, + group::{Curve, GroupEncoding}, + k256::{self, ecdsa::hazmat::DigestPrimitive}, + p256, p384, +}; use serde::Serialize; use std::ops::Add; use std::sync::Arc; @@ -173,7 +177,7 @@ pub async fn do_sign_with_pubkey( let sig_share = damfast_state .generate_signature_share_from_key_id::( &loop_message_bytes, - Some(hd_root_keys), + &hd_root_keys, &presign_share.share.unwrap::().clone(), request_id, &peers, diff --git a/rust/lit-node/lit-node/tests/component/sign/frost.rs b/rust/lit-node/lit-node/tests/component/sign/frost.rs index 3d9bfc39..5d8b4484 100644 --- a/rust/lit-node/lit-node/tests/component/sign/frost.rs +++ b/rust/lit-node/lit-node/tests/component/sign/frost.rs @@ -7,10 +7,10 @@ use lit_frost::{ }; use lit_node::peers::peer_state::models::SimplePeer; use lit_node::tss::common::key_share::KeyShare; -use lit_node::tss::common::signing_scheme::signing_scheme_to_frost_scheme; use lit_node::tss::frost::FrostState; use lit_node_core::PeerId; use lit_node_core::SigningScheme; +use lit_sdk::signature::signing_scheme_to_frost_scheme; use test_case::test_case; use tokio::task::JoinHandle; use tracing::info; diff --git a/rust/lit-node/lit-node/tests/integration/backup.rs b/rust/lit-node/lit-node/tests/integration/backup.rs index 47c6e155..e142c13a 100644 --- a/rust/lit-node/lit-node/tests/integration/backup.rs +++ b/rust/lit-node/lit-node/tests/integration/backup.rs @@ -1,6 +1,4 @@ use crate::common::peers::get_simple_peer_collection; -use elliptic_curve::Group; -use elliptic_curve::group::GroupEncoding; use ethers::abi::Address; use lit_core::utils::binary::bytes_to_hex; use lit_node::common::key_helper::KeyCache; @@ -14,6 +12,11 @@ use lit_node::tss::common::storage::{ use lit_node_core::ethers::prelude::U256; use lit_node_core::{CompressedBytes, CurveType}; use lit_node_testnet::TestSetupBuilder; +use lit_rust_crypto::{ + blsful, decaf377, ed448_goldilocks, + group::{Group, GroupEncoding}, + jubjub, k256, p256, p384, pallas, vsss_rs, +}; use tracing::info; /// Tests that decryption shares do not get deleted @@ -174,6 +177,15 @@ async fn verify_restore_decryption_shares_not_deleted() { ) .await; } + CurveType::RedPallas => { + check_for_restore_decryption_shares::( + curve_type, + &pubkey, + &peers, + realm_id.as_u64(), + ) + .await; + } } } } diff --git a/rust/lit-node/lit-node/tests/integration/backup_datil_long.rs b/rust/lit-node/lit-node/tests/integration/backup_datil_long.rs index cd96d8fe..2e7e8f6c 100644 --- a/rust/lit-node/lit-node/tests/integration/backup_datil_long.rs +++ b/rust/lit-node/lit-node/tests/integration/backup_datil_long.rs @@ -3,17 +3,18 @@ use chrono::{Duration, Utc}; use ethers::prelude::{H160, U256}; use ethers::types::Address; use hex::FromHex; -use k256::ecdsa::{SigningKey, VerifyingKey}; use lit_blockchain::contracts::pubkey_router::RootKey; use lit_core::config::CFG_ADMIN_OVERRIDE_NAME; use lit_node::auth::auth_material::JsonAuthSigExtended; use lit_node::endpoints::auth_sig::LITNODE_ADMIN_RES; use lit_node::peers::peer_state::models::NetworkState; use lit_node::tss::common::restore::NodeRecoveryStatus; +use lit_node::tss::util::DEFAULT_KEY_SET_NAME; use lit_node_core::JsonAuthSig; use lit_node_testnet::TestSetupBuilder; use lit_node_testnet::testnet::Testnet; use lit_node_testnet::validator::ValidatorCollection; +use lit_rust_crypto::k256::ecdsa::{SigningKey, VerifyingKey}; use reqwest::Client; use rocket::serde::Serialize; use sha3::{Keccak256, digest::Digest}; @@ -26,6 +27,12 @@ const TARBALL_NAME: &str = "lit_backup_encrypted_keys.tar.gz"; #[tokio::test] async fn recover_datil_into_naga_test() { + unsafe { + std::env::set_var( + "IPFS_API_KEY", + "NkOJGWDsFcLTn7gXH37bS85HIMJJ4-d-r2qVHJWBXOXyxJYtG7FbyXATZCEAyf2s", + ); + } std::thread::Builder::new() .stack_size(128 * 1024 * 1024) // 32MB stack .spawn(move || { @@ -64,6 +71,66 @@ async fn end_to_end_test(number_of_nodes: usize, recovery_party_size: usize) { .await; testnet.actions().sleep_millis(5000).await; + let tx = validator_collection + .actions() + .contracts() + .pubkey_router + .admin_reset_root_keys( + testnet.actions().contracts().staking.address(), + DEFAULT_KEY_SET_NAME.to_string(), + ); + tx.send().await.unwrap(); + let tx = validator_collection.actions().contracts().pubkey_router.admin_set_root_keys( + testnet.actions().contracts().staking.address(), + DEFAULT_KEY_SET_NAME.to_string(), + vec![ + RootKey { + key_type: U256::from(1), + pubkey: ethers::types::Bytes::from_hex("0xb500ba119f643feb1981d26ffe7235288fdd39c36d6ebd35aebea7a5f92a812798513c1ae710461a6d229c59a782e375").unwrap(), + }, + RootKey { + key_type: U256::from(2), + pubkey: ethers::types::Bytes::from_hex("0x02a11f8d29fabb49b5bbcd92159698afe4f136bab8b4a33f8606a71bd03bd6dc27").unwrap(), + }, + RootKey { + key_type: U256::from(2), + pubkey: ethers::types::Bytes::from_hex("0x02cd471f410f17f1e932886a90effbb522a7841d9107d256c034cfa04020ba64c6").unwrap(), + }, + RootKey { + key_type: U256::from(2), + pubkey: ethers::types::Bytes::from_hex("0x02d63650585b90ae80acde8fc4c638c4db0a00945f9b1c40024c92064cd99bdbbe").unwrap(), + }, + RootKey { + key_type: U256::from(2), + pubkey: ethers::types::Bytes::from_hex("0x03a9e669a6f3b662a6b91fcb3cfa08608ab705e83b9b01bbf4fc4c2fcac3163b23").unwrap(), + }, + RootKey { + key_type: U256::from(2), + pubkey: ethers::types::Bytes::from_hex("0x03d16416e913ba7adc1ccd58c36ff9f2130fa64d36e510551af70fb1be2174bb74").unwrap(), + }, + RootKey { + key_type: U256::from(2), + pubkey: ethers::types::Bytes::from_hex("0x022e26c96cdeabee0930344a08cf3ee290c9efb3344fc8d50e460706ef7b55c518").unwrap(), + }, + RootKey { + key_type: U256::from(2), + pubkey: ethers::types::Bytes::from_hex("0x027b98e8d099788fae7d9dc79865f28d4ddc0f630c6c593e5e8d7ef94c0285d729").unwrap(), + }, + RootKey { + key_type: U256::from(2), + pubkey: ethers::types::Bytes::from_hex("0x033c8c0840302669019a6d0d12108caa6b0581a1d96022d4ea87ab203fba94cf1e").unwrap(), + }, + RootKey { + key_type: U256::from(2), + pubkey: ethers::types::Bytes::from_hex("0x039af7bc7d673c899cc45ec5e30ba518be438931e9acb916fef7a336b9954687e9").unwrap(), + }, + RootKey { + key_type: U256::from(2), + pubkey: ethers::types::Bytes::from_hex("0x023403362ef1a693967858606e0cd9c5a67b30d5bd3a1a70a960c1286c15c8f68a").unwrap(), + }, + ], + ); + tx.send().await.unwrap(); let tx = validator_collection .actions() .contracts() diff --git a/rust/lit-node/lit-node/tests/integration/backup_long.rs b/rust/lit-node/lit-node/tests/integration/backup_long.rs index 0e20506a..be25ad79 100644 --- a/rust/lit-node/lit-node/tests/integration/backup_long.rs +++ b/rust/lit-node/lit-node/tests/integration/backup_long.rs @@ -1,10 +1,8 @@ use crate::common::ecdsa::simple_single_sign_with_hd_key; use crate::common::recovery_party::SiweSignature; -use blsful::inner_types::{Group, GroupEncoding}; use chrono::{Duration, Utc}; use ethers::prelude::{H160, LocalWallet, Signer, U256}; use ethers::types::Address; -use k256::ecdsa::{SigningKey, VerifyingKey}; use lit_blockchain::contracts::backup_recovery::BackupRecoveryState; use lit_core::config::CFG_ADMIN_OVERRIDE_NAME; use lit_core::utils::binary::bytes_to_hex; @@ -23,6 +21,16 @@ use lit_node_testnet::TestSetupBuilder; use lit_node_testnet::end_user::EndUser; use lit_node_testnet::testnet::Testnet; use lit_node_testnet::validator::ValidatorCollection; +use lit_rust_crypto::{ + blsful, decaf377, ed448_goldilocks, + group::{Group, GroupEncoding}, + jubjub, + k256::{ + self, + ecdsa::{SigningKey, VerifyingKey}, + }, + p256, p384, pallas, vsss_rs, +}; use reqwest::Client; use semver::Version; use sha3::{Keccak256, digest::Digest}; @@ -652,6 +660,15 @@ async fn download_decryption_key_shares_to_local_lit_recovery_tools( ) .await; } + CurveType::RedPallas => { + check_for_lingering_keys::( + curve_type, + &pubkey, + &peers, + realm_id.as_u64(), + ) + .await + } } } } diff --git a/rust/lit-node/lit-node/tests/integration/epoch_change_long.rs b/rust/lit-node/lit-node/tests/integration/epoch_change_long.rs index 07eeba52..70ab2380 100644 --- a/rust/lit-node/lit-node/tests/integration/epoch_change_long.rs +++ b/rust/lit-node/lit-node/tests/integration/epoch_change_long.rs @@ -1,4 +1,3 @@ -use blsful::inner_types::{Group, GroupEncoding}; use lit_node_testnet::{ end_user::EndUser, testnet::{NodeAccount, Testnet, WhichTestnet, contracts::StakingContractRealmConfig}, @@ -15,6 +14,11 @@ use lit_node::tss::common::key_persistence::KeyPersistence; use lit_node::tss::common::key_share_commitment::KeyShareCommitments; use lit_node::tss::common::storage::read_key_share_commitments_from_disk; use lit_node_core::{CompressedBytes, CurveType, PeerId}; +use lit_rust_crypto::{ + blsful, decaf377, ed448_goldilocks, + group::{Group, GroupEncoding}, + jubjub, k256, p256, p384, pallas, vsss_rs, +}; use network_state::{NetworkState, get_next_random_network_state}; use semver::Version; use tracing::info; @@ -288,6 +292,15 @@ async fn test_many_epochs() { ) .await; } + CurveType::RedPallas => { + check_for_lingering_keys::( + curve_type, + pub_key, + &peers, + realm_id.as_u64(), + ) + .await; + } } } } diff --git a/rust/lit-node/lit-node/tests/integration/integration_tests.rs b/rust/lit-node/lit-node/tests/integration/integration_tests.rs index dd47b834..e1a33b3d 100644 --- a/rust/lit-node/lit-node/tests/integration/integration_tests.rs +++ b/rust/lit-node/lit-node/tests/integration/integration_tests.rs @@ -572,13 +572,11 @@ async fn node_restarts_without_key_material() { // set epoch length to 30 mins so it never elapses unless we advance the clock let (testnet, mut validator_collection, end_user) = TestSetupBuilder::default() .num_staked_and_joined_validators(num_nodes) + .epoch_length(epoch_length) .build() .await; let actions = testnet.actions(); - let _r = actions - .set_epoch_length(realm_id, U256::from(epoch_length)) - .await; // Lower the configured interval for complaints to reduce possibility of any kicks. info!("Lowering the complaint interval to 15s for all complaints"); @@ -663,6 +661,7 @@ async fn node_restarts_without_key_material() { .await; assert!(voting_status.is_ok()); + info!("Fast forwarding time to allow nodes to start a DKG to advance to the next epoch."); // Fast forward time to allow nodes to start a DKG to advance to the next epoch. actions.increase_blockchain_timestamp(epoch_length).await; diff --git a/rust/lit-node/lit-node/tests/integration/keysets.rs b/rust/lit-node/lit-node/tests/integration/keysets.rs new file mode 100644 index 00000000..b0074e6a --- /dev/null +++ b/rust/lit-node/lit-node/tests/integration/keysets.rs @@ -0,0 +1,59 @@ +use crate::common::ecdsa::simple_single_sign_with_hd_key; + +use ethers::types::U256; +use lit_node_core::{CurveType, SigningScheme}; +use lit_node_testnet::{TestSetupBuilder, testnet::actions::RootKeyConfig}; +use tracing::info; + +#[tokio::test] +#[doc = "Primary test to ensure that the network can add a second keyset and sign with it."] +pub async fn test_add_second_keyset() { + crate::common::setup_logging(); + + info!("Starting test: test_pkp_hd_sign_generic_key_with_epoch_change"); + let (_testnet, validator_collection, end_user) = TestSetupBuilder::default().build().await; + + let actions = validator_collection.actions(); + let pubkey = end_user.first_pkp().pubkey.clone(); + + let realm_id = U256::from(1); + + // check to see that we can sign + let result = simple_single_sign_with_hd_key(&validator_collection, &end_user, pubkey.clone(), SigningScheme::EcdsaK256Sha256, &vec![]).await; + assert!(result, "Failed to sign with all nodes up."); + + let mut keySetId = 2; +for j in 0..10 { + for i in 2..10 { + + let identifier = format!("naga-keyset{}-", keySetId); + info!("**** Adding keyset `{}` ****", identifier); + + let description = format!("Naga Keyset {}", i); + let root_key_configs = vec![ + RootKeyConfig { curve_type: CurveType::try_from(i).unwrap(), count: 2 }, + ]; + let r = actions.add_keyset(realm_id, identifier.clone(), description, root_key_configs).await; + assert!(r.is_ok(), "Failed to add keyset `{}`", identifier); + + keySetId += 1; + } +} + + let current_epoch = actions.get_current_epoch(realm_id).await; + info!("Epoch: {}", current_epoch); + + // Fast forward the network by 300 seconds, and wait for the new node to be active - effectively waiting for the next epoch. + actions.increase_blockchain_timestamp(300).await; + + // Wait for DKG to start and then finish, by effectively waiting for the epoch change - nodes become active once more. + actions.wait_for_epoch(realm_id, current_epoch + 1).await; + + actions.sleep_millis(5000).await; + // test signing + let result = simple_single_sign_with_hd_key(&validator_collection, &end_user, pubkey.clone(), SigningScheme::EcdsaK256Sha256, &vec![]).await; + assert!(result, "Failed to sign with all nodes up."); + + + actions.sleep_millis(2000000).await; +} diff --git a/rust/lit-node/lit-node/tests/integration/lit_actions.rs b/rust/lit-node/lit-node/tests/integration/lit_actions.rs index 0e1b6e8c..0be91ebf 100644 --- a/rust/lit-node/lit-node/tests/integration/lit_actions.rs +++ b/rust/lit-node/lit-node/tests/integration/lit_actions.rs @@ -36,6 +36,7 @@ pub mod litactions { use lit_node_testnet::node_collection::{ get_identity_pubkeys_from_node_set, get_network_pubkey, }; + use lit_rust_crypto::k256; use lit_sdk::signature::SignedDataOutput; use rocket::form::validate::Contains; use serde_json::Value; @@ -146,7 +147,7 @@ pub mod litactions { ) .await; - let (pubkey, _token_id, _eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, _eth_address, _key_set_id) = end_user.first_pkp().info(); let lit_action_code = data_encoding::BASE64.encode(lit_action_code.as_bytes()); // per above, there are more params than needed for some actions, but they are ignored @@ -392,10 +393,11 @@ pub mod litactions { k256::Scalar::ZERO }; - let scalar_primitive = elliptic_curve::ScalarPrimitive::::from_slice( - &hex::decode(&la_signed_data.digest).unwrap(), - ) - .unwrap(); + let scalar_primitive = + lit_rust_crypto::elliptic_curve::ScalarPrimitive::::from_slice( + &hex::decode(&la_signed_data.digest).unwrap(), + ) + .unwrap(); let data_signed = k256::Scalar::from(scalar_primitive); let signed_data: SignedDatak256 = SignedDatak256 { @@ -632,7 +634,9 @@ pub mod litactions { .into_bytes(); debug!("Identity parameter: {:?}", identity_param); - let pubkey = blsful::PublicKey::try_from(&hex::decode(&network_pubkey).unwrap()).unwrap(); + let pubkey = + lit_rust_crypto::blsful::PublicKey::try_from(&hex::decode(&network_pubkey).unwrap()) + .unwrap(); let ciphertext = lit_sdk::encryption::encrypt_time_lock(&pubkey, message_bytes, &identity_param) @@ -815,7 +819,7 @@ pub mod litactions { let auth_sig = generate_authsig(&end_user.wallet) .await .expect("Couldn't generate auth sig"); - let (pubkey, _token_id, _eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, _eth_address, _key_set_id) = end_user.first_pkp().info(); let lit_action_code = data_encoding::BASE64.encode(lit_action_code.as_bytes()); let mut js_params = serde_json::Map::new(); diff --git a/rust/lit-node/lit-node/tests/integration/session_sigs.rs b/rust/lit-node/lit-node/tests/integration/session_sigs.rs index 473aeb9a..05697392 100644 --- a/rust/lit-node/lit-node/tests/integration/session_sigs.rs +++ b/rust/lit-node/lit-node/tests/integration/session_sigs.rs @@ -52,7 +52,7 @@ async fn sign_session_sig_with_lit_actions() { let wallet = end_user.signing_provider().signer().clone(); let auth_sig = generate_authsig_item(&wallet).await.unwrap(); - let (pubkey, _token_id, eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, eth_address, _key_set_id) = end_user.first_pkp().info(); let signing_key = ed25519_dalek::SigningKey::generate(&mut OsRng); let verifying_key = signing_key.verifying_key(); @@ -157,7 +157,7 @@ async fn sign_session_sig_with_lit_actions_requires_payment() { end_user.set_wallet_balance("0").await; let auth_sig = generate_authsig_item(&wallet).await.unwrap(); - let (pubkey, _token_id, eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, eth_address, _key_set_id) = end_user.first_pkp().info(); let signing_key = ed25519_dalek::SigningKey::generate(&mut OsRng); let verifying_key = signing_key.verifying_key(); @@ -215,7 +215,7 @@ async fn only_permitted_lit_action_can_sign_session_sig() { let non_owner_wallet = LocalWallet::new(&mut OsRng); let auth_sig = generate_authsig_item(&non_owner_wallet).await.unwrap(); - let (pubkey, _token_id, eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, eth_address, _key_set_id) = end_user.first_pkp().info(); let signing_key = ed25519_dalek::SigningKey::generate(&mut OsRng); let verifying_key = signing_key.verifying_key(); @@ -267,7 +267,7 @@ async fn sign_pkp_with_lit_action_session_sigs() { let (_testnet, validator_collection, end_user) = init_test().await; let node_set = validator_collection.random_threshold_nodeset().await; let node_set = get_identity_pubkeys_from_node_set(&node_set).await; - let (pubkey, _token_id, eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, eth_address, _key_set_id) = end_user.first_pkp().info(); let lit_action_code = data_encoding::BASE64.encode(VALID_SESSION_SIG_LIT_ACTION_CODE.to_string().as_bytes()); @@ -339,7 +339,7 @@ async fn sign_lit_actions_with_lit_action_session_sig() { let (_testnet, validator_collection, end_user) = init_test().await; let node_set = validator_collection.random_threshold_nodeset().await; let node_set = get_identity_pubkeys_from_node_set(&node_set).await; - let (pubkey, _token_id, eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, eth_address, _key_set_id) = end_user.first_pkp().info(); let session_sig_lit_action_code = data_encoding::BASE64.encode(VALID_SESSION_SIG_LIT_ACTION_CODE.to_string().as_bytes()); @@ -430,7 +430,7 @@ async fn only_permitted_can_sign_with_lit_action_session_sig() { .get_current_epoch(realm_id) .await .as_u64(); - let (pubkey, _token_id, eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, eth_address, _key_set_id) = end_user.first_pkp().info(); let session_sig_lit_action_code = data_encoding::BASE64.encode(VALID_SESSION_SIG_LIT_ACTION_CODE.to_string().as_bytes()); @@ -534,7 +534,7 @@ async fn sign_lit_actions_with_custom_auth_resource_lit_action_session_sig() { let (_testnet, validator_collection, end_user) = init_test().await; let node_set = validator_collection.random_threshold_nodeset().await; let node_set = get_identity_pubkeys_from_node_set(&node_set).await; - let (pubkey, _token_id, eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, eth_address, _key_set_id) = end_user.first_pkp().info(); let session_sig_lit_action_code = data_encoding::BASE64.encode( CUSTOM_AUTH_RESOURCE_VALID_SESSION_SIG_LIT_ACTION_CODE @@ -624,7 +624,7 @@ async fn sign_pkp_with_no_auth_method_lit_action_session_sig() { let (_testnet, validator_collection, end_user) = init_test().await; let node_set = validator_collection.random_threshold_nodeset().await; let node_set = get_identity_pubkeys_from_node_set(&node_set).await; - let (pubkey, _token_id, eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, eth_address, _key_set_id) = end_user.first_pkp().info(); let session_sig_lit_action_code = data_encoding::BASE64.encode( NO_AUTH_METHOD_SESSION_SIG_LIT_ACTION_CODE @@ -706,7 +706,7 @@ async fn sign_lit_actions_with_no_auth_method_lit_action_session_sig() { let (_testnet, validator_collection, end_user) = init_test().await; let node_set = validator_collection.random_threshold_nodeset().await; let node_set = get_identity_pubkeys_from_node_set(&node_set).await; - let (pubkey, _token_id, eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, eth_address, _key_set_id) = end_user.first_pkp().info(); let session_sig_lit_action_code = data_encoding::BASE64.encode( NO_AUTH_METHOD_SESSION_SIG_LIT_ACTION_CODE @@ -800,7 +800,7 @@ async fn sign_pkp_with_eoa_session_sigs() { let wallet = end_user.wallet.clone(); - let (pubkey, _token_id, _eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, _eth_address, _key_set_id) = end_user.first_pkp().info(); let session_sigs_and_node_set = get_session_sigs_for_auth( &node_set, @@ -856,7 +856,7 @@ async fn execute_js_with_eoa_session_sigs() { let node_set = get_identity_pubkeys_from_node_set(&node_set).await; let wallet = end_user.wallet.clone(); - let (pubkey, _token_id, _eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, _eth_address, _key_set_id) = end_user.first_pkp().info(); let session_sigs_and_node_set = get_session_sigs_for_auth( &node_set, @@ -903,7 +903,7 @@ async fn decrypt_with_lit_action_session_sig() { let (_testnet, validator_collection, end_user) = init_test().await; let node_set = validator_collection.random_threshold_nodeset().await; let node_set = get_identity_pubkeys_from_node_set(&node_set).await; - let (pubkey, _token_id, eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, eth_address, _key_set_id) = end_user.first_pkp().info(); let lit_action_code = data_encoding::BASE64.encode(VALID_SESSION_SIG_LIT_ACTION_CODE.to_string().as_bytes()); @@ -943,7 +943,9 @@ async fn decrypt_with_lit_action_session_sig() { .get_resource_key() .into_bytes(); - let bls_pubkey = blsful::PublicKey::try_from(&hex::decode(&network_pubkey).unwrap()).unwrap(); + let bls_pubkey = + lit_rust_crypto::blsful::PublicKey::try_from(&hex::decode(&network_pubkey).unwrap()) + .unwrap(); // Encrypt let ciphertext = lit_sdk::encryption::encrypt_time_lock(&bls_pubkey, message_bytes, &identity_param) @@ -1018,7 +1020,7 @@ async fn test_v1_endpoints_api_constraints() { let wallet = end_user.wallet.clone(); let auth_sig = generate_authsig_item(&wallet).await.unwrap(); - let (pubkey, _token_id, eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, eth_address, _key_set_id) = end_user.first_pkp().info(); let signing_key = ed25519_dalek::SigningKey::generate(&mut OsRng); let verifying_key = signing_key.verifying_key(); @@ -1148,7 +1150,7 @@ async fn sign_session_key_auth_method() { let node_set = validator_collection.random_threshold_nodeset().await; let node_set = get_identity_pubkeys_from_node_set(&node_set).await; - let (pubkey, _token_id, eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, eth_address, _key_set_id) = end_user.first_pkp().info(); let signing_key = ed25519_dalek::SigningKey::generate(&mut rand::rngs::OsRng); let verifying_key = signing_key.verifying_key(); @@ -1422,7 +1424,7 @@ async fn explicit_resource_permission_required_for_lit_action() { let (_testnet, validator_collection, end_user) = init_test().await; - let (pubkey, _token_id, _eth_address) = end_user.first_pkp().info(); + let (pubkey, _token_id, _eth_address, _key_set_id) = end_user.first_pkp().info(); // the lit action we're going to test is VALID_PKP_SIGNING_LIT_ACTION_CODE // so let's derive the IPFS CID for it diff --git a/rust/lit-node/lit-node/tests/integration/shadow.rs b/rust/lit-node/lit-node/tests/integration/shadow.rs index 87ea0fa7..d1f02276 100644 --- a/rust/lit-node/lit-node/tests/integration/shadow.rs +++ b/rust/lit-node/lit-node/tests/integration/shadow.rs @@ -162,7 +162,9 @@ async fn shadow_splicing_sign_encrypt() { .get_resource_key() .into_bytes(); - let pubkey = blsful::PublicKey::try_from(hex::decode(&network_pubkey).unwrap()).unwrap(); + let pubkey = + lit_rust_crypto::blsful::PublicKey::try_from(hex::decode(&network_pubkey).unwrap()) + .unwrap(); let ciphertext = lit_sdk::encryption::encrypt_time_lock( &pubkey, diff --git a/rust/lit-node/lit-node/tests/integration/signing.rs b/rust/lit-node/lit-node/tests/integration/signing.rs index dcfc04b3..ffdeec29 100644 --- a/rust/lit-node/lit-node/tests/integration/signing.rs +++ b/rust/lit-node/lit-node/tests/integration/signing.rs @@ -11,6 +11,8 @@ use lit_node_testnet::end_user::EndUser; use lit_node_core::SigningScheme; use lit_node_testnet::node_collection::get_identity_pubkeys_from_node_set; +use lit_node_testnet::validator::ValidatorCollection; +use lit_rust_crypto::k256; use rand::Rng; use rand_core::OsRng; use std::str::FromStr; @@ -19,7 +21,7 @@ use std::{io::BufRead, time::Duration}; use test_case::test_case; use tracing::{error, info}; -const ALL_SIGNING_SCHEMES: [SigningScheme; 14] = [ +const ALL_SIGNING_SCHEMES: [SigningScheme; 15] = [ SigningScheme::Bls12381G1ProofOfPossession, SigningScheme::SchnorrEd25519Sha512, SigningScheme::SchnorrK256Sha256, @@ -28,6 +30,7 @@ const ALL_SIGNING_SCHEMES: [SigningScheme; 14] = [ SigningScheme::SchnorrRistretto25519Sha512, SigningScheme::SchnorrEd448Shake256, SigningScheme::SchnorrRedJubjubBlake2b512, + SigningScheme::SchnorrRedPallasBlake2b512, SigningScheme::SchnorrK256Taproot, SigningScheme::SchnorrRedDecaf377Blake2b512, SigningScheme::SchnorrkelSubstrate, @@ -256,36 +259,10 @@ pub async fn test_pkp_hd_sign_and_submit_eth_txn() { pub async fn test_pkp_hd_sign_generic_key() { crate::common::setup_logging(); info!("Starting test: test_hd_pkp_sign"); - let setup_time = std::time::Instant::now(); let (testnet, validator_collection, end_user) = TestSetupBuilder::default().build().await; - let pubkey = end_user.first_pkp().pubkey.clone(); - info!("Setup time: {:?}", setup_time.elapsed()); - - // We loop instead of running this test multiple times due to spinning up and tearing down - // the network. Essentially, this accomplishes the exact same thing. - for scheme in ALL_SIGNING_SCHEMES { - let start = std::time::Instant::now(); - info!( - "Starting test_pkp_hd_sign_generic_key for signing_scheme: {}", - scheme - ); - // check to see that we can sign - info!("Signing with scheme: {:?}", scheme); - assert!( - simple_single_sign_with_hd_key( - &validator_collection, - &end_user, - pubkey.clone(), - scheme, - &vec![] - ) - .await, - "Failed to sign first time with all nodes up." - ); - info!("Time elapsed: {:?}", start.elapsed()); - } + sign_with_each_curve_type(&validator_collection, &end_user, pubkey.clone()).await; drop(testnet); } @@ -302,25 +279,10 @@ pub async fn test_pkp_hd_sign_generic_key_with_epoch_change() { let pubkey = end_user.first_pkp().pubkey.clone(); let realm_id = U256::from(1); - let current_epoch = validator_collection - .actions() - .get_current_epoch(realm_id) - .await; + let current_epoch = actions.get_current_epoch(realm_id).await; // check to see that we can sign - for scheme in ALL_SIGNING_SCHEMES { - assert!( - simple_single_sign_with_hd_key( - &validator_collection, - &end_user, - pubkey.clone(), - scheme, - &vec![] - ) - .await, - "Failed to sign first time with all nodes up." - ); - } + sign_with_each_curve_type(&validator_collection, &end_user, pubkey.clone()).await; // Wait for the new node to be active. actions.wait_for_active(realm_id).await; @@ -335,20 +297,7 @@ pub async fn test_pkp_hd_sign_generic_key_with_epoch_change() { actions.wait_for_epoch(realm_id, current_epoch + 1).await; // check to see that we can sign - for scheme in ALL_SIGNING_SCHEMES { - info!("Signing with scheme: {:?}", scheme); - assert!( - simple_single_sign_with_hd_key( - &validator_collection, - &end_user, - pubkey.clone(), - scheme, - &vec![] - ) - .await, - "Failed to sign after epoch change." - ); - } + sign_with_each_curve_type(&validator_collection, &end_user, pubkey.clone()).await; } #[tokio::test] @@ -366,19 +315,7 @@ pub async fn test_pkp_signing_when_nodes_drop() { let pubkey = end_user.first_pkp().pubkey.clone(); - for scheme in ALL_SIGNING_SCHEMES { - assert!( - simple_single_sign_with_hd_key( - &validator_collection, - &end_user, - pubkey.clone(), - scheme, - &vec![] - ) - .await, - "Failed to sign with all nodes up." - ); - } + sign_with_each_curve_type(&validator_collection, &end_user, pubkey.clone()).await; assert!(validator_collection.stop_node(node_to_kill).await.is_ok()); let realm_id = U256::from(1); @@ -425,6 +362,25 @@ pub async fn test_pkp_signing_when_nodes_drop() { } } +pub async fn sign_with_each_curve_type( + validator_collection: &ValidatorCollection, + end_user: &EndUser, + pubkey: String, +) { + for scheme in ALL_SIGNING_SCHEMES { + info!("Signing with scheme: {:?}", scheme); + let result = simple_single_sign_with_hd_key( + &validator_collection, + &end_user, + pubkey.clone(), + scheme, + &vec![], + ) + .await; + assert!(result, "Failed to sign with all nodes up."); + } +} + #[test_case(SigningScheme::EcdsaK256Sha256; "Secp256k1 ECDSA Sign with presignatures")] #[test_case(SigningScheme::EcdsaP256Sha256; "P-256 ECDSA Sign with presignatures")] #[test_case(SigningScheme::EcdsaP384Sha384; "P-384 ECDSA Sign with presignatures")] @@ -620,7 +576,7 @@ pub async fn eoa_session_sig_with_mgb_pkp_signing() { let (testnet, validator_collection, end_user) = TestSetupBuilder::default().build().await; info!("end user pkp info: {:?}", end_user.first_pkp().info()); - let (pubkey, token_id, pkp_address) = end_user.first_pkp().info().clone(); + let (pubkey, token_id, pkp_address, _key_set_id) = end_user.first_pkp().info().clone(); let owner_wallet = end_user.signing_provider().clone(); diff --git a/rust/lit-node/lit-node/tests/test.rs b/rust/lit-node/lit-node/tests/test.rs index 74505d88..9dfcc19d 100644 --- a/rust/lit-node/lit-node/tests/test.rs +++ b/rust/lit-node/lit-node/tests/test.rs @@ -14,7 +14,7 @@ pub mod integration; // sdk tests - downloads the latest SDK & test it against the nodes in full compilation in a local network configuration pub mod sdk; // upgrade tests - test the upgrade process -//pub mod upgrades; +pub mod upgrades; // fault tests - test the fault tolerance of the network pub mod toxiproxy; diff --git a/rust/lit-node/lit-node/tests/upgrades/version_upgrades.rs b/rust/lit-node/lit-node/tests/upgrades/version_upgrades.rs index afc08e6a..bbbca46d 100644 --- a/rust/lit-node/lit-node/tests/upgrades/version_upgrades.rs +++ b/rust/lit-node/lit-node/tests/upgrades/version_upgrades.rs @@ -1,19 +1,17 @@ use lit_node_testnet::{ + TestSetupBuilder, node_collection::get_node_versions, testnet::{ NodeAccount, Testnet, - contracts::StakingContractRealmConfig, contracts_repo::{ self, WalletManifestItem, alias_node_configs_path, get_alias_manifest_template, - latest_wallet_manifest, save_alias_manifest, + latest_wallet_manifest, node_configs_path, save_alias_manifest, }, }, - validator::ValidatorCollection, }; use crate::common::{ assertions::NetworkIntegrityChecker, - get_default_keyset_configs, init_test_config, version::{get_crate_version, update_node_crate_version}, }; @@ -29,52 +27,26 @@ use std::{fs, time::Duration}; use test_case::test_case; use tracing::info; -fn setup() { - setup_logging(); -} - /// Tests when an inactive validator that comes online with an invalid version, and then the staker requests to join, /// that the node should eventually be kicked for non-participation. #[tokio::test] async fn node_boot_invalid_version() { - setup(); - + crate::common::setup_logging(); info!("TEST: node_boot_invalid_version"); - - // Set up a network with 6 nodes. - let num_nodes = 6; // set epoch length to 30 mins so it never elapses unless we advance the clock - let epoch_length = 1800; - let mut testnet = Testnet::builder() - .num_staked_and_joined_validators(num_nodes) - .num_staked_only_validators(1) - .build() - .await; - let testnet_contracts = Testnet::setup_contracts( - &mut testnet, - None, - Some( - StakingContractRealmConfig::builder() - .epoch_length(U256::from(epoch_length)) - .max_presign_count(U256::from(0)) - .min_presign_count(U256::from(0)) - .build(), - ), - ) - .await - .expect("Failed to setup contracts"); - - let actions = testnet.actions(testnet_contracts.contracts()); - - let mut validator_collection = ValidatorCollection::builder() - .num_staked_nodes(num_nodes) - .keyset_configs(get_default_keyset_configs()) - .build(&testnet, &actions) - .await - .expect("Failed to build validator collection"); + let (testnet, mut validator_collection, end_user) = TestSetupBuilder::default().build().await; - let network_checker = NetworkIntegrityChecker::new(&actions).await; + let realm_id = U256::from(1); + let epoch_length = testnet + .actions() + .get_epoch_length(realm_id) + .await + .unwrap() + .as_u64() as usize; + let num_nodes = validator_collection.validator_count(); + let actions = testnet.actions(); + let network_checker = NetworkIntegrityChecker::new(&end_user, &actions).await; // Upgrade the node crate to a new version let _crate_version_handle = update_node_crate_version("2.9999.9999".to_string()); @@ -107,7 +79,7 @@ async fn node_boot_invalid_version() { let validator_to_kick = validator_collection .add_one( false, - Some(lit_node_testnet::validator::BuildMode::UseNewBuild), + Some(lit_node_testnet::validator::BuildMode::UseNewOrCachedBuild), None, ) .await @@ -121,14 +93,10 @@ async fn node_boot_invalid_version() { ); actions.increase_blockchain_timestamp(epoch_length).await; - let epoch_number = - actions - .get_current_epoch(realm_id) - .await; - + let epoch_number = actions.get_current_epoch(realm_id).await; + // Wait for kick - let voting_status = - actions + let voting_status = actions .wait_for_voting_status_to_kick_validator( realm_id, epoch_number, @@ -150,51 +118,27 @@ async fn node_boot_invalid_version() { actions.get_current_validator_count(realm_id).await as usize, num_nodes ); - network_checker.check(&validator_collection).await; + network_checker.check(&validator_collection, &vec![]).await; } /// Tests the version requirement change such that an active validator is running a node version that is incompatible, /// so it should request to leave. #[tokio::test] async fn active_validator_invalid_version() { - setup(); - + crate::common::setup_logging(); info!("TEST: active_validator_invalid_version"); - // Set up a network with 6 nodes. let num_nodes = 6; // set epoch length to 30 mins so it never elapses unless we advance the clock let epoch_length = 1800; - let mut testnet = Testnet::builder() + + let (testnet, mut validator_collection, end_user) = TestSetupBuilder::default() .num_staked_and_joined_validators(num_nodes) - .num_staked_only_validators(1) .build() .await; - let testnet_contracts = Testnet::setup_contracts( - &mut testnet, - None, - Some( - StakingContractRealmConfig::builder() - .epoch_length(U256::from(epoch_length)) - .max_presign_count(U256::from(0)) - .min_presign_count(U256::from(0)) - .build(), - ), - ) - .await - .expect("Failed to setup contracts"); - - let actions = testnet.actions(testnet_contracts.contracts()); - - let mut validator_collection = ValidatorCollection::builder() - .num_staked_nodes(num_nodes) - .keyset_configs(get_default_keyset_configs()) - .build(&testnet, &actions) - .await - .expect("Failed to build validator collection"); - - let network_checker = NetworkIntegrityChecker::new(&actions).await; + let actions = testnet.actions(); + let network_checker = NetworkIntegrityChecker::new(&end_user, &actions).await; // Upgrade the node crate to a new version let _crate_version_handle = update_node_crate_version("2.9999.9999".to_string()); @@ -204,7 +148,7 @@ async fn active_validator_invalid_version() { let new_validator = validator_collection .add_one( false, - Some(lit_node_testnet::validator::BuildMode::UseNewBuild), + Some(lit_node_testnet::validator::BuildMode::UseNewOrCachedBuild), None, ) .await @@ -228,7 +172,7 @@ async fn active_validator_invalid_version() { actions.get_current_validator_count(realm_id).await as usize, num_nodes + 1 ); - network_checker.check(&validator_collection).await; + network_checker.check(&validator_collection, &vec![]).await; // Update version requirements by setting a max version requirement, rendering the new node version invalid. let max_version = "2.9999.9998"; @@ -254,7 +198,7 @@ async fn active_validator_invalid_version() { actions.get_current_validator_count(realm_id).await as usize, num_nodes ); - network_checker.check(&validator_collection).await; + network_checker.check(&validator_collection, &vec![]).await; // Check that the new node is no longer a validator. let active_validators = actions.get_current_validators(realm_id).await; @@ -266,24 +210,20 @@ async fn active_validator_invalid_version() { /// 1. Run the `build_target_branches` script in the `scripts` directory. (x86 and arm64 builds) /// 2. Run the `download_builds` script in the `scripts` directory. (x86 builds only) /// The test will fail if the builds are not found. -#[test_case("origin/release-habanero-*"; "Upgrade against the latest Habanero release branch")] -#[test_case("origin/release-manzano-*"; "Upgrade against the latest Manzano release branch")] -#[test_case("origin/release-cayenne-*"; "Upgrade against the latest Cayenne release branch")] +#[test_case("origin/release-naga-prod-2025-11-25"; "Upgrade against the latest NAGA-Prod release branch")] #[tokio::test] async fn test_version_upgrade_against_old_version(target_branch: &str) { - setup(); + crate::common::setup_logging(); - info!( - "TEST: test_version_upgrade_against_old_version against {}", - target_branch - ); + info!("TEST: Upgrade against branch: {}", target_branch); // Get the commit hash that we want the build for. let old_build_commit_hash = utils::get_target_branch_commit_hash(target_branch).expect("Failed to get commit hash"); + info!("Old build commit hash: {}", old_build_commit_hash); // First check if we have the build. - let old_build_path = format!("./target/debug/lit_node_{}", old_build_commit_hash); + let old_build_path = format!("./target/test-run/debug/lit_node_{}", old_build_commit_hash); assert!( fs::metadata(&old_build_path).is_ok(), "Build does not exist at {}", @@ -292,53 +232,24 @@ async fn test_version_upgrade_against_old_version(target_branch: &str) { // Set up a network of nodes running the old build. + info!("TEST: test_version_upgrade_against_old_version"); + // Set up a network with 6 nodes. // set epoch length to 30 mins so it never elapses unless we advance the clock let epoch_length = 1800; - // Start a new node collection and wait for the DKG to complete - // and root keys to be voted for. - let num_nodes = 5; - let mut testnet = Testnet::builder() - .num_staked_and_joined_validators(num_nodes) + let (testnet, mut validator_collection, end_user) = TestSetupBuilder::default() + .custom_binary_path(Some(old_build_path)) .force_deploy(true) .build() .await; - let testnet_contracts = Testnet::setup_contracts( - &mut testnet, - None, - Some( - StakingContractRealmConfig::builder() - .epoch_length(U256::from(epoch_length)) - .min_presign_count(U256::from(0)) - .max_presign_count(U256::from(0)) - .max_presign_concurrency(U256::from(0)) - .realm_id(U256::from(1)) - .build(), - ), - ) - .await - .expect("Failed to setup contracts"); - - let actions = testnet.actions(testnet_contracts.contracts()); - - let mut validator_collection = ValidatorCollection::builder() - .num_staked_nodes(num_nodes) - .custom_binary_path(Some(old_build_path)) - .keyset_configs(get_default_keyset_configs()) - .build(&testnet, &actions) - .await - .expect("Failed to build validator collection"); - + let num_nodes = validator_collection.validator_count(); + let actions = testnet.actions(); let realm_id = U256::from(1); - let starting_epoch = validator_collection - .actions() - .get_current_epoch(realm_id) - .await; + let starting_epoch = actions.get_current_epoch(realm_id).await; let mut next_epoch = starting_epoch + 1; // Keep track of the node versions. - let complete_node_set = &validator_collection.complete_node_set(); let initial_node_versions = get_node_versions(&complete_node_set).await; info!("Initial node versions: {:?}", initial_node_versions); @@ -349,10 +260,8 @@ async fn test_version_upgrade_against_old_version(target_branch: &str) { .all(|v| v == &initial_node_versions[0]) ); - let network_checker = NetworkIntegrityChecker::new(validator_collection.actions()).await; - network_checker - .check_with_drained_presigns(&validator_collection) - .await; + let network_checker = NetworkIntegrityChecker::new(&end_user, &actions).await; + network_checker.check(&validator_collection, &vec![]).await; // First, we shuffle the order of the original staker wallets that we will be gradually adding aliases for. let mut wallet_manifest_wallets = latest_wallet_manifest(false); @@ -377,7 +286,7 @@ async fn test_version_upgrade_against_old_version(target_branch: &str) { false, alias_node_config_path, &get_latest_alias_node_account(0, &testnet), - Some(lit_node_testnet::validator::BuildMode::UseNewBuild), + Some(lit_node_testnet::validator::BuildMode::UseNewOrCachedBuild), 1 ) .await @@ -476,12 +385,149 @@ async fn test_version_upgrade_against_old_version(target_branch: &str) { } } +/// This test assumes that you have the lit_node builds for the target branches. +/// During local development, there are two ways to get the builds: +/// 1. Run the `build_target_branches` script in the `scripts` directory. (x86 and arm64 builds) +/// 2. Run the `download_builds` script in the `scripts` directory. (x86 builds only) +/// The test will fail if the builds are not found. +#[test_case("origin/release-naga-prod-2025-11-25"; "Upgrade against the latest NAGA-Prod release branch")] +#[tokio::test] +async fn test_version_upgrade_against_old_version_with_new_stakers(target_branch: &str) { + crate::common::setup_logging(); + + info!("TEST: Upgrade against (new): {}", target_branch); + + // Get the commit hash that we want the build for. + let old_build_commit_hash = + utils::get_target_branch_commit_hash(target_branch).expect("Failed to get commit hash"); + + info!("Old build commit hash: {}", old_build_commit_hash); + // First check if we have the build. + let old_build_path = format!("./target/test-run/debug/lit_node_{}", old_build_commit_hash); + assert!( + fs::metadata(&old_build_path).is_ok(), + "Build does not exist at {}", + old_build_path + ); + + let num_nodes = 5; + // Set up a network of nodes running the old build. + + info!("TEST: test_version_upgrade_against_old_version"); + // Set up a network with 6 nodes. + // set epoch length to 30 mins so it never elapses unless we advance the clock + let epoch_length = 1800; + + let (testnet, mut validator_collection, end_user) = TestSetupBuilder::default() + .custom_binary_path(Some(old_build_path)) + // .force_deploy(true) // make sure all the initial chain data comes from the old build. + .num_staked_and_joined_validators(num_nodes) + .num_staked_only_validators(num_nodes) + .start_staked_only_validators(false) + .build() + .await; + + let num_nodes = validator_collection.validator_count(); + let actions = testnet.actions(); + let realm_id = U256::from(1); + let starting_epoch = actions.get_current_epoch(realm_id).await; + let mut next_epoch = starting_epoch + 1; + + let current_crate_version = get_crate_version(); + + // Keep track of the node versions. + let complete_node_set = &validator_collection.complete_node_set(); + let initial_node_versions = get_node_versions(&complete_node_set).await; + info!("Initial node versions: {:?}", initial_node_versions); + // Assert all node versions are the same. + assert!( + initial_node_versions + .iter() + .all(|v| v == &initial_node_versions[0]) + ); + + let network_checker = NetworkIntegrityChecker::new(&end_user, &actions).await; + network_checker.check(&validator_collection, &vec![]).await; + + // Keep dealing in new node versions and dealing out old node versions until the entire network is upgraded. + for upgrade_round in 0..num_nodes { + let validator = validator_collection.get_validator_by_idx(upgrade_round); + info!( + "Requesting to leave the network for staker {:?}", + validator.account().staker_address + ); + assert!(validator.request_to_leave(&actions).await.is_ok()); + + info!("Upgrading node {} to the new build", upgrade_round); + + let node_account = &testnet.node_accounts[upgrade_round + num_nodes]; + let validator_idx = upgrade_round + num_nodes; + let node_config_file_path = + format!("{}/lit_config{:?}.toml", node_configs_path(), validator_idx); + + assert!( + validator_collection + .add_one_custom( + false, + node_config_file_path, + node_account, + Some(lit_node_testnet::validator::BuildMode::UseNewOrCachedBuild), + 1 + ) + .await + .is_ok() + ); + + // Fast forward time to allow nodes to start a DKG to advance to the next epoch. + actions.increase_blockchain_timestamp(epoch_length).await; + + // After next epoch arrives, run interpolation and decryption tests. + actions.wait_for_epoch(realm_id, next_epoch).await; + next_epoch += U256::from(1); + + actions.sleep_millis(2000).await; // FIXME : let the nodes all acknowledge the epoch, then run the tests. This should be removed once signing across epochs works. + + // Run network checks. + network_checker.check(&validator_collection, &vec![]).await; + + // Assert node versions. + let active_node_set = validator_collection + .active_node_set() + .await + .expect("Failed to get active node set"); + let mut node_versions = get_node_versions(&active_node_set).await; + // Sort the node versions to make it easier to compare. + node_versions.sort(); + info!( + "node versions ({:?}) {:?} and initial node versions {:?}", + node_versions.len(), + node_versions, + initial_node_versions + ); + assert_eq!(node_versions.len(), num_nodes); + + let initial_crate_count = node_versions + .iter() + .filter(|v| *v == &initial_node_versions[0]) + .count(); + let current_crate_count = node_versions + .iter() + .filter(|v| *v == ¤t_crate_version) + .count(); + assert_eq!(current_crate_count, upgrade_round + 1); + assert_eq!(initial_crate_count, num_nodes - upgrade_round - 1); + } +} + fn get_latest_alias_node_account(idx: usize, testnet: &Testnet) -> NodeAccount { let latest_alias_wallet_manifest = latest_wallet_manifest(true); - let mut provider = ENDPOINT_MANAGER + let provider = ENDPOINT_MANAGER .get_provider(testnet.chain_name.clone()) .expect("Failed to get provider"); - provider.set_interval(Duration::new(0, 10)); + + let mut provider_mut = provider.as_ref().clone(); + provider_mut.set_interval(Duration::new(0, 10)); + let provider = std::sync::Arc::new(provider_mut); latest_alias_wallet_manifest[idx].map_to_node_account(provider, testnet.chain_id) } diff --git a/rust/lit-node/lit-sdk/Cargo.toml b/rust/lit-node/lit-sdk/Cargo.toml index ba0a5a83..271ca2d4 100644 --- a/rust/lit-node/lit-sdk/Cargo.toml +++ b/rust/lit-node/lit-sdk/Cargo.toml @@ -9,14 +9,13 @@ cait-sith = [] [dependencies] chrono = "0.4" -data-encoding.workspace = true ecdsa = { version = "0.16", features = ["arithmetic", "serde"] } elliptic-curve-tools = "0.1.2" futures = "0.3" hex = { version = "0.4", features = ["serde"] } ipfs-hasher = "0.13" lit-node-core = { path = "../lit-node-core" } -lit-frost = { git = "https://github.com/LIT-Protocol/lit-frost.git" } +lit-frost.workspace = true rand = "0.8" reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "stream"] } serde = "1.0" diff --git a/rust/lit-node/lit-sdk/src/cait_sith.rs b/rust/lit-node/lit-sdk/src/cait_sith.rs index f67eb3dd..2ffec18b 100644 --- a/rust/lit-node/lit-sdk/src/cait_sith.rs +++ b/rust/lit-node/lit-sdk/src/cait_sith.rs @@ -6,6 +6,7 @@ use ecdsa::{ RecoveryId, elliptic_curve::{Group, scalar::IsHigh, subtle::ConditionallyNegatable}, }; +use lit_frost::k256; use serde::Deserialize; /// Cait-Sith shares diff --git a/rust/lit-node/lit-sdk/src/encryption.rs b/rust/lit-node/lit-sdk/src/encryption.rs index a62a910c..c68e79a7 100644 --- a/rust/lit-node/lit-sdk/src/encryption.rs +++ b/rust/lit-node/lit-sdk/src/encryption.rs @@ -2,7 +2,7 @@ use crate::{EncryptedMulticastRequest, EndpointRequest, Response, SdkError, SdkResult, UrlPrefix}; use lit_node_core::{ - blsful::{ + lit_rust_crypto::blsful::{ Bls12381G2Impl, PublicKey, Signature, SignatureSchemes, SignatureShare, TimeCryptCiphertext, }, request::EncryptionSignRequest as InnerEncryptionSignRequest, diff --git a/rust/lit-node/lit-sdk/src/error.rs b/rust/lit-node/lit-sdk/src/error.rs index e7141c2d..f7184a87 100644 --- a/rust/lit-node/lit-sdk/src/error.rs +++ b/rust/lit-node/lit-sdk/src/error.rs @@ -24,7 +24,7 @@ pub enum SdkError { EcdsaSignature(#[from] ecdsa::signature::Error), /// Bls errors from the blsful crate #[error("Bls error: {0}")] - Bls(#[from] lit_node_core::blsful::BlsError), + Bls(#[from] lit_node_core::lit_rust_crypto::blsful::BlsError), /// Errors from string parsing #[error("String parse error: {0}")] Parse(String), diff --git a/rust/lit-node/lit-sdk/src/handshake.rs b/rust/lit-node/lit-sdk/src/handshake.rs index d0b5c3f3..caa79a2b 100644 --- a/rust/lit-node/lit-sdk/src/handshake.rs +++ b/rust/lit-node/lit-sdk/src/handshake.rs @@ -2,26 +2,23 @@ use crate::common::{Request, Response, UrlPrefix}; use crate::{SdkError, SdkResult}; use lit_node_core::{ NodeSet, - request::JsonSDKHandshakeRequest, - response::{GenericResponse, JsonSDKHandshakeResponse}, + request::SDKHandshakeRequest, + response::{GenericResponse, SDKHandshakeResponseV0}, }; use std::{collections::HashMap, marker::PhantomData}; use uuid::Uuid; /// The handshake request struct -pub type HandshakeRequest = Request< - HandshakeRequestBuilder, - JsonSDKHandshakeRequest, - GenericResponse, ->; +pub type HandshakeRequest = + Request>; /// The response type for handshake calls -pub type HandshakeResponse = Response>; +pub type HandshakeResponse = Response>; basic_builder!( HandshakeRequestBuilder, - JsonSDKHandshakeRequest, - GenericResponse, + SDKHandshakeRequest, + GenericResponse, "web/handshake" ); @@ -30,14 +27,14 @@ impl HandshakeRequestBuilder { client_public_key, client_public_key, String, - JsonSDKHandshakeRequest, + SDKHandshakeRequest, client_public_key ); builder_setter!( challenge, challenge, Option, - JsonSDKHandshakeRequest, + SDKHandshakeRequest, challenge ); @@ -50,10 +47,10 @@ impl HandshakeRequestBuilder { )); } - if let Some(challenge) = &request.challenge { - if challenge.is_empty() { - return Err(SdkError::Build("No challenge is specified".to_string())); - } + if let Some(challenge) = &request.challenge + && challenge.is_empty() + { + return Err(SdkError::Build("No challenge is specified".to_string())); } } Ok(()) @@ -82,7 +79,7 @@ mod tests { #[test] fn set_request() { let request = HandshakeRequest::new() - .request(JsonSDKHandshakeRequest { + .request(SDKHandshakeRequest { challenge: None, client_public_key: "blah".to_string(), }) diff --git a/rust/lit-node/lit-sdk/src/signature.rs b/rust/lit-node/lit-sdk/src/signature.rs index decb38e5..4bac5b1b 100644 --- a/rust/lit-node/lit-sdk/src/signature.rs +++ b/rust/lit-node/lit-sdk/src/signature.rs @@ -10,19 +10,20 @@ use elliptic_curve_tools::{group, prime_field}; use lit_node_core::{ CompressedBytes, CompressedHex, CurveType, EcdsaSignedMessageShare, KeyFormatPreference, PeerId, SignableOutput, SigningAlgorithm, SigningScheme, - blsful::{self, Bls12381G2Impl, PublicKey, Signature}, - hd_keys_curves_wasm::{ - HDDerivable, HDDeriver, + hd_keys_curves_wasm::{HDDerivable, HDDeriver}, + lit_rust_crypto::{ + blsful::{self, Bls12381G2Impl, PublicKey, Signature}, + decaf377, ed448_goldilocks, elliptic_curve::{ self, Curve, CurveArithmetic, Field, FieldBytesSize, PrimeCurve, ScalarPrimitive, generic_array::ArrayLength, - group::GroupEncoding, ops::Reduce, pkcs8::AssociatedOid, point::{AffineCoordinates, DecompressPoint, PointCompression}, sec1::{FromEncodedPoint, ModulusSize, ToEncodedPoint}, }, - k256, p256, p384, + group::GroupEncoding, + jubjub, k256, p256, p384, pallas, vsss_rs, }, }; @@ -165,7 +166,7 @@ pub fn combine_and_verify_signature_shares( serde_json::from_str(&bls_msg_share.signature_share)?; let verifying_share: blsful::PublicKeyShare = serde_json::from_str(&bls_msg_share.verifying_share)?; - let public_key: blsful::PublicKey = + let public_key: PublicKey = serde_json::from_str(&bls_msg_share.public_key)?; let message = hex::decode(&bls_msg_share.message)?; bls_signing_package.push(( @@ -247,7 +248,7 @@ pub fn combine_and_verify_signature_shares( &verifying_shares, &first_entry.3, ); - if res.is_err() { + return if res.is_err() { let e = res.expect_err("frost signature from shares is invalid"); match e { lit_frost::Error::Cheaters(cheaters) => { @@ -261,25 +262,23 @@ pub fn combine_and_verify_signature_shares( cheater_peer_ids.push(peer_id); } } - return Err(SdkError::SignatureCombine(format!( + Err(SdkError::SignatureCombine(format!( "frost signature from shares is invalid. Invalid share peer ids: {}", cheater_peer_ids.join(", ") - ))); - } - _ => { - return Err(SdkError::SignatureCombine(e.to_string())); + ))) } + _ => Err(SdkError::SignatureCombine(e.to_string())), } } else { - return Ok(SignedDataOutput { + Ok(SignedDataOutput { signature: serde_json::to_string( &res.expect("frost signature from shares is valid"), )?, verifying_key: serde_json::to_string(&first_entry.3)?, signed_data: hex::encode(&first_entry.6), recovery_id: None, - }); - } + }) + }; } if bls_signing_package.len() > 1 { let first_entry = &bls_signing_package[0]; @@ -305,7 +304,7 @@ pub fn combine_and_verify_signature_shares( verifying_shares.push((entry.0, entry.5.clone(), entry.2)); } let public_key = first_entry.3; - let signature = blsful::Signature::::from_shares(&signature_shares) + let signature = Signature::::from_shares(&signature_shares) .expect("bls signature from shares"); if signature.verify(&public_key, &first_entry.4).is_err() { // Identify which shares are invalid @@ -427,6 +426,7 @@ pub fn verify_signature( | SigningScheme::SchnorrK256Taproot | SigningScheme::SchnorrEd448Shake256 | SigningScheme::SchnorrRedJubjubBlake2b512 + | SigningScheme::SchnorrRedPallasBlake2b512 | SigningScheme::SchnorrRedDecaf377Blake2b512 | SigningScheme::SchnorrkelSubstrate => { let scheme = signing_scheme_to_frost_scheme(signing_scheme)?; @@ -467,6 +467,7 @@ pub fn signing_scheme_to_frost_scheme(value: SigningScheme) -> SdkResult Ok(lit_frost::Scheme::Ristretto25519Sha512), SigningScheme::SchnorrEd448Shake256 => Ok(lit_frost::Scheme::Ed448Shake256), SigningScheme::SchnorrRedJubjubBlake2b512 => Ok(lit_frost::Scheme::RedJubjubBlake2b512), + SigningScheme::SchnorrRedPallasBlake2b512 => Ok(lit_frost::Scheme::RedPallasBlake2b512), SigningScheme::SchnorrK256Taproot => Ok(lit_frost::Scheme::K256Taproot), SigningScheme::SchnorrRedDecaf377Blake2b512 => Ok(lit_frost::Scheme::RedDecaf377Blake2b512), SigningScheme::SchnorrkelSubstrate => Ok(lit_frost::Scheme::SchnorrkelSubstrate), @@ -530,25 +531,28 @@ pub fn get_derived_public_key( CurveType::P384 => { derive_public_key::(signing_scheme, key_id, root_keys) } - CurveType::Ed25519 => { - derive_public_key::( - signing_scheme, - key_id, - root_keys, - ) + CurveType::Ed25519 => derive_public_key::( + signing_scheme, + key_id, + root_keys, + ), + CurveType::Ristretto25519 => derive_public_key::( + signing_scheme, + key_id, + root_keys, + ), + CurveType::Ed448 => { + derive_public_key::(signing_scheme, key_id, root_keys) + } + CurveType::RedJubjub => { + derive_public_key::(signing_scheme, key_id, root_keys) + } + CurveType::RedPallas => { + derive_public_key::(signing_scheme, key_id, root_keys) + } + CurveType::RedDecaf377 => { + derive_public_key::(signing_scheme, key_id, root_keys) } - CurveType::Ristretto25519 => derive_public_key::< - lit_node_core::vsss_rs::curve25519::WrappedRistretto, - >(signing_scheme, key_id, root_keys), - CurveType::Ed448 => derive_public_key::< - lit_node_core::hd_keys_curves_wasm::ed448_goldilocks_plus::EdwardsPoint, - >(signing_scheme, key_id, root_keys), - CurveType::RedJubjub => derive_public_key::< - lit_node_core::hd_keys_curves_wasm::jubjub::SubgroupPoint, - >(signing_scheme, key_id, root_keys), - CurveType::RedDecaf377 => derive_public_key::< - lit_node_core::hd_keys_curves_wasm::decaf377::Element, - >(signing_scheme, key_id, root_keys), } } diff --git a/rust/lit-node/rust-toolchain.toml b/rust/lit-node/rust-toolchain.toml index c8969b51..657737a9 100644 --- a/rust/lit-node/rust-toolchain.toml +++ b/rust/lit-node/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.86" +channel = "1.91" components = ['rustfmt', 'rust-src', 'clippy'] diff --git a/rust/lit-os/Cargo.lock b/rust/lit-os/Cargo.lock index 65075ec5..95efc0aa 100644 --- a/rust/lit-os/Cargo.lock +++ b/rust/lit-os/Cargo.lock @@ -2223,28 +2223,16 @@ dependencies = [ "typenum", ] -[[package]] -name = "bitvec" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" -dependencies = [ - "funty 1.1.0", - "radium 0.6.2", - "tap", - "wyz 0.2.0", -] - [[package]] name = "bitvec" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ - "funty 2.0.0", - "radium 0.7.0", + "funty", + "radium", "tap", - "wyz 0.5.1", + "wyz", ] [[package]] @@ -2596,7 +2584,7 @@ checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" [[package]] name = "bulletproofs" version = "4.0.0" -source = "git+https://github.com/LIT-Protocol/bulletproofs?rev=ddf11c2f593e71f24c9a3d64c56f62d82f2b5099#ddf11c2f593e71f24c9a3d64c56f62d82f2b5099" +source = "git+https://github.com/LIT-Protocol/bulletproofs?branch=pallas#c355d31902966f394e9e34e7ddf9201413077a2a" dependencies = [ "blake2", "bls12_381_plus", @@ -2604,7 +2592,7 @@ dependencies = [ "byteorder", "curve25519-dalek-ml", "data-encoding", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", + "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377.git?rev=b2f76eda2e56bbaa818196d7c2d795312bbfbd92)", "digest 0.10.7", "ed448-goldilocks-plus", "elliptic-curve 0.13.8", @@ -2615,6 +2603,7 @@ dependencies = [ "merlin", "p256", "p384 0.13.1", + "pasta_curves 0.5.1 (git+https://github.com/LIT-Protocol/pasta_curves)", "rand 0.8.5", "rand_core 0.6.4", "serde", @@ -3243,7 +3232,7 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ - "bitvec 1.0.1", + "bitvec", "coins-bip32", "hmac 0.12.1", "once_cell", @@ -4252,7 +4241,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn 2.0.106", + "syn 1.0.109", ] [[package]] @@ -4308,7 +4297,7 @@ dependencies = [ [[package]] name = "decaf377" version = "0.10.1" -source = "git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5#1c5755b2b90e1969d47ce89cf2d35078984a0ee5" +source = "git+https://github.com/LIT-Protocol/decaf377.git?rev=b2f76eda2e56bbaa818196d7c2d795312bbfbd92#b2f76eda2e56bbaa818196d7c2d795312bbfbd92" dependencies = [ "ark-bls12-377", "ark-ec", @@ -4319,7 +4308,7 @@ dependencies = [ "blake2", "cfg-if", "elliptic-curve 0.13.8", - "frost-dkg", + "frost-dkg 0.5.1", "gennaro-dkg", "hashbrown 0.15.5", "hex", @@ -4334,7 +4323,7 @@ dependencies = [ [[package]] name = "decaf377" version = "0.10.1" -source = "git+https://github.com/LIT-Protocol/decaf377.git#1c5755b2b90e1969d47ce89cf2d35078984a0ee5" +source = "git+https://github.com/LIT-Protocol/decaf377#1c5755b2b90e1969d47ce89cf2d35078984a0ee5" dependencies = [ "ark-bls12-377", "ark-ec", @@ -4345,7 +4334,7 @@ dependencies = [ "blake2", "cfg-if", "elliptic-curve 0.13.8", - "frost-dkg", + "frost-dkg 0.3.3", "gennaro-dkg", "hashbrown 0.15.5", "hex", @@ -4374,6 +4363,32 @@ dependencies = [ "zeroize", ] +[[package]] +name = "decaf377_plus" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "209f730dfc5f9d877c7549bebc93ea0ef4fe2915b4dbf5ffebc11e8b4c17c740" +dependencies = [ + "ark-bls12-377", + "ark-ec", + "ark-ed-on-bls12-377", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "blake2", + "cfg-if", + "elliptic-curve 0.13.8", + "frost-dkg 0.5.1", + "hashbrown 0.15.5", + "hex", + "num-bigint", + "once_cell", + "rand_core 0.6.4", + "serdect 0.3.0", + "subtle", + "zeroize", +] + [[package]] name = "default-env" version = "0.1.1" @@ -6522,28 +6537,13 @@ dependencies = [ "uuid 0.8.2", ] -[[package]] -name = "ethabi" -version = "16.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c98847055d934070b90e806e12d3936b787d0a115068981c1d8dfd5dfef5a5" -dependencies = [ - "ethereum-types 0.12.1", - "hex", - "serde", - "serde_json", - "sha3 0.9.1", - "thiserror 1.0.69", - "uint", -] - [[package]] name = "ethabi" version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ - "ethereum-types 0.14.1", + "ethereum-types", "hex", "once_cell", "regex", @@ -6554,19 +6554,6 @@ dependencies = [ "uint", ] -[[package]] -name = "ethbloom" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb684ac8fa8f6c5759f788862bb22ec6fe3cb392f6bfd08e3c64b603661e3f8" -dependencies = [ - "crunchy", - "fixed-hash 0.7.0", - "impl-rlp", - "impl-serde 0.3.2", - "tiny-keccak", -] - [[package]] name = "ethbloom" version = "0.13.0" @@ -6574,40 +6561,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" dependencies = [ "crunchy", - "fixed-hash 0.8.0", - "impl-codec 0.6.0", + "fixed-hash", + "impl-codec", "impl-rlp", - "impl-serde 0.4.0", + "impl-serde", "scale-info", "tiny-keccak", ] -[[package]] -name = "ethereum-types" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05136f7057fe789f06e6d41d07b34e6f70d8c86e5693b60f97aaa6553553bdaf" -dependencies = [ - "ethbloom 0.11.1", - "fixed-hash 0.7.0", - "impl-rlp", - "impl-serde 0.3.2", - "primitive-types 0.10.1", - "uint", -] - [[package]] name = "ethereum-types" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" dependencies = [ - "ethbloom 0.13.0", - "fixed-hash 0.8.0", - "impl-codec 0.6.0", + "ethbloom", + "fixed-hash", + "impl-codec", "impl-rlp", - "impl-serde 0.4.0", - "primitive-types 0.12.2", + "impl-serde", + "primitive-types", "scale-info", "uint", ] @@ -6711,7 +6684,7 @@ dependencies = [ "chrono", "const-hex", "elliptic-curve 0.13.8", - "ethabi 18.0.0", + "ethabi", "generic-array 0.14.7", "k256 0.13.4", "num_enum 0.7.4", @@ -7037,7 +7010,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "bitvec 1.0.1", + "bitvec", "rand_core 0.6.4", "subtle", ] @@ -7089,18 +7062,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - [[package]] name = "fixed-hash" version = "0.8.0" @@ -7244,8 +7205,8 @@ dependencies = [ [[package]] name = "frost-core" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#8743632bdd1f4af1bbf7a8cd27276f02182c3289" dependencies = [ "byteorder", "const-crc32-nostd", @@ -7267,12 +7228,12 @@ dependencies = [ [[package]] name = "frost-decaf377" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#8743632bdd1f4af1bbf7a8cd27276f02182c3289" dependencies = [ "ark-serialize 0.4.2", "blake2b_simd 1.0.3", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377.git)", + "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377)", "document-features", "frost-core", "frost-rerandomized", @@ -7287,6 +7248,22 @@ name = "frost-dkg" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8176b54a998a04796e58b0ac3a6da08e5ab05aff5a7d92159619a652a29f63e8" +dependencies = [ + "elliptic-curve 0.13.8", + "elliptic-curve-tools", + "merlin", + "postcard", + "rand_core 0.6.4", + "serde", + "thiserror 2.0.16", + "vsss-rs 5.1.0", +] + +[[package]] +name = "frost-dkg" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b59a575727037fbc977a68a2ace822b4b37f8f0647769946e307dc966ecfbb" dependencies = [ "blake2", "blsful", @@ -7294,6 +7271,7 @@ dependencies = [ "ed448-goldilocks-plus", "elliptic-curve 0.13.8", "elliptic-curve-tools", + "hex", "jubjub-plus", "k256 0.13.4", "merlin", @@ -7310,8 +7288,8 @@ dependencies = [ [[package]] name = "frost-ed25519" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#8743632bdd1f4af1bbf7a8cd27276f02182c3289" dependencies = [ "curve25519-dalek-ml", "document-features", @@ -7323,8 +7301,8 @@ dependencies = [ [[package]] name = "frost-ed448" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#8743632bdd1f4af1bbf7a8cd27276f02182c3289" dependencies = [ "document-features", "ed448-goldilocks-plus", @@ -7336,8 +7314,8 @@ dependencies = [ [[package]] name = "frost-p256" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#8743632bdd1f4af1bbf7a8cd27276f02182c3289" dependencies = [ "document-features", "frost-core", @@ -7349,8 +7327,8 @@ dependencies = [ [[package]] name = "frost-p384" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#8743632bdd1f4af1bbf7a8cd27276f02182c3289" dependencies = [ "document-features", "frost-core", @@ -7362,8 +7340,8 @@ dependencies = [ [[package]] name = "frost-redjubjub" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#8743632bdd1f4af1bbf7a8cd27276f02182c3289" dependencies = [ "blake2b_simd 1.0.3", "document-features", @@ -7375,10 +7353,24 @@ dependencies = [ "sha2 0.10.9", ] +[[package]] +name = "frost-redpallas" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#8743632bdd1f4af1bbf7a8cd27276f02182c3289" +dependencies = [ + "blake2b_simd 1.0.3", + "document-features", + "frost-core", + "frost-rerandomized", + "group 0.13.0", + "pasta_curves 0.5.1 (git+https://github.com/LIT-Protocol/pasta_curves)", + "rand_core 0.6.4", +] + [[package]] name = "frost-rerandomized" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#8743632bdd1f4af1bbf7a8cd27276f02182c3289" dependencies = [ "derive-getters", "document-features", @@ -7389,8 +7381,8 @@ dependencies = [ [[package]] name = "frost-ristretto255" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#8743632bdd1f4af1bbf7a8cd27276f02182c3289" dependencies = [ "curve25519-dalek-ml", "document-features", @@ -7402,8 +7394,8 @@ dependencies = [ [[package]] name = "frost-schnorrkel25519" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#8743632bdd1f4af1bbf7a8cd27276f02182c3289" dependencies = [ "byte-strings", "curve25519-dalek-ml", @@ -7417,8 +7409,8 @@ dependencies = [ [[package]] name = "frost-secp256k1" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#8743632bdd1f4af1bbf7a8cd27276f02182c3289" dependencies = [ "document-features", "frost-core", @@ -7430,8 +7422,8 @@ dependencies = [ [[package]] name = "frost-taproot" -version = "2.1.0" -source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.1.0#272dd53869e7c82f7d5c72af73b5801e84c7b52e" +version = "2.2.0" +source = "git+https://github.com/LIT-Protocol/frost.git?branch=2.2.0#8743632bdd1f4af1bbf7a8cd27276f02182c3289" dependencies = [ "document-features", "frost-core", @@ -7499,12 +7491,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "funty" version = "2.0.0" @@ -8177,52 +8163,18 @@ dependencies = [ [[package]] name = "hd-keys-curves-wasm" -version = "1.0.3" -source = "git+https://github.com/LIT-Protocol/hd-keys-curves-wasm?rev=5e0dcc1a6d8d08f2328d4716dca806db87f93748#5e0dcc1a6d8d08f2328d4716dca806db87f93748" -dependencies = [ - "blake2", - "blsful", - "curve25519-dalek-ml", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", - "digest 0.10.7", - "ecdsa 0.16.9", - "ed448-goldilocks-plus", - "elliptic-curve 0.13.8", - "elliptic-curve-tools", - "getrandom 0.2.16", - "jubjub-plus", - "k256 0.13.4", - "p256", - "p384 0.13.1", - "sha2 0.10.9", - "sha3 0.10.8", - "subtle", - "vsss-rs 5.1.0", -] - -[[package]] -name = "hd-keys-curves-wasm" -version = "1.0.3" -source = "git+https://github.com/LIT-Protocol/hd-keys-curves-wasm#5e0dcc1a6d8d08f2328d4716dca806db87f93748" +version = "1.0.5" +source = "git+https://github.com/LIT-Protocol/hd-keys-curves-wasm.git?branch=pallas#597a14b9cf4bafd4c778f1053ca4bbad0b3d249b" dependencies = [ "blake2", - "blsful", - "curve25519-dalek-ml", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", "digest 0.10.7", "ecdsa 0.16.9", - "ed448-goldilocks-plus", - "elliptic-curve 0.13.8", "elliptic-curve-tools", "getrandom 0.2.16", - "jubjub-plus", - "k256 0.13.4", - "p256", - "p384 0.13.1", + "lit-rust-crypto", "sha2 0.10.9", "sha3 0.10.8", "subtle", - "vsss-rs 5.1.0", ] [[package]] @@ -9064,22 +9016,13 @@ dependencies = [ "zune-jpeg", ] -[[package]] -name = "impl-codec" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161ebdfec3c8e3b52bf61c4f3550a1eea4f9579d10dc1b936f3171ebdcd6c443" -dependencies = [ - "parity-scale-codec 2.3.1", -] - [[package]] name = "impl-codec" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec 3.7.5", + "parity-scale-codec", ] [[package]] @@ -9091,15 +9034,6 @@ dependencies = [ "rlp", ] -[[package]] -name = "impl-serde" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4551f042f3438e64dbd6226b20527fc84a6e1fe65688b58746a2f53623f25f5c" -dependencies = [ - "serde", -] - [[package]] name = "impl-serde" version = "0.4.0" @@ -9615,7 +9549,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8499f7a74008aafbecb2a2e608a3e13e4dd3e84df198b604451efe93f2de6e61" dependencies = [ - "bitvec 1.0.1", + "bitvec", "bls12_381", "ff 0.13.1", "group 0.13.0", @@ -9625,11 +9559,11 @@ dependencies = [ [[package]] name = "jubjub-plus" -version = "0.10.8" +version = "0.10.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2c5e88d1ac6a903e693287073860ea35299b200273d5c2bd9d7845ec39f319" +checksum = "e8cd4e5cd65bb1390238c9e2e7dc98078a7b146c9d0d080cf3a7b1ac0d2348ac" dependencies = [ - "bitvec 1.0.1", + "bitvec", "bls12_381_plus", "elliptic-curve 0.13.8", "ff 0.13.1", @@ -9674,6 +9608,7 @@ dependencies = [ "cfg-if", "ecdsa 0.16.9", "elliptic-curve 0.13.8", + "hex-literal", "once_cell", "serdect 0.2.0", "sha2 0.10.9", @@ -10112,7 +10047,7 @@ dependencies = [ "atty", "deno_core", "deno_error", - "ethabi 18.0.0", + "ethabi", "flume", "lazy_static", "lit-actions-grpc", @@ -10292,7 +10227,7 @@ dependencies = [ "moka 0.12.10", "once_cell", "reqwest 0.11.27", - "scc 2.4.0", + "scc 3.3.2", "serde", "serde_json", "serde_yaml 0.9.34+deprecated", @@ -10414,32 +10349,28 @@ version = "0.2.0" dependencies = [ "digest 0.10.7", "ecdsa 0.16.9", - "elliptic-curve 0.13.8", "elliptic-curve-tools", - "hd-keys-curves-wasm 1.0.3 (git+https://github.com/LIT-Protocol/hd-keys-curves-wasm?rev=5e0dcc1a6d8d08f2328d4716dca806db87f93748)", + "hd-keys-curves-wasm", "hex", "lit-poly", + "lit-rust-crypto", "rand 0.8.5", "serde", "sha2 0.10.9", "subtle", "thiserror 2.0.16", - "vsss-rs 5.1.0", "zeroize", ] [[package]] name = "lit-frost" -version = "0.3.0" -source = "git+https://github.com/LIT-Protocol/lit-frost.git#60ad81f1f637f7042bfee0fd8cc29cee74d754b1" +version = "0.4.0" +source = "git+https://github.com/LIT-Protocol/lit-frost.git?branch=pallas#38ecfb7d037138b16b1bac675e53fa4ab8e4d960" dependencies = [ "anyhow", "ark-serialize 0.4.2", - "curve25519-dalek-ml", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", "decaf377-rdsa", "ed25519-dalek 2.2.0", - "ed448-goldilocks-plus", "frost-core", "frost-decaf377", "frost-ed25519", @@ -10447,16 +10378,14 @@ dependencies = [ "frost-p256", "frost-p384", "frost-redjubjub", + "frost-redpallas", "frost-ristretto255", "frost-schnorrkel25519", "frost-secp256k1", "frost-taproot", "getrandom 0.2.16", "hex", - "jubjub-plus", - "k256 0.13.4", - "p256", - "p384 0.13.1", + "lit-rust-crypto", "rand_core 0.6.4", "reddsa", "schnorrkel", @@ -10465,7 +10394,6 @@ dependencies = [ "sha2 0.10.9", "subtle", "thiserror 2.0.16", - "vsss-rs 5.1.0", "zeroize", ] @@ -10546,7 +10474,7 @@ dependencies = [ "rand_chacha 0.3.1", "rand_core 0.6.4", "reqwest 0.11.27", - "sdd 3.0.10", + "sdd 4.2.4", "serde", "serde_json", "serdect 0.3.0", @@ -10563,23 +10491,15 @@ dependencies = [ name = "lit-node-core" version = "2.0.1" dependencies = [ - "blsful", - "curve25519-dalek-ml", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", "ed25519-dalek 2.2.0", - "ed448-goldilocks-plus", - "ethabi 16.0.0", + "ethabi", "ethers", - "hd-keys-curves-wasm 1.0.3 (git+https://github.com/LIT-Protocol/hd-keys-curves-wasm)", + "hd-keys-curves-wasm", "hex", - "jubjub-plus", - "k256 0.13.4", - "p256", - "p384 0.13.1", + "lit-rust-crypto", "serde", "serde_json", "thiserror 2.0.16", - "vsss-rs 5.1.0", ] [[package]] @@ -10859,32 +10779,25 @@ dependencies = [ [[package]] name = "lit-recovery" -version = "0.2.0" +version = "0.3.0" dependencies = [ "arc-swap", "argon2", - "blsful", "bulletproofs", "byteorder", "ciborium", "clap 4.5.46", "colored", "cryptex", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", "dirs 6.0.0", - "ed448-goldilocks-plus", - "elliptic-curve 0.13.8", "ethers", "generic-array 1.1.1", "glob", "hex", - "jubjub-plus", - "k256 0.13.4", "lit-blockchain", "lit-core", "lit-node-core", - "p256", - "p384 0.13.1", + "lit-rust-crypto", "path-clean 1.0.1", "rand 0.8.5", "reqwest 0.11.27", @@ -10900,16 +10813,34 @@ dependencies = [ "tiny-bip39 2.0.0", "tokio", "verifiable-share-encryption", - "vsss-rs 5.1.0", "winapi", ] +[[package]] +name = "lit-rust-crypto" +version = "0.6.0" +source = "git+https://github.com/LIT-Protocol/lit-rust-crypto?tag=0.6.0#9548fce521473f289ea1366249b782355e96507d" +dependencies = [ + "bls12_381_plus", + "blsful", + "blstrs_plus", + "curve25519-dalek-ml", + "decaf377_plus", + "ed448-goldilocks-plus", + "elliptic-curve 0.13.8", + "jubjub-plus", + "k256 0.13.4", + "p256", + "p384 0.13.1", + "pasta_curves_plus", + "vsss-rs 5.1.0", +] + [[package]] name = "lit-sdk" version = "2.0.1" dependencies = [ "chrono", - "data-encoding", "ecdsa 0.16.9", "elliptic-curve-tools", "futures", @@ -10935,26 +10866,18 @@ version = "0.2.0" dependencies = [ "blake2", "bulletproofs", - "curve25519-dalek-ml", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", - "ed448-goldilocks-plus", - "elliptic-curve 0.13.8", "elliptic-curve-tools", - "jubjub-plus", - "k256 0.13.4", - "p256", - "p384 0.13.1", + "lit-rust-crypto", "rfc6979 0.4.0", "serde", "sha2 0.10.9", "sha3 0.10.8", "thiserror 2.0.16", - "vsss-rs 5.1.0", ] [[package]] name = "lit_node" -version = "2.1.5" +version = "2.1.8" dependencies = [ "anyhow", "apalis", @@ -10964,40 +10887,30 @@ dependencies = [ "async-trait", "base64_light", "bech32 0.11.0", - "blsful", - "blstrs_plus", "bs58 0.5.1", "bulletproofs", - "cc", "chrono", "ciborium", "clap 4.5.46", - "curve25519-dalek-ml", "data-encoding", - "decaf377 0.10.1 (git+https://github.com/LIT-Protocol/decaf377?rev=1c5755b2b90e1969d47ce89cf2d35078984a0ee5)", "derive_builder 0.20.2", "derive_more 2.0.1", "digest 0.10.7", "dotenv", "ecdsa 0.16.9", "ed25519-dalek 2.2.0", - "ed448-goldilocks-plus", - "elliptic-curve 0.13.8", - "ethabi 16.0.0", + "ethabi", "ethers", "flume", - "frost-dkg", + "frost-dkg 0.5.1", "futures", "glob", - "hd-keys-curves-wasm 1.0.3 (git+https://github.com/LIT-Protocol/hd-keys-curves-wasm?rev=5e0dcc1a6d8d08f2328d4716dca806db87f93748)", "hex", "hex-literal", "indicatif 0.15.0", "ipfs-hasher", "iri-string 0.6.0", "jsonpath-plus", - "jubjub-plus", - "k256 0.13.4", "lazy_static", "libaes", "libsecp256k1 0.7.1", @@ -11015,8 +10928,10 @@ dependencies = [ "lit-node-core", "lit-observability", "lit-recovery", + "lit-rust-crypto", "lit-sdk", "lit-vrf", + "log", "moka 0.12.10", "mpl-token-metadata", "num_cpus", @@ -11024,8 +10939,6 @@ dependencies = [ "opentelemetry 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)", "opentelemetry-semantic-conventions 0.15.0", "opentelemetry_sdk 0.24.1", - "p256", - "p384 0.13.1", "postcard", "prost 0.13.5", "rand 0.8.5", @@ -11037,8 +10950,8 @@ dependencies = [ "rocket_cors", "rsa 0.7.0-pre", "rusqlite", - "scc 2.4.0", - "sdd 3.0.10", + "scc 3.3.2", + "sdd 4.2.4", "semver 1.0.26", "serde", "serde_bare", @@ -11066,7 +10979,6 @@ dependencies = [ "url", "verifiable-share-encryption", "visibility", - "vsss-rs 5.1.0", "web3", "webauthn-rs", "webauthn-rs-core", @@ -12268,7 +12180,7 @@ dependencies = [ "arrayvec 0.7.6", "auto_impl", "bytes", - "ethereum-types 0.14.1", + "ethereum-types", "open-fastrlp-derive", ] @@ -12772,20 +12684,6 @@ dependencies = [ "group 0.13.0", ] -[[package]] -name = "parity-scale-codec" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" -dependencies = [ - "arrayvec 0.7.6", - "bitvec 0.20.4", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive 2.3.1", - "serde", -] - [[package]] name = "parity-scale-codec" version = "3.7.5" @@ -12793,27 +12691,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" dependencies = [ "arrayvec 0.7.6", - "bitvec 1.0.1", + "bitvec", "byte-slice-cast", "const_format", "impl-trait-for-tuples", - "parity-scale-codec-derive 3.7.5", + "parity-scale-codec-derive", "rustversion", "serde", ] -[[package]] -name = "parity-scale-codec-derive" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1557010476e0595c9b568d16dcfb81b93cdeb157612726f5170d31aa707bed27" -dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro2 1.0.101", - "quote 1.0.40", - "syn 1.0.109", -] - [[package]] name = "parity-scale-codec-derive" version = "3.7.5" @@ -12904,6 +12790,45 @@ dependencies = [ "subtle", ] +[[package]] +name = "pasta_curves" +version = "0.5.1" +source = "git+https://github.com/LIT-Protocol/pasta_curves#2015f55d848e7f0a919bcf1d917ac46483849d81" +dependencies = [ + "blake2", + "blake2b_simd 1.0.3", + "elliptic-curve 0.13.8", + "ff 0.13.1", + "frost-dkg 0.5.1", + "group 0.13.0", + "hex", + "lazy_static", + "rand 0.8.5", + "serde", + "static_assertions", + "subtle", +] + +[[package]] +name = "pasta_curves_plus" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e265b7ebdbfc61a8c0eeac79350cf3225cd390325dc91dd0edede5b6742d58" +dependencies = [ + "blake2", + "blake2b_simd 1.0.3", + "elliptic-curve 0.13.8", + "ff 0.13.1", + "frost-dkg 0.5.1", + "group 0.13.0", + "hex", + "lazy_static", + "rand 0.8.5", + "serde", + "static_assertions", + "subtle", +] + [[package]] name = "paste" version = "1.0.15" @@ -13499,29 +13424,16 @@ dependencies = [ "elliptic-curve 0.13.8", ] -[[package]] -name = "primitive-types" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" -dependencies = [ - "fixed-hash 0.7.0", - "impl-codec 0.5.1", - "impl-rlp", - "impl-serde 0.3.2", - "uint", -] - [[package]] name = "primitive-types" version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ - "fixed-hash 0.8.0", - "impl-codec 0.6.0", + "fixed-hash", + "impl-codec", "impl-rlp", - "impl-serde 0.4.0", + "impl-serde", "scale-info", "uint", ] @@ -13923,12 +13835,6 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" -[[package]] -name = "radium" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" - [[package]] name = "radium" version = "0.7.0" @@ -14125,7 +14031,7 @@ dependencies = [ "group 0.13.0", "hex", "jubjub", - "pasta_curves", + "pasta_curves 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.6.4", "serde", "thiserror 1.0.69", @@ -14628,8 +14534,8 @@ dependencies = [ "num-bigint", "num-integer", "num-traits", - "parity-scale-codec 3.7.5", - "primitive-types 0.12.2", + "parity-scale-codec", + "primitive-types", "proptest", "rand 0.8.5", "rand 0.9.2", @@ -15077,7 +14983,7 @@ checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" dependencies = [ "cfg-if", "derive_more 1.0.0", - "parity-scale-codec 3.7.5", + "parity-scale-codec", "scale-info-derive", ] @@ -16862,7 +16768,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "208d40b9e8cad9f93613778ea295ed8f3c2b1824217c6cfc7219d3f6f45b96d4" dependencies = [ "base64-simd 0.7.0", - "bitvec 1.0.1", + "bitvec", "data-encoding", "debugid", "if_chain", @@ -16881,7 +16787,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e22afbcb92ce02d23815b9795523c005cb9d3c214f8b7a66318541c240ea7935" dependencies = [ "base64-simd 0.8.0", - "bitvec 1.0.1", + "bitvec", "data-encoding", "debugid", "if_chain", @@ -19095,7 +19001,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", - "rand 0.8.5", + "rand 0.7.3", "static_assertions", ] @@ -19560,8 +19466,8 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "verifiable-share-encryption" -version = "0.3.0" -source = "git+https://github.com/LIT-Protocol/verifiable-share-encryption?rev=7eddfbe736369db596d0f302c72f1d76b0fd332d#7eddfbe736369db596d0f302c72f1d76b0fd332d" +version = "0.4.0" +source = "git+https://github.com/LIT-Protocol/verifiable-share-encryption?branch=pallas#682fe9d3e0db44236ad582ee635c5a1b36b4472a" dependencies = [ "anyhow", "bulletproofs", @@ -19844,8 +19750,8 @@ dependencies = [ "base64 0.21.7", "bytes", "derive_more 0.99.20", - "ethabi 18.0.0", - "ethereum-types 0.14.1", + "ethabi", + "ethereum-types", "futures", "futures-timer", "headers", @@ -20679,12 +20585,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c01ae8492c38f52376efd3a17d0994b6bcf3df1e39c0226d458b7d81670b2a06" -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "wyz" version = "0.5.1" diff --git a/rust/lit-os/lit-cli-os/README.md b/rust/lit-os/lit-cli-os/README.md index e1708359..7bdf4886 100644 --- a/rust/lit-os/lit-cli-os/README.md +++ b/rust/lit-os/lit-cli-os/README.md @@ -45,7 +45,7 @@ lit os guest template release abc12345 \ - **Staging:** `naga-staging` - **Test:** `datil-test`, `naga-test` - **Development:** `datil-dev`, `naga-dev`, `internal-dev` -- **Proto:** `datil-proto` +- **Proto:** `datil-proto`, `naga-proto` --- @@ -107,6 +107,8 @@ and ensure the gpg-agent is running. The release command needs a GitHub Personal Access Token (PAT) to create releases. +**⚠️ Important:** We **must** use a Personal Access Token (PAT), not the default `GITHUB_TOKEN` from GitHub Actions. Releases created with the default `GITHUB_TOKEN` will **not** trigger workflows automatically due to GitHub's security restrictions. Therefore, until we migrate to Github Apps, pelase trigger the workflow manually to update the github page. + #### Create Personal Access Token 1. Go to: **GitHub Settings → Developer settings → Personal access tokens → Tokens (classic)** @@ -132,6 +134,8 @@ curl -H "Authorization: token $GITHUB_TOKEN" https://api.github.com/user **Security note:** Keep your token secure! Never commit it to Git or share it publicly. +**Why a PAT is required:** GitHub prevents workflows from triggering other workflows when using the default `GITHUB_TOKEN` to avoid infinite loops. Using a PAT allows the release creation to trigger the deployment workflow automatically. + --- ### 3. Path Requirements (CI Environment) diff --git a/rust/lit-os/lit-cli-os/src/cmd/os/guest/instance/create.rs b/rust/lit-os/lit-cli-os/src/cmd/os/guest/instance/create.rs index 24307771..5be3bc09 100644 --- a/rust/lit-os/lit-cli-os/src/cmd/os/guest/instance/create.rs +++ b/rust/lit-os/lit-cli-os/src/cmd/os/guest/instance/create.rs @@ -287,6 +287,7 @@ pub(crate) async fn handle_cmd_os_guest_instance_create( } #[allow(clippy::too_many_arguments)] +#[allow(clippy::collapsible_if)] pub(crate) async fn do_os_guest_instance_create( cfg: &LitConfig, opts: &CliGlobalOpts, instance_type: GuestType, common_args: GuestInstanceCreateArgsCommon, prov_args: Option, diff --git a/rust/lit-os/lit-cli-os/src/cmd/os/guest/template/create.rs b/rust/lit-os/lit-cli-os/src/cmd/os/guest/template/create.rs index ec8c986e..5f023313 100644 --- a/rust/lit-os/lit-cli-os/src/cmd/os/guest/template/create.rs +++ b/rust/lit-os/lit-cli-os/src/cmd/os/guest/template/create.rs @@ -164,6 +164,7 @@ pub(crate) async fn handle_cmd_os_guest_template_create( } } +#[allow(clippy::collapsible_if)] pub(crate) async fn do_os_guest_template_create( cfg: &LitConfig, opts: &CliGlobalOpts, build_type: GuestType, common_args: GuestTemplateCreateArgsCommon, _prov_args: Option, @@ -318,7 +319,7 @@ pub(crate) async fn do_os_guest_template_create( network_name: None, no_pinning: common_args.release_no_pinning, push_only: false, - github_repo: "LIT-Protocol/lit-assets".to_string(), + github_repo: "LIT-Protocol/lit-peer".to_string(), data_branch: "releases-info".to_string(), }; diff --git a/rust/lit-os/lit-cli-os/src/cmd/os/guest/template/release.rs b/rust/lit-os/lit-cli-os/src/cmd/os/guest/template/release.rs index 567f0c6d..d6dc6851 100644 --- a/rust/lit-os/lit-cli-os/src/cmd/os/guest/template/release.rs +++ b/rust/lit-os/lit-cli-os/src/cmd/os/guest/template/release.rs @@ -69,6 +69,8 @@ pub(crate) enum NetworkName { DatilProto, #[value(name = "naga-prod")] NagaProd, + #[value(name = "naga-proto")] + NagaProto, #[value(name = "naga-staging")] NagaStaging, #[value(name = "naga-test")] @@ -79,13 +81,14 @@ pub(crate) enum NetworkName { InternalDev, } -impl NetworkName { +impl std::fmt::Display for NetworkName { /// Converts the enum variant to its owned string representation. - pub fn to_string(&self) -> String { - self.to_possible_value() - .expect("All NetworkName variants have values") - .get_name() - .to_string() + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}", + self.to_possible_value().expect("All NetworkName variants have values").get_name() + ) } } @@ -109,13 +112,14 @@ pub(crate) struct GuestTemplateRelease { #[arg(long)] pub(crate) no_pinning: bool, /// GitHub repository in format owner/repo for publishing release information - #[arg(long, default_value = "LIT-Protocol/lit-assets")] + #[arg(long, default_value = "LIT-Protocol/lit-peer")] pub(crate) github_repo: String, /// The branch to commit release data to within the repository #[arg(long, default_value = "releases-info")] pub(crate) data_branch: String, } +#[allow(clippy::collapsible_if)] pub(crate) async fn handle_cmd_os_guest_template_release( cfg: LitConfig, opts: CliGlobalOpts, args: GuestTemplateRelease, ) -> bool { @@ -158,6 +162,7 @@ pub(crate) async fn handle_cmd_os_guest_template_release( /// attempts to authenticate using the `DOCKER_HUB_USERNAME` and `DOCKER_HUB_PASSWORD` /// environment variables. /// 3. Pushes the newly-tagged container image to the Docker Hub repository. +#[allow(clippy::collapsible_if)] async fn do_publish_image(image_repo: &str, build_id: &str, release_id: &str) -> Result<()> { println!("📦 Pushing build environment image to Docker Hub"); diff --git a/rust/lit-os/lit-cli-os/src/cmd/os/guest/template/release_publish.rs b/rust/lit-os/lit-cli-os/src/cmd/os/guest/template/release_publish.rs index b920d26f..6a7eb8f1 100644 --- a/rust/lit-os/lit-cli-os/src/cmd/os/guest/template/release_publish.rs +++ b/rust/lit-os/lit-cli-os/src/cmd/os/guest/template/release_publish.rs @@ -239,7 +239,7 @@ impl GitPublisher { let gpg_output = TokioCommand::new("gpg") .current_dir(parent_dir) - .args(&["--detach-sign", "--armor", "-u", gpg_key, file_str]) + .args(["--detach-sign", "--armor", "-u", gpg_key, file_str]) .output() .await .map_err(|e| generic_err(e, Some("Failed to execute gpg signing command".into())))?; @@ -264,7 +264,7 @@ impl Drop for GitPublisher { // We use a blocking `std::process::Command` here because `drop` cannot be async. let status = std::process::Command::new("git") .current_dir(&self.repo_path) - .args(&["checkout", &self.original_branch]) + .args(["checkout", &self.original_branch]) .status(); if let Err(e) = status { diff --git a/rust/lit-os/lit-cli-os/src/guest/instance/helper.rs b/rust/lit-os/lit-cli-os/src/guest/instance/helper.rs index ea378514..d58da60f 100644 --- a/rust/lit-os/lit-cli-os/src/guest/instance/helper.rs +++ b/rust/lit-os/lit-cli-os/src/guest/instance/helper.rs @@ -37,9 +37,7 @@ impl GuestInstanceHelper for GuestInstanceEnv { /// we perform some other checks to attempt to detect failed creations. fn is_valid(&self) -> bool { if let Ok(exists) = self.service_exists() { - if exists { - return true; - } + return exists; } false @@ -300,10 +298,12 @@ impl GuestInstanceItemHelper for GuestInstanceItem { None, ); - let staking_contract = resolver.staking_contract(cfg).await.expect(&format!( - "Failed to get staking contract from resolver with subnet {:?}", - resolver.subnet_id() - )); + let staking_contract = resolver.staking_contract(cfg).await.unwrap_or_else(|_| { + panic!( + "Failed to get staking contract from resolver with subnet {:?}", + resolver.subnet_id() + ) + }); let staker_address = self.staker_address()?; @@ -313,18 +313,18 @@ impl GuestInstanceItemHelper for GuestInstanceItem { )?; let current_epoch_validators = - staking_contract.get_validators_in_current_epoch(realm_id).await.expect(&format!( - "Failed to get validators in current epoch for realm {} on staking contract {:?}", + staking_contract.get_validators_in_current_epoch(realm_id).await.unwrap_or_else(|_| panic!("Failed to get validators in current epoch for realm {} on staking contract {:?}", realm_id, - staking_contract.address() - )); + staking_contract.address())); let next_epoch_validators = - staking_contract.get_validators_in_next_epoch(realm_id).await.expect(&format!( - "Failed to get validators in next epoch for realm {} on staking contract {:?}", - realm_id, - staking_contract.address() - )); + staking_contract.get_validators_in_next_epoch(realm_id).await.unwrap_or_else(|_| { + panic!( + "Failed to get validators in next epoch for realm {} on staking contract {:?}", + realm_id, + staking_contract.address() + ) + }); let mut validators = Vec::new(); validators.extend(current_epoch_validators); diff --git a/rust/lit-os/lit-cli-os/src/guest/instance/mod.rs b/rust/lit-os/lit-cli-os/src/guest/instance/mod.rs index 53276c88..d0999aef 100644 --- a/rust/lit-os/lit-cli-os/src/guest/instance/mod.rs +++ b/rust/lit-os/lit-cli-os/src/guest/instance/mod.rs @@ -396,6 +396,7 @@ pub fn print_guest_instances( print!("{}", table.render()); } +#[allow(clippy::collapsible_if)] pub fn print_guest_instance_processes( cfg: &LitConfig, items: Vec, output: Option, ) { diff --git a/rust/lit-os/lit-cli-os/src/guest/instance/oneshot.rs b/rust/lit-os/lit-cli-os/src/guest/instance/oneshot.rs index d0018f4b..c7088287 100644 --- a/rust/lit-os/lit-cli-os/src/guest/instance/oneshot.rs +++ b/rust/lit-os/lit-cli-os/src/guest/instance/oneshot.rs @@ -47,7 +47,7 @@ pub(crate) async fn create_oneshot_actions( network_name: None, no_pinning: prov_args.no_pinning, push_only: true, - github_repo: "LIT-Protocol/lit-assets".to_string(), + github_repo: "LIT-Protocol/lit-peer".to_string(), data_branch: "releases-info".to_string(), }; diff --git a/rust/lit-os/lit-logging-service/Cargo.toml b/rust/lit-os/lit-logging-service/Cargo.toml index 614991af..bab4ad14 100644 --- a/rust/lit-os/lit-logging-service/Cargo.toml +++ b/rust/lit-os/lit-logging-service/Cargo.toml @@ -3,6 +3,10 @@ name = "lit-logging-service" version = "0.1.0" edition.workspace = true +[features] +default = [] +proxy-collector = ["lit-observability/proxy-collector"] + [dependencies] async-trait = { version = "0.1.74" } derive_more = { version = "0.99.17" } diff --git a/rust/lit-os/lit-logging-service/src/config/mod.rs b/rust/lit-os/lit-logging-service/src/config/mod.rs index 994f4776..ce547fb8 100644 --- a/rust/lit-os/lit-logging-service/src/config/mod.rs +++ b/rust/lit-os/lit-logging-service/src/config/mod.rs @@ -6,8 +6,10 @@ use std::path::PathBuf; use crate::error::Result; +#[allow(dead_code)] pub(crate) const OTEL_SERVICE_DEVICE: &str = "/dev/virtio-ports/com.litprotocol.logging.port0"; +#[allow(dead_code)] pub trait LitLoggingServiceConfig { fn try_new() -> Result; fn must_new() -> LitConfig; diff --git a/rust/lit-os/lit-logging-service/src/metrics.rs b/rust/lit-os/lit-logging-service/src/metrics.rs index 266138a9..018958a3 100644 --- a/rust/lit-os/lit-logging-service/src/metrics.rs +++ b/rust/lit-os/lit-logging-service/src/metrics.rs @@ -1,6 +1,6 @@ // re export counter -pub use lit_observability::metrics::counter; +#[allow(dead_code)] pub mod grpc { //! Metrics for the gRPC service. @@ -33,6 +33,7 @@ pub mod grpc { } } +#[allow(dead_code)] pub mod device { //! Metrics for the serial devices. @@ -64,6 +65,7 @@ pub mod device { } } +#[allow(dead_code)] pub mod queue { //! Metrics for the queue. diff --git a/rust/lit-os/lit-logging-service/src/service/otel.rs b/rust/lit-os/lit-logging-service/src/service/otel.rs index 81af61d9..30723bb3 100644 --- a/rust/lit-os/lit-logging-service/src/service/otel.rs +++ b/rust/lit-os/lit-logging-service/src/service/otel.rs @@ -61,7 +61,7 @@ impl OTELService { })); // After starting the queue worker, update the queue size metric. - metrics::counter::add_value( + lit_observability::metrics::counter::add_value( metrics::queue::QueueMetrics::OtelServiceQueueSize, self.queue_rx.len() as u64, &[], @@ -139,7 +139,7 @@ async fn queue_worker(rx: Receiver, quit_rx: Receiver, d if let Err(e) = writeln!(unified_dev, "{json}") { eprintln!("{INTERNAL_LOG_PREFIX}: Failed to write log entry to device (dropping) - {e:?}") } - metrics::counter::add_value(metrics::device::DeviceMetrics::WriteSize, json.len() as u64, &[KeyValue::new( + lit_observability::metrics::counter::add_value(metrics::device::DeviceMetrics::WriteSize, json.len() as u64, &[KeyValue::new( "telemetry_type", "log", )]); @@ -158,7 +158,7 @@ async fn queue_worker(rx: Receiver, quit_rx: Receiver, d if let Err(e) = writeln!(unified_dev, "{json}") { eprintln!("{INTERNAL_LOG_PREFIX}: Failed to write log entry to device (dropping) - {e:?}") } - metrics::counter::add_value(metrics::device::DeviceMetrics::WriteSize, json.len() as u64, &[KeyValue::new( + lit_observability::metrics::counter::add_value(metrics::device::DeviceMetrics::WriteSize, json.len() as u64, &[KeyValue::new( "telemetry_type", "metric", )]); @@ -177,7 +177,7 @@ async fn queue_worker(rx: Receiver, quit_rx: Receiver, d if let Err(e) = writeln!(unified_dev, "{json}") { eprintln!("{INTERNAL_LOG_PREFIX}: Failed to write log entry to device (dropping) - {e:?}") } - metrics::counter::add_value(metrics::device::DeviceMetrics::WriteSize, json.len() as u64, &[KeyValue::new( + lit_observability::metrics::counter::add_value(metrics::device::DeviceMetrics::WriteSize, json.len() as u64, &[KeyValue::new( "telemetry_type", "trace", )]); @@ -193,7 +193,7 @@ async fn queue_worker(rx: Receiver, quit_rx: Receiver, d } // After reading the message, update the queue size metric. - metrics::counter::add_value(metrics::queue::QueueMetrics::OtelServiceQueueSize, rx.len() as u64, &[]); + lit_observability::metrics::counter::add_value(metrics::queue::QueueMetrics::OtelServiceQueueSize, rx.len() as u64, &[]); } } } diff --git a/rust/lit-os/lit-os-core/src/guest/cloud_init/network_config.rs b/rust/lit-os/lit-os-core/src/guest/cloud_init/network_config.rs index bec0fe5f..c9d51307 100644 --- a/rust/lit-os/lit-os-core/src/guest/cloud_init/network_config.rs +++ b/rust/lit-os/lit-os-core/src/guest/cloud_init/network_config.rs @@ -78,6 +78,7 @@ impl CloudInitNetworkConfig { Ok(()) } + #[allow(clippy::collapsible_if)] // Generators pub fn to_network_interfaces(&self, path: &Path, skip_internal: bool) -> Result<()> { let mut contents = String::new(); diff --git a/rust/lit-os/lit-os-core/src/utils/validate.rs b/rust/lit-os/lit-os-core/src/utils/validate.rs index 970a0cac..487d0362 100644 --- a/rust/lit-os/lit-os-core/src/utils/validate.rs +++ b/rust/lit-os/lit-os-core/src/utils/validate.rs @@ -46,6 +46,7 @@ pub static VALID_LABEL_RE: Lazy = Lazy::new(|| { Regex::new(r"^[a-zA-Z0-9:_-]+").expect("failed to construct regex for label validation") }); +#[allow(clippy::collapsible_if)] pub fn validate_host_name_part(part: &str, max_len: Option) -> Result<()> { if part.is_empty() { return Err(validation_err("invalid length for hostname part", None)); diff --git a/rust/lit-os/lit-os-guest-initrd/src/bin/init/main.rs b/rust/lit-os/lit-os-guest-initrd/src/bin/init/main.rs index aca062c3..f1cac7d5 100644 --- a/rust/lit-os/lit-os-guest-initrd/src/bin/init/main.rs +++ b/rust/lit-os/lit-os-guest-initrd/src/bin/init/main.rs @@ -2,7 +2,7 @@ use std::backtrace::Backtrace; use std::panic; use env_logger::Env; -use log::{as_error, as_serde, error}; +use log::error; use lit_core::error::{Error, Kind}; use lit_core::utils::backtrace::{backtrace_to_vec, extract_panic_msg}; @@ -32,7 +32,7 @@ async fn main() { None, ); - error!(error = as_error!(err), backtrace = as_serde!(backtrace); + error!(error:err = err, backtrace:serde = backtrace; "Unexpectedly panicked!: {}", msg); })); diff --git a/rust/lit-os/lit-os-guest-initrd/src/init/mod.rs b/rust/lit-os/lit-os-guest-initrd/src/init/mod.rs index c5e3577c..9ebd2908 100644 --- a/rust/lit-os/lit-os-guest-initrd/src/init/mod.rs +++ b/rust/lit-os/lit-os-guest-initrd/src/init/mod.rs @@ -1,4 +1,4 @@ -use log::{as_error, error, info}; +use log::{error, info}; use nix::unistd::Uid; use std::process::exit; @@ -16,7 +16,7 @@ pub async fn init() { // Init context let mut ctx = match InitContext::new(false) { Err(e) => { - error!(error = as_error!(e); "InitContext->new() failed"); + error!(error:err = e; "InitContext->new() failed"); exit(255); } Ok(ctx) => ctx, diff --git a/rust/lit-os/lit-os-guest-initrd/src/init/stage/attest/mod.rs b/rust/lit-os/lit-os-guest-initrd/src/init/stage/attest/mod.rs index b05691b1..ecc322b4 100644 --- a/rust/lit-os/lit-os-guest-initrd/src/init/stage/attest/mod.rs +++ b/rust/lit-os/lit-os-guest-initrd/src/init/stage/attest/mod.rs @@ -1,5 +1,5 @@ use lit_attestation::verification::Policy; -use log::{as_error, error, info}; +use log::{error, info}; use lit_os_core::error::{Result, validation_err}; use lit_os_core::guest::oneshot::config::ACTION_TYPE_BOOTSTRAP; @@ -9,7 +9,7 @@ use crate::init::stage::Outcome; pub(crate) async fn run(ctx: &mut InitContext) -> Result { if let Err(e) = verify_attestation(ctx).await { - error!(error = as_error!(e); "Attestation failed"); + error!(error:err = e; "Attestation failed"); return Ok(Outcome::Diagnose); } diff --git a/rust/lit-os/lit-os-guest-initrd/src/init/stage/cleanup/mod.rs b/rust/lit-os/lit-os-guest-initrd/src/init/stage/cleanup/mod.rs index fd89de5d..d8d4bd21 100644 --- a/rust/lit-os/lit-os-guest-initrd/src/init/stage/cleanup/mod.rs +++ b/rust/lit-os/lit-os-guest-initrd/src/init/stage/cleanup/mod.rs @@ -40,10 +40,8 @@ pub(crate) fn unmount(mnt: PathBuf, force: bool, unlink: bool) { error!("error unmounting: {}", e); } - if unlink { - if let Err(e) = fs::remove_dir_all(mnt.as_path()) { - error!("error removing dir ({:?}): {}", mnt, e); - } + if unlink && let Err(e) = fs::remove_dir_all(mnt.as_path()) { + error!("error removing dir ({:?}): {}", mnt, e); } } } diff --git a/rust/lit-os/lit-os-guest-initrd/src/init/stage/debug/mod.rs b/rust/lit-os/lit-os-guest-initrd/src/init/stage/debug/mod.rs index 00080e40..42fe59f7 100644 --- a/rust/lit-os/lit-os-guest-initrd/src/init/stage/debug/mod.rs +++ b/rust/lit-os/lit-os-guest-initrd/src/init/stage/debug/mod.rs @@ -70,10 +70,10 @@ async fn test_network(_ctx: &mut InitContext) -> Result<()> { ); } Ok(_) => { - error!("Failed to ping: {} ({}) (no response)", host, ip.to_string()) + error!("Failed to ping: {} ({}) (no response)", host, ip) } Err(e) => { - error!("Failed to ping: {} ({}) - {:?}", host, ip.to_string(), e) + error!("Failed to ping: {} ({}) - {:?}", host, ip, e) } } } diff --git a/rust/lit-os/lit-os-guest-initrd/src/init/stage/mod.rs b/rust/lit-os/lit-os-guest-initrd/src/init/stage/mod.rs index 08851054..212a6cb1 100644 --- a/rust/lit-os/lit-os-guest-initrd/src/init/stage/mod.rs +++ b/rust/lit-os/lit-os-guest-initrd/src/init/stage/mod.rs @@ -2,7 +2,7 @@ use std::time::Duration; use std::{env, thread}; use futures::future::LocalBoxFuture; -use log::{as_error, error, info, warn}; +use log::{error, info, warn}; use lit_os_core::error::Result; @@ -75,7 +75,7 @@ pub(crate) async fn run_all(ctx: &mut InitContext) -> bool { Outcome::PowerOff => { // Poweroff if requested if let Err(e) = busybox_poweroff() { - error!(error = as_error!(e); "Failed to poweroff"); + error!(error:err = e; "Failed to poweroff"); }; } Outcome::Halt | Outcome::Diagnose => { @@ -96,7 +96,7 @@ async fn run(ctx: &mut InitContext, stage: &str, fun: StageHandler) -> Outcome { let res = fun(ctx).await; let outcome: Outcome; if let Err(e) = res { - error!(error = as_error!(e); "Stage '{}' failed", stage); + error!(error:err = e; "Stage '{}' failed", stage); outcome = Outcome::Break; } else { @@ -121,7 +121,7 @@ fn securely_handle_failure(ctx: &mut InitContext) { info!("Tearing down system due to failure"); if let Err(e) = deactivate_luks_volumes(ctx) { - error!(error = as_error!(e); "Failed to deactivate_luks_volumes, halting boot"); + error!(error:err = e; "Failed to deactivate_luks_volumes, halting boot"); thread::sleep(Duration::from_secs(u64::MAX)); } } diff --git a/rust/lit-os/lit-os-guest-initrd/src/init/stage/oneshot/action/bootstrap.rs b/rust/lit-os/lit-os-guest-initrd/src/init/stage/oneshot/action/bootstrap.rs index 6f85cae9..d352086b 100644 --- a/rust/lit-os/lit-os-guest-initrd/src/init/stage/oneshot/action/bootstrap.rs +++ b/rust/lit-os/lit-os-guest-initrd/src/init/stage/oneshot/action/bootstrap.rs @@ -103,7 +103,7 @@ async fn bootstrap_prov( dest.as_path(), ctx.build_env().guest_cpu_type()?, guest_vcpus, - &vec![id_block, auth_info], + &[id_block, auth_info], )?; // Push updates (if any). diff --git a/rust/lit-os/lit-os-guest-initrd/src/init/stage/oneshot/mod.rs b/rust/lit-os/lit-os-guest-initrd/src/init/stage/oneshot/mod.rs index 53d26c63..d5cb5160 100644 --- a/rust/lit-os/lit-os-guest-initrd/src/init/stage/oneshot/mod.rs +++ b/rust/lit-os/lit-os-guest-initrd/src/init/stage/oneshot/mod.rs @@ -1,6 +1,6 @@ use std::{env, fs}; -use log::{as_error, error, info}; +use log::{error, info}; use lit_os_core::config::LitOsGuestConfig; use lit_os_core::error::{Result, config_err, io_err, validation_err}; @@ -64,7 +64,7 @@ pub(crate) async fn run(ctx: &mut InitContext) -> Result { Ok(ActionOutcome::Continue) => continue, Ok(ActionOutcome::Break) => break, Err(e) => { - error!(error = as_error!(e); "one shot action '{}' failed", action.action()); + error!(error:err = e; "one shot action '{}' failed", action.action()); unsafe { env::remove_var(ENV_LOG_INIT_SUB_STAGE); } diff --git a/rust/lit-os/lit-os-guest-initrd/src/init/stage/prepare/mod.rs b/rust/lit-os/lit-os-guest-initrd/src/init/stage/prepare/mod.rs index 8d142d35..3e212577 100644 --- a/rust/lit-os/lit-os-guest-initrd/src/init/stage/prepare/mod.rs +++ b/rust/lit-os/lit-os-guest-initrd/src/init/stage/prepare/mod.rs @@ -9,7 +9,7 @@ use lit_core::utils::option::bool_option_to_bool; use lit_os_core::config::LitOsGuestConfig; use lit_os_core::error::{Result, config_err, io_err, validation_err}; use lit_os_core::guest::types::GuestType; -use log::{as_error, error, info}; +use log::{error, info}; use std::path::Path; pub(crate) async fn run(ctx: &mut InitContext) -> Result { @@ -20,7 +20,7 @@ pub(crate) async fn run(ctx: &mut InitContext) -> Result { } if let Err(e) = verify_tee() { - error!(error = as_error!(e); "unable to proceed: TEE invalid"); + error!(error:err = e; "unable to proceed: TEE invalid"); return Ok(Outcome::Break); } @@ -30,7 +30,7 @@ pub(crate) async fn run(ctx: &mut InitContext) -> Result { match verify(ctx) { Err(e) => { - error!(error = as_error!(e); "unable to proceed: context verification failed"); + error!(error:err = e; "unable to proceed: context verification failed"); Ok(Outcome::Break) } @@ -151,7 +151,7 @@ fn check_dev_exists(path: &Path, label: &str) -> bool { if !path.exists() { let err = io_err(format!("{label} dev ({path:?}) does not exist!"), None); - error!(error = as_error!(err); "unable to proceed: required device missing"); + error!(error:err = err; "unable to proceed: required device missing"); return false; } diff --git a/rust/lit-os/lit-os-guest-initrd/src/init/stage/sync/mod.rs b/rust/lit-os/lit-os-guest-initrd/src/init/stage/sync/mod.rs index 27cbceed..077cd41b 100644 --- a/rust/lit-os/lit-os-guest-initrd/src/init/stage/sync/mod.rs +++ b/rust/lit-os/lit-os-guest-initrd/src/init/stage/sync/mod.rs @@ -309,10 +309,10 @@ fn run_prepare(ctx: &mut InitContext, root_mnt: &Path, var_mnt: &Path) -> Result .arg("--fqdn") .arg(fqdn); - if let Some(allow_ssh) = ctx.build_env().build_opt_ssh.as_ref() { - if *allow_ssh { - cmd.arg("--init-ssh"); - } + if let Some(allow_ssh) = ctx.build_env().build_opt_ssh.as_ref() + && *allow_ssh + { + cmd.arg("--init-ssh"); } let out = cmd diff --git a/rust/lit-os/lit-os-guest-initrd/src/init/stage/unlock/mod.rs b/rust/lit-os/lit-os-guest-initrd/src/init/stage/unlock/mod.rs index 2fbaab00..d3ac6456 100644 --- a/rust/lit-os/lit-os-guest-initrd/src/init/stage/unlock/mod.rs +++ b/rust/lit-os/lit-os-guest-initrd/src/init/stage/unlock/mod.rs @@ -2,7 +2,7 @@ use std::path::{Path, PathBuf}; use std::time::Duration; use std::{fs, thread}; -use log::{as_error, error, info}; +use log::{error, info}; use lit_core::error::Unexpected; use lit_core::utils::binary::bytes_to_hex; @@ -32,7 +32,7 @@ pub(crate) async fn run(ctx: &mut InitContext) -> Result { verify_hashes(ctx)?; if let Err(e) = maybe_resize_volumes(ctx) { - error!(error = as_error!(e); "unable to proceed: volume resize failed"); + error!(error:err = e; "unable to proceed: volume resize failed"); return Ok(Outcome::Diagnose); } @@ -220,10 +220,11 @@ fn verify_var_hash(ctx: &mut InitContext) -> Result<()> { })?; let var_dev_label = format!("{}:{:?}", "var", var_dev.as_path()); - if let Some(var_hash) = ctx.cmdline_env().build_varhhash.as_ref() { - if ctx.is_first_boot() && guest_type != GuestType::Prov { - verify_hash(ctx, &var_dev, var_hash, &var_dev_label)?; - } + if let Some(var_hash) = ctx.cmdline_env().build_varhhash.as_ref() + && ctx.is_first_boot() + && guest_type != GuestType::Prov + { + verify_hash(ctx, &var_dev, var_hash, &var_dev_label)?; } Ok(()) diff --git a/rust/lit-os/lit-os-guest-initrd/src/logging.rs b/rust/lit-os/lit-os-guest-initrd/src/logging.rs index 157de0b2..9d4fcb67 100644 --- a/rust/lit-os/lit-os-guest-initrd/src/logging.rs +++ b/rust/lit-os/lit-os-guest-initrd/src/logging.rs @@ -63,8 +63,7 @@ impl LogFormatter { let kvs = record.key_values(); if kvs.count() > 0 { - kvs.visit(&mut FieldCollectorKVVisitor(&mut fields)) - .map_err(|e| io::Error::new(io::ErrorKind::Other, e))?; + kvs.visit(&mut FieldCollectorKVVisitor(&mut fields)).map_err(io::Error::other)?; if !fields.is_empty() { let mut fields_style = buf.style(); diff --git a/rust/lit-os/lit-os-metrics/src/lib.rs b/rust/lit-os/lit-os-metrics/src/lib.rs index 2e145a3a..9e0d32fb 100644 --- a/rust/lit-os/lit-os-metrics/src/lib.rs +++ b/rust/lit-os/lit-os-metrics/src/lib.rs @@ -1,4 +1,4 @@ -//! +//! Handles OS metrics //! #![deny(unsafe_code)] diff --git a/rust/lit-os/lit-os-prov-api-client/src/client.rs b/rust/lit-os/lit-os-prov-api-client/src/client.rs index e77faccd..633791fc 100644 --- a/rust/lit-os/lit-os-prov-api-client/src/client.rs +++ b/rust/lit-os/lit-os-prov-api-client/src/client.rs @@ -97,7 +97,7 @@ async fn lookup_api_domain(cfg: &LitConfig, resolver: &ContractResolver) -> Resu #[cfg(feature = "trust-dns")] fn create_http_client() -> Result { let mut client = Client::builder(); - client = client.trust_dns(true); + client = client.hickory_dns(true); let client = client .build() diff --git a/rust/lit-os/lit-os-prov-api/Cargo.toml b/rust/lit-os/lit-os-prov-api/Cargo.toml index 8723f5eb..79742856 100644 --- a/rust/lit-os/lit-os-prov-api/Cargo.toml +++ b/rust/lit-os/lit-os-prov-api/Cargo.toml @@ -11,6 +11,7 @@ path = "./src/main.rs" [features] default = ["lit-attestation/generate-via-service"] +proxy-collector = ["lit-observability/proxy-collector"] [dependencies] config = { workspace = true } diff --git a/rust/lit-os/lit-os-prov-core/src/release/common/keys.rs b/rust/lit-os/lit-os-prov-core/src/release/common/keys.rs index 139c5451..983b8bd6 100644 --- a/rust/lit-os/lit-os-prov-core/src/release/common/keys.rs +++ b/rust/lit-os/lit-os-prov-core/src/release/common/keys.rs @@ -140,7 +140,7 @@ pub fn extract_host_identity_fingerprint(release_dir: &Path) -> Result> } pub fn write_identity_files( - dest_dir: &Path, guest_vcpu_type: GuestCpuType, guest_vcpus: u16, assets: &Vec, + dest_dir: &Path, guest_vcpu_type: GuestCpuType, guest_vcpus: u16, assets: &[String], ) -> Result<()> { let mut dest = dest_dir.to_path_buf(); dest.push("id"); @@ -158,7 +158,7 @@ pub fn write_identity_files( "failed to write AMD SEV-SNP identity files, assets len < 2", None, )); } - let id_block = assets.get(0).expect_or_err("expected assets.0 to exist")?; + let id_block = assets.first().expect_or_err("expected assets.0 to exist")?; let auth_info = assets.get(1).expect_or_err("expected assets.1 to exist")?; let mut auth_info_dest = dest.clone(); diff --git a/rust/lit-os/lit-os-prov-core/src/release/create/types.rs b/rust/lit-os/lit-os-prov-core/src/release/create/types.rs index 8d88c0ab..029950c5 100644 --- a/rust/lit-os/lit-os-prov-core/src/release/create/types.rs +++ b/rust/lit-os/lit-os-prov-core/src/release/create/types.rs @@ -62,10 +62,10 @@ impl CreateRelease { if self.manifest_cid.is_empty() { return Err(validation_err("missing required field: manifest_cid", None)); } - if self.password.len() == 0 { + if self.password.is_empty() { return Err(validation_err("missing required field: password", None)); } - if self.public_key.len() == 0 { + if self.public_key.is_empty() { return Err(validation_err("missing required field: public_key", None)); } @@ -75,19 +75,19 @@ impl CreateRelease { pub fn sha512(&self) -> Output { let mut hasher = Sha512::new(); hasher.update("release_id"); - hasher.update(&(self.release_id.len() as u64).to_be_bytes()); + hasher.update((self.release_id.len() as u64).to_be_bytes()); hasher.update(self.release_id.as_bytes()); hasher.update("manifest_cid"); - hasher.update(&(self.manifest_cid.len() as u64).to_be_bytes()); + hasher.update((self.manifest_cid.len() as u64).to_be_bytes()); hasher.update(self.manifest_cid.as_bytes()); hasher.update("password"); - hasher.update(&(self.password.len() as u64).to_be_bytes()); + hasher.update((self.password.len() as u64).to_be_bytes()); hasher.update(self.password.as_slice()); hasher.update("public_key"); - hasher.update(&(self.public_key.len() as u64).to_be_bytes()); + hasher.update((self.public_key.len() as u64).to_be_bytes()); hasher.update(self.public_key.as_slice()); hasher.finalize() } diff --git a/rust/lit-os/lit-os-prov-core/src/release/init/types.rs b/rust/lit-os/lit-os-prov-core/src/release/init/types.rs index 4c84f4d7..bd1355c3 100644 --- a/rust/lit-os/lit-os-prov-core/src/release/init/types.rs +++ b/rust/lit-os/lit-os-prov-core/src/release/init/types.rs @@ -37,7 +37,7 @@ impl InitRelease { pub fn sha512(&self) -> Output { let mut hasher = Sha512::new(); hasher.update("release_id"); - hasher.update(&(self.release_id.len() as u64).to_be_bytes()); + hasher.update((self.release_id.len() as u64).to_be_bytes()); hasher.update(self.release_id.as_bytes()); hasher.finalize() } diff --git a/rust/lit-os/lit-os-prov-core/src/release/issue/types.rs b/rust/lit-os/lit-os-prov-core/src/release/issue/types.rs index c648db48..6a6b7710 100644 --- a/rust/lit-os/lit-os-prov-core/src/release/issue/types.rs +++ b/rust/lit-os/lit-os-prov-core/src/release/issue/types.rs @@ -4,7 +4,7 @@ use serde_json::json; use sha2::digest::Output; use sha2::{Digest, Sha512}; -use lit_attestation::attestation::{FromSystem, TryGenerate}; +use lit_attestation::attestation::TryGenerate; use lit_attestation::{Attestation, AttestedRequest}; use lit_core::config::LitConfig; pub use lit_os_core::guest::types::GuestCpuType; @@ -50,16 +50,16 @@ impl IssueRelease { pub fn sha512(&self) -> Output { let mut hasher = Sha512::new(); hasher.update("release_id"); - hasher.update(&(self.release_id.len() as u64).to_be_bytes()); + hasher.update((self.release_id.len() as u64).to_be_bytes()); hasher.update(self.release_id.as_bytes()); hasher.update("vcpu_type"); let vcpu_type_str = self.vcpu_type.to_string(); - hasher.update(&(vcpu_type_str.len() as u64).to_be_bytes()); + hasher.update((vcpu_type_str.len() as u64).to_be_bytes()); hasher.update(vcpu_type_str.as_bytes()); hasher.update("vcpus"); - hasher.update(&self.vcpus.to_le_bytes()); + hasher.update(self.vcpus.to_le_bytes()); hasher.finalize() } } diff --git a/rust/lit-os/rust-toolchain.toml b/rust/lit-os/rust-toolchain.toml index c8969b51..657737a9 100644 --- a/rust/lit-os/rust-toolchain.toml +++ b/rust/lit-os/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.86" +channel = "1.91" components = ['rustfmt', 'rust-src', 'clippy']