diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d9f4c8306..e3ac5926b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -53,4 +53,4 @@ To start developing on Teleporter, you'll need Solidity >= v0.8.25. [Foundry](ht ### Do you have questions about the source code? -- Ask any question about Teleporter under GitHub [discussions](https://github.com/ava-labs/teleporter/discussions/categories/q-a). +- Ask any question about ICM or ICM contracts under GitHub [discussions](https://github.com/ava-labs/teleporter/discussions/categories/q-a). diff --git a/README.md b/README.md index 6ee349a1b..3a0af74cd 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,13 @@ teleporter

-To get started with building applications on top of Teleporter, refer to [the avalanche-starter-kit repository](https://github.com/ava-labs/avalanche-starter-kit). This README is focused on the development of the Teleporter protocol itself. +To get started with building ICM contracts, refer to [the avalanche-starter-kit repository](https://github.com/ava-labs/avalanche-starter-kit). This README is focused on the development of the `TeleporterMessenger` contract itself. -Teleporter is an EVM compatible cross-subnet communication protocol built on top of [Avalanche Warp Messaging (AWM)](https://docs.avax.network/learn/avalanche/awm), and implemented as a Solidity smart contract. It provides a mechanism to asynchronously invoke smart contract functions on other EVM blockchains within Avalanche. Teleporter provides a handful of useful features on top of AWM, such as specifying relayer incentives for message delivery, replay protection, message delivery and execution retries, and a standard interface for sending and receiving messages within a dApp deployed across multiple subnets. +`TeleporterMessenger` is a smart contract that serves as the interface for ICM contracts to [Avalanche Interchain Messaging (ICM)](https://academy.avax.network/course/interchain-messaging/04-icm-basics/01-icm-basics). It provides a mechanism to asynchronously invoke smart contract functions on other EVM blockchains within Avalanche. `TeleporterMessenger` provides a handful of useful features of ICM, such as specifying relayer incentives for message delivery, replay protection, message delivery and execution retries, and a standard interface for sending and receiving messages within a dApp deployed across multiple Avalanche L1s. -It's important to understand the distinction between Avalanche Warp Messaging and Teleporter. AWM allows subnets to communicate with each other via authenticated messages by providing signing and verification primitives in Avalanchego. These are used by the blockchain VMs to sign outgoing messages and verify incoming messages. +The `TeleporterMessenger` contract is a user-friendly interface to ICM, aimed at dApp developers. All of the message signing and verification is abstracted away from developers. Instead, developers simply call `sendCrossChainMessage` on the `TeleporterMessenger` contract to send a message invoking a smart contract on another Avalanche L1, and implement the `ITeleporterReceiver` interface to receive messages on the destination Avalanche L1. `TeleporterMessenger` handles all of the ICM message construction and sending, as well as the message delivery and execution. -The Teleporter protocol, on the other hand, is implemented at the smart contract level, and is a user-friendly interface to AWM, aimed at dApp developers. All of the message signing and verification is abstracted away from developers. Instead, developers simply call `sendCrossChainMessage` on the `TeleporterMessenger` contract to send a message invoking a smart contract on another subnet, and implement the `ITeleporterReceiver` interface to receive messages on the destination subnet. Teleporter handles all of the Warp message construction and sending, as well as the message delivery and execution. - -To get started with using Teleporter, see [How to Deploy Teleporter Enabled Subnets on a Local Network](https://docs.avax.network/tooling/cli-cross-chain/teleporter-on-local-networks) +To get started with using `TeleporterMessenger`, see [How to Deploy ICM Enabled Avalanche L1s on a Local Network](https://docs.avax.network/tooling/cli-cross-chain/teleporter-on-local-networks) - [Deployed Addresses](#deployed-addresses) - [A Note on Versioning](#a-note-on-versioning) @@ -21,8 +19,8 @@ To get started with using Teleporter, see [How to Deploy Teleporter Enabled Subn - [E2E tests](#e2e-tests) - [Run specific E2E tests](#run-specific-e2e-tests) - [Upgradability](#upgradability) -- [Deploy Teleporter to a Subnet](#deploy-teleporter-to-a-subnet) -- [Deploy TeleporterRegistry to a Subnet](#deploy-teleporterregistry-to-a-subnet) +- [Deploy TeleporterMessenger to an L1](#deploy-teleportermessenger-to-an-avalanche-l1) +- [Deploy TeleporterRegistry to an L1](#deploy-teleporterregistry-to-an-avalanche-l1) - [ABI Bindings](#abi-bindings) - [Docs](#docs) - [Resources](#resources) @@ -35,13 +33,13 @@ To get started with using Teleporter, see [How to Deploy Teleporter Enabled Subn | `TeleporterRegistry` | **0x7C43605E14F391720e1b37E49C78C4b03A488d98** | Mainnet C-Chain | | `TeleporterRegistry` | **0xF86Cb19Ad8405AEFa7d09C778215D2Cb6eBfB228** | Fuji C-Chain | -- Using [Nick's method](https://yamenmerhi.medium.com/nicks-method-ethereum-keyless-execution-168a6659479c#), `TeleporterMessenger` deploys at a universal address across all chains, varying with each `teleporter` Major release. **Compatibility exists only between same-version `TeleporterMessenger` instances.** See [Teleporter Contract Deployment](./utils/contract-deployment/README.md) and [Deploy Teleporter to a Subnet](#deploy-teleporter-to-a-subnet) for more details. +- Using [Nick's method](https://yamenmerhi.medium.com/nicks-method-ethereum-keyless-execution-168a6659479c#), `TeleporterMessenger` deploys at a universal address across all chains, varying with each `teleporter` Major release. **Compatibility exists only between same-version `TeleporterMessenger` instances.** See [TeleporterMessenger Contract Deployment](./utils/contract-deployment/README.md) and [Deploy TeleporterMessenger to an Avalanche L1](#deploy-teleportermessenger-to-an-avalanche-l1) for more details. -- `TeleporterRegistry` can be deployed to any address. See [Deploy TeleporterRegistry to a Subnet](#deploy-teleporterregistry-to-a-subnet) for details. The table above enumerates the canonical registry addresses on the Mainnet and Fuji C-Chains. +- `TeleporterRegistry` can be deployed to any address. See [Deploy TeleporterRegistry to an Avalanche L1](#deploy-teleporterregistry-to-an-avalanche-l1) for details. The table above enumerates the canonical registry addresses on the Mainnet and Fuji C-Chains. ## A Note on Versioning -Release versions follow the [semver](https://semver.org/) convention of incompatible Major releases. A new Major version is released whenever the `TeleporterMessenger` bytecode is changed, and a new version of `TeleporterMessenger` is meant to be deployed. Due to the use of Nick's method to deploy the contract to the same address on all chains (see [Teleporter Contract Deployment](./utils/contract-deployment/README.md) for details), this also means that new release versions would result in different Teleporter contract addresses. Minor and Patch versions may pertain to contract changes that do not change the `TeleporterMessenger` bytecode, or to changes in the test frameworks, and will only be included in tags. +Release versions follow the [semver](https://semver.org/) convention of incompatible Major releases. A new Major version is released whenever the `TeleporterMessenger` bytecode is changed, and a new version of `TeleporterMessenger` is meant to be deployed. Due to the use of Nick's method to deploy the contract to the same address on all chains (see [TeleporterMessenger Contract Deployment](./utils/contract-deployment/README.md) for details), this also means that new release versions would result in different `TeleporterMessenger` contract addresses. Minor and Patch versions may pertain to contract changes that do not change the `TeleporterMessenger` bytecode, or to changes in the test frameworks, and will only be included in tags. ## Setup @@ -63,11 +61,9 @@ Release versions follow the [semver](https://semver.org/) convention of incompat - `abi-bindings/` includes Go ABI bindings for the contracts in `contracts/`. - `tests/` includes integration tests for the contracts in `contracts/`, written using the [Ginkgo](https://onsi.github.io/ginkgo/) testing framework. - `utils/` includes Go utility functions for interacting with the contracts in `contracts/`. Included are Golang scripts to derive the expected EVM contract address deployed from a given EOA at a specific nonce, and also construct a transaction to deploy provided byte code to the same address on any EVM chain using [Nick's method](https://yamenmerhi.medium.com/nicks-method-ethereum-keyless-execution-168a6659479c#). -- `scripts/` includes bash scripts for interacting with Teleporter in various environments, as well as utility scripts. +- `scripts/` includes bash scripts for interacting with TeleporterMessenger in various environments, as well as utility scripts. - `abi_bindings.sh` generates ABI bindings for the contracts in `contracts/` and outputs them to `abi-bindings/`. - `lint.sh` performs Solidity and Golang linting. - - `scripts/` includes scripts for running Teleporter in Docker. -- `docker/` includes configurations for a local, containerized setup of Teleporter. ## E2E tests @@ -98,7 +94,7 @@ GINKGO_FOCUS="Calculate Teleporter" ./scripts/e2e_test.sh The E2E tests also supports `GINKGO_LABEL_FILTER`, making it easy to group test cases and run them together. For example, to run all E2E tests for the example cross chain applications: ```bash - ginkgo.It("Send native tokens from subnet A to B and back", + ginkgo.It("Send native tokens from L1 A to B and back", ginkgo.Label("cross chain apps"), func() { flows.NativeTokenBridge(LocalNetworkInstance) @@ -111,13 +107,13 @@ GINKGO_LABEL_FILTER="cross chain apps" ./scripts/e2e_test.sh ## Upgradability -The Teleporter contract is non-upgradeable and can not be changed once it is deployed. This provides immutability to the contracts, and ensures that the contract's behavior at each address is unchanging. However, to allow for new features and potential bug fixes, new versions of the Teleporter contract can be deployed to different addresses. The [TeleporterRegistry](./contracts/teleporter/TeleporterRegistry.sol) is used to keep track of the deployed versions of Teleporter, and to provide a standard interface for dApps to interact with the different Teleporter versions. +`TeleporterMessenger` is a non-upgradeable contract and can not be changed once it is deployed. This provides immutability to the contracts, and ensures that the contract's behavior at each address is unchanging. However, to allow for new features and potential bug fixes, new versions of `TeleporterMessenger` can be deployed to different addresses. The [TeleporterRegistry](./contracts/teleporter/TeleporterRegistry.sol) is used to keep track of the deployed versions of Teleporter, and to provide a standard interface for dApps to interact with the different `TeleporterMessenger` versions. -`TeleporterRegistry` **is not mandatory** for dApps built on top of Teleporter, but dApp's are recommended to leverage the registry to ensure they use the latest Teleporter version available. Another recommendation standard is to have a single canonical `TeleporterRegistry` for each Subnet chain, and unlike the Teleporter contract, the registry does not need to be deployed to the same address on every chain. This means the registry does not need a Nick's method deployment, and can be at different contract addresses on different chains. +`TeleporterRegistry` **is not mandatory** for dApps built on top of ICM, but dApp's are recommended to leverage the registry to ensure they use the latest `TeleporterMessenger` version available. Another recommendation standard is to have a single canonical `TeleporterRegistry` for each Avalanche L1, and unlike the `TeleporterMessenger` contract, the registry does not need to be deployed to the same address on every chain. This means the registry does not need a Nick's method deployment, and can be at different contract addresses on different chains. -For more information on the registry and how to integrate with Teleporter dApps, see the [Upgradability doc](./contracts/teleporter/registry/README.md). +For more information on the registry and how to integrate with ICM contracts, see the [Upgradability doc](./contracts/teleporter/registry/README.md). -## Deploy Teleporter to a Subnet +## Deploy TeleporterMessenger to an Avalanche L1 From the root of the repo, the TeleporterMessenger contract can be deployed by calling @@ -127,22 +123,22 @@ From the root of the repo, the TeleporterMessenger contract can be deployed by c Required arguments: -- `--version ` Specify the release version to deploy. These will all be of the form `v1.X.0`. Each Teleporter version can only send and receive messages from the **same** Teleporter version on another chain. You can see a list of released versions at https://github.com/ava-labs/teleporter/releases. +- `--version ` Specify the release version to deploy. These will all be of the form `v1.X.0`. Each `TeleporterMessenger` version can only send and receive messages from the **same** `TeleporterMessenger` version on another chain. You can see a list of released versions at https://github.com/ava-labs/teleporter/releases. - `--rpc-url ` Specify the rpc url of the node to use. Options: - `--private-key ` Funds the deployer address with the account held by `` -To ensure that Teleporter can be deployed to the same address on every EVM based chain, it uses [Nick's Method](https://yamenmerhi.medium.com/nicks-method-ethereum-keyless-execution-168a6659479c) to deploy from a static deployer address. Teleporter costs exactly `10eth` in the subnet's native gas token to deploy, which must be sent to the deployer address. +To ensure that `TeleporterMessenger` can be deployed to the same address on every EVM based chain, it uses [Nick's Method](https://yamenmerhi.medium.com/nicks-method-ethereum-keyless-execution-168a6659479c) to deploy from a static deployer address. Teleporter costs exactly `10eth` in the Avalanche L1's native gas token to deploy, which must be sent to the deployer address. `deploy_teleporter.sh` will send the necessary native tokens to the deployer address if it is provided with a private key for an account with sufficient funds. Alternatively, the deployer address can be funded externally. The deployer address for each version can be found by looking up the appropriate version at https://github.com/ava-labs/teleporter/releases and downloading `TeleporterMessenger_Deployer_Address_.txt`. -Alternatively for new Subnets, the `TeleporterMessenger` contract can be directly included in the genesis file as documented [here](./contracts/teleporter/README.md#teleporter-messenger-contract-deployment). +Alternatively for new Avalanche L1s, the `TeleporterMessenger` contract can be directly included in the genesis file as documented [here](./contracts/teleporter/README.md#teleporter-messenger-contract-deployment). -## Deploy TeleporterRegistry to a Subnet +## Deploy TeleporterRegistry to an Avalanche L1 -There should only be one canonical `TeleporterRegistry` deployed for each chain, but if one does not exist, it is recommended to deploy the registry so Teleporter dApps can always use the most recent Teleporter version available. The registry does not need to be deployed to the same address on every chain, and therefore does not need a Nick's method transaction. To deploy, run the following command from the root of the repository: +There should only be one canonical `TeleporterRegistry` deployed for each chain, but if one does not exist, it is recommended to deploy the registry so ICM contracts can always use the most recent `TeleporterMessenger` version available. The registry does not need to be deployed to the same address on every chain, and therefore does not need a Nick's method transaction. To deploy, run the following command from the root of the repository: ```bash ./scripts/deploy_registry.sh --version --rpc-url --private-key [OPTIONS] @@ -168,7 +164,7 @@ The auto-generated bindings should be written under the `abi-bindings/` director ## Docs -- [Teleporter Protocol Overview](./contracts/teleporter/README.md) +- [ICM Protocol Overview](./contracts/teleporter/README.md) - [Teleporter Registry and Upgrades](./contracts/teleporter/registry/README.md) - [Contract Deployment](./utils/contract-deployment/README.md) - [Teleporter CLI](./cmd/teleporter-cli/README.md) diff --git a/SECURITY.md b/SECURITY.md index abe186d82..b3bd2c686 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -18,4 +18,4 @@ Please use the most recently released version to perform testing and to validate ## Audit Reports -All complete audit reports for Teleporter can be found in the [audits](./audits/) directory. +All complete audit reports for `TeleporterMessenger` can be found in the [audits](./audits/) directory. diff --git a/abi-bindings/go/governance/ValidatorSetSig/ValidatorSetSig.go b/abi-bindings/go/governance/ValidatorSetSig/ValidatorSetSig.go index a3dee70ed..bd552eafc 100644 --- a/abi-bindings/go/governance/ValidatorSetSig/ValidatorSetSig.go +++ b/abi-bindings/go/governance/ValidatorSetSig/ValidatorSetSig.go @@ -42,7 +42,7 @@ type ValidatorSetSigMessage struct { // ValidatorSetSigMetaData contains all meta data concerning the ValidatorSetSig contract. var ValidatorSetSigMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validatorBlockchainID_\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"targetContractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"Delivered\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VALIDATORS_SOURCE_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"executeCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContractAddress\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"targetBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorSetSigAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"targetContractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"internalType\":\"structValidatorSetSigMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"validateMessage\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"validatorBlockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60c060405234801561000f575f80fd5b50604051610b76380380610b7683398101604081905261002e916100b2565b60015f5560808190526040805163084279ef60e31b8152905173020000000000000000000000000000000000000591634213cf789160048083019260209291908290030181865afa158015610085573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100a991906100b2565b60a052506100c9565b5f602082840312156100c2575f80fd5b5051919050565b60805160a051610a7e6100f85f395f818161017701526104ba01525f818161012a01526102790152610a7e5ff3fe608060405260043610610071575f3560e01c80637ecebe001161004c5780637ecebe00146100e05780638d6e579d14610119578063b771b3bc1461014c578063d127dc9b14610166575f80fd5b80630731775d1461007c5780635433da42146100ac5780637d969c34146100c1575f80fd5b3661007857005b5f80fd5b348015610087575f80fd5b5061008f5f81565b6040516001600160a01b0390911681526020015b60405180910390f35b6100bf6100ba366004610642565b610199565b005b3480156100cc575f80fd5b506100bf6100db36600461079a565b6104b6565b3480156100eb575f80fd5b5061010b6100fa366004610842565b60016020525f908152604090205481565b6040519081526020016100a3565b348015610124575f80fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610157575f80fd5b5061008f6005600160991b0181565b348015610171575f80fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b6101a161061a565b6040516306f8253560e41b815263ffffffff821660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156101ea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261021191908101906108c9565b91509150806102755760405162461bcd60e51b815260206004820152602560248201527f56616c696461746f725365745369673a20696e76616c69642077617270206d65604482015264737361676560d81b60648201526084015b60405180910390fd5b81517f0000000000000000000000000000000000000000000000000000000000000000146102f45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f725365745369673a20696e76616c696420736f75726365436044820152651a185a5b925160d21b606482015260840161026c565b60208201516001600160a01b0316156103655760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f725365745369673a206e6f6e2d7a65726f206f726967696e60448201526c53656e6465724164647265737360981b606482015260840161026c565b5f826040015180602001905181019061037e9190610969565b9050610389816104b6565b6060810151610399906001610a08565b604080830180516001600160a01b039081165f9081526001602052838120949094559051608085015160a0860151935191909216926103d791610a2d565b5f6040518083038185875af1925050503d805f8114610411576040519150601f19603f3d011682016040523d82523d5f602084013e610416565b606091505b50509050806104675760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f725365745369673a2063616c6c206661696c656400000000604482015260640161026c565b816060015182604001516001600160a01b03167f5942a9a3968c7d49fc51c027041544ea295f5c1e395d6d8aa35c4369959f8ed960405160405180910390a3505050506104b360015f55565b50565b80517f00000000000000000000000000000000000000000000000000000000000000001461053a5760405162461bcd60e51b815260206004820152602b60248201527f56616c696461746f725365745369673a20696e76616c6964207461726765744260448201526a1b1bd8dad8da185a5b925160aa1b606482015260840161026c565b60208101516001600160a01b031630146105ae5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f725365745369673a20696e76616c69642076616c6964617460448201526e6f725365745369674164647265737360881b606482015260840161026c565b60608101516040808301516001600160a01b03165f90815260016020522054146104b35760405162461bcd60e51b815260206004820152601e60248201527f56616c696461746f725365745369673a20696e76616c6964206e6f6e63650000604482015260640161026c565b60025f540361063c57604051633ee5aeb560e01b815260040160405180910390fd5b60025f55565b5f60208284031215610652575f80fd5b813563ffffffff81168114610665575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c0810167ffffffffffffffff811182821017156106a3576106a361066c565b60405290565b6040516060810167ffffffffffffffff811182821017156106a3576106a361066c565b604051601f8201601f1916810167ffffffffffffffff811182821017156106f5576106f561066c565b604052919050565b6001600160a01b03811681146104b3575f80fd5b803561071c816106fd565b919050565b5f67ffffffffffffffff82111561073a5761073a61066c565b50601f01601f191660200190565b5f82601f830112610757575f80fd5b813561076a61076582610721565b6106cc565b81815284602083860101111561077e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156107aa575f80fd5b813567ffffffffffffffff808211156107c1575f80fd5b9083019060c082860312156107d4575f80fd5b6107dc610680565b823581526107ec60208401610711565b60208201526107fd60408401610711565b6040820152606083013560608201526080830135608082015260a083013582811115610827575f80fd5b61083387828601610748565b60a08301525095945050505050565b5f60208284031215610852575f80fd5b8135610665816106fd565b5f5b8381101561087757818101518382015260200161085f565b50505f910152565b5f82601f83011261088e575f80fd5b815161089c61076582610721565b8181528460208386010111156108b0575f80fd5b6108c182602083016020870161085d565b949350505050565b5f80604083850312156108da575f80fd5b825167ffffffffffffffff808211156108f1575f80fd5b9084019060608287031215610904575f80fd5b61090c6106a9565b82518152602083015161091e816106fd565b6020820152604083015182811115610934575f80fd5b6109408882860161087f565b6040830152508094505050506020830151801515811461095e575f80fd5b809150509250929050565b5f60208284031215610979575f80fd5b815167ffffffffffffffff80821115610990575f80fd5b9083019060c082860312156109a3575f80fd5b6109ab610680565b8251815260208301516109bd816106fd565b602082015260408301516109d0816106fd565b80604083015250606083015160608201526080830151608082015260a0830151828111156109fc575f80fd5b6108338782860161087f565b80820180821115610a2757634e487b7160e01b5f52601160045260245ffd5b92915050565b5f8251610a3e81846020870161085d565b919091019291505056fea2646970667358221220b37908d0698377f4a4cfd2a85b528b65bbfde731fa649fdc7fa8fcd5fbad682864736f6c63430008190033", + Bin: "0x60c060405234801561000f575f80fd5b50604051610b76380380610b7683398101604081905261002e916100b2565b60015f5560808190526040805163084279ef60e31b8152905173020000000000000000000000000000000000000591634213cf789160048083019260209291908290030181865afa158015610085573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100a991906100b2565b60a052506100c9565b5f602082840312156100c2575f80fd5b5051919050565b60805160a051610a7e6100f85f395f818161017701526104ba01525f818161012a01526102790152610a7e5ff3fe608060405260043610610071575f3560e01c80637ecebe001161004c5780637ecebe00146100e05780638d6e579d14610119578063b771b3bc1461014c578063d127dc9b14610166575f80fd5b80630731775d1461007c5780635433da42146100ac5780637d969c34146100c1575f80fd5b3661007857005b5f80fd5b348015610087575f80fd5b5061008f5f81565b6040516001600160a01b0390911681526020015b60405180910390f35b6100bf6100ba366004610642565b610199565b005b3480156100cc575f80fd5b506100bf6100db36600461079a565b6104b6565b3480156100eb575f80fd5b5061010b6100fa366004610842565b60016020525f908152604090205481565b6040519081526020016100a3565b348015610124575f80fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610157575f80fd5b5061008f6005600160991b0181565b348015610171575f80fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b6101a161061a565b6040516306f8253560e41b815263ffffffff821660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156101ea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261021191908101906108c9565b91509150806102755760405162461bcd60e51b815260206004820152602560248201527f56616c696461746f725365745369673a20696e76616c69642077617270206d65604482015264737361676560d81b60648201526084015b60405180910390fd5b81517f0000000000000000000000000000000000000000000000000000000000000000146102f45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f725365745369673a20696e76616c696420736f75726365436044820152651a185a5b925160d21b606482015260840161026c565b60208201516001600160a01b0316156103655760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f725365745369673a206e6f6e2d7a65726f206f726967696e60448201526c53656e6465724164647265737360981b606482015260840161026c565b5f826040015180602001905181019061037e9190610969565b9050610389816104b6565b6060810151610399906001610a08565b604080830180516001600160a01b039081165f9081526001602052838120949094559051608085015160a0860151935191909216926103d791610a2d565b5f6040518083038185875af1925050503d805f8114610411576040519150601f19603f3d011682016040523d82523d5f602084013e610416565b606091505b50509050806104675760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f725365745369673a2063616c6c206661696c656400000000604482015260640161026c565b816060015182604001516001600160a01b03167f5942a9a3968c7d49fc51c027041544ea295f5c1e395d6d8aa35c4369959f8ed960405160405180910390a3505050506104b360015f55565b50565b80517f00000000000000000000000000000000000000000000000000000000000000001461053a5760405162461bcd60e51b815260206004820152602b60248201527f56616c696461746f725365745369673a20696e76616c6964207461726765744260448201526a1b1bd8dad8da185a5b925160aa1b606482015260840161026c565b60208101516001600160a01b031630146105ae5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f725365745369673a20696e76616c69642076616c6964617460448201526e6f725365745369674164647265737360881b606482015260840161026c565b60608101516040808301516001600160a01b03165f90815260016020522054146104b35760405162461bcd60e51b815260206004820152601e60248201527f56616c696461746f725365745369673a20696e76616c6964206e6f6e63650000604482015260640161026c565b60025f540361063c57604051633ee5aeb560e01b815260040160405180910390fd5b60025f55565b5f60208284031215610652575f80fd5b813563ffffffff81168114610665575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c0810167ffffffffffffffff811182821017156106a3576106a361066c565b60405290565b6040516060810167ffffffffffffffff811182821017156106a3576106a361066c565b604051601f8201601f1916810167ffffffffffffffff811182821017156106f5576106f561066c565b604052919050565b6001600160a01b03811681146104b3575f80fd5b803561071c816106fd565b919050565b5f67ffffffffffffffff82111561073a5761073a61066c565b50601f01601f191660200190565b5f82601f830112610757575f80fd5b813561076a61076582610721565b6106cc565b81815284602083860101111561077e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156107aa575f80fd5b813567ffffffffffffffff808211156107c1575f80fd5b9083019060c082860312156107d4575f80fd5b6107dc610680565b823581526107ec60208401610711565b60208201526107fd60408401610711565b6040820152606083013560608201526080830135608082015260a083013582811115610827575f80fd5b61083387828601610748565b60a08301525095945050505050565b5f60208284031215610852575f80fd5b8135610665816106fd565b5f5b8381101561087757818101518382015260200161085f565b50505f910152565b5f82601f83011261088e575f80fd5b815161089c61076582610721565b8181528460208386010111156108b0575f80fd5b6108c182602083016020870161085d565b949350505050565b5f80604083850312156108da575f80fd5b825167ffffffffffffffff808211156108f1575f80fd5b9084019060608287031215610904575f80fd5b61090c6106a9565b82518152602083015161091e816106fd565b6020820152604083015182811115610934575f80fd5b6109408882860161087f565b6040830152508094505050506020830151801515811461095e575f80fd5b809150509250929050565b5f60208284031215610979575f80fd5b815167ffffffffffffffff80821115610990575f80fd5b9083019060c082860312156109a3575f80fd5b6109ab610680565b8251815260208301516109bd816106fd565b602082015260408301516109d0816106fd565b80604083015250606083015160608201526080830151608082015260a0830151828111156109fc575f80fd5b6108338782860161087f565b80820180821115610a2757634e487b7160e01b5f52601160045260245ffd5b92915050565b5f8251610a3e81846020870161085d565b919091019291505056fea264697066735822122085695dadaccadd2c31fc869af6d75c732af7d1b8781796cd24f6d0272e1927c164736f6c63430008190033", } // ValidatorSetSigABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/ictt/TokenHome/ERC20TokenHome/ERC20TokenHome.go b/abi-bindings/go/ictt/TokenHome/ERC20TokenHome/ERC20TokenHome.go index 66399d77f..64468c0ac 100644 --- a/abi-bindings/go/ictt/TokenHome/ERC20TokenHome/ERC20TokenHome.go +++ b/abi-bindings/go/ictt/TokenHome/ERC20TokenHome/ERC20TokenHome.go @@ -67,7 +67,7 @@ type SendTokensInput struct { // ERC20TokenHomeMetaData contains all meta data concerning the ERC20TokenHome contract. var ERC20TokenHomeMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterRegistryAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"teleporterManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minTeleporterVersion\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remaining\",\"type\":\"uint256\"}],\"name\":\"CollateralAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldMinTeleporterVersion\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newMinTeleporterVersion\",\"type\":\"uint256\"}],\"name\":\"MinTeleporterVersionUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"initialCollateralNeeded\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"RemoteRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressUnpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensAndCallRouted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensAndCallSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensRouted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ERC20_TOKEN_HOME_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TELEPORTER_REGISTRY_APP_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_HOME_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"addCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinTeleporterVersion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"}],\"name\":\"getRemoteTokenTransferrerSettings\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"registered\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"collateralNeeded\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenMultiplier\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"multiplyOnRemote\",\"type\":\"bool\"}],\"internalType\":\"structRemoteTokenTransferrerSettings\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"}],\"name\":\"getTransferredBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterRegistryAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"teleporterManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minTeleporterVersion\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"isTeleporterAddressPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"pauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"originSenderAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"receiveTeleporterMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"send\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sendAndCall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"unpauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"updateMinTeleporterVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161502438038061502483398101604081905261002e91610893565b61003b8585858585610048565b505050505061090d565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f811580156100915750825b90505f826001600160401b031660011480156100ac5750303b155b9050811580156100ba575080155b156100d85760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561010657845460ff60401b1916680100000000000000001785555b6101138a8a8a8a8a610165565b831561015957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b61016d61018a565b61017a85858585856101da565b610183826101ff565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166101d857604051631afcd79f60e31b815260040160405180910390fd5b565b6101e261018a565b6101ed858585610248565b6101f5610268565b6101838282610278565b61020761018a565b7f914a9547f6c3ddce1d5efbd9e687708f0d1d408ce129e8e1a88bce4f40e2950080546001600160a01b0319166001600160a01b0392909216919091179055565b61025061018a565b61025a8382610404565b6102638261042a565b505050565b61027061018a565b6101d861043b565b61028061018a565b6001600160a01b0382166102db5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e206164647265737300000060448201526064015b60405180910390fd5b60128160ff16111561033a5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b60648201526084016102d2565b5f7f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e60090507302000000000000000000000000000000000000056001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d291906108f6565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b61040c61018a565b610414610465565b61041c610475565b610426828261047d565b5050565b61043261018a565b61004581610607565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75005b6001905550565b61046d61018a565b6101d8610641565b6101d861018a565b61048561018a565b6001600160a01b0382166105015760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016102d2565b5f7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0090505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610566573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061058a91906108f6565b116105df5760405162461bcd60e51b815260206004820152603260248201525f80516020615004833981519152604482015271656c65706f7274657220726567697374727960701b60648201526084016102d2565b81546001600160a01b0319166001600160a01b03821617825561060183610670565b50505050565b61060f61018a565b6001600160a01b03811661063857604051631e4fbdf760e01b81525f60048201526024016102d2565b61004581610808565b61064961018a565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0061045e565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa1580156106d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fb91906108f6565b60028301549091508184111561075a5760405162461bcd60e51b815260206004820152603160248201525f8051602061500483398151915260448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016102d2565b8084116107cf5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016102d2565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b80516001600160a01b038116811461088e575f80fd5b919050565b5f805f805f60a086880312156108a7575f80fd5b6108b086610878565b94506108be60208701610878565b9350604086015192506108d360608701610878565b9150608086015160ff811681146108e8575f80fd5b809150509295509295909350565b5f60208284031215610906575f80fd5b5051919050565b6146ea8061091a5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806365690038116100a9578063c8511ada1161006e578063c8511ada146102b4578063c868efaa14610388578063d2cc7a701461039b578063f2fde38b146103c2578063fd658268146103d5575f80fd5b80636569003814610232578063715018a6146102455780638da5cb5b1461024d578063909a6ac01461027d5780639731429714610291575f80fd5b80634511243e116100ef5780634511243e146101d15780634797735f146101e45780635d16225d146101f85780635eb995141461020b57806362e3901b1461021e575f80fd5b806310fe9ae81461012b578063154d625a146101745780632b0d8f18146101955780633bb03890146101aa5780634213cf78146101bd575b5f80fd5b7f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e601546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b61018761018236600461368c565b6103e8565b60405190815260200161016b565b6101a86101a33660046136ba565b610430565b005b6101a86101b83660046136e3565b610532565b5f8051602061461583398151915254610187565b6101a86101df3660046136ba565b610646565b6101875f8051602061467583398151915281565b6101a8610206366004613747565b610735565b6101a8610219366004613776565b610751565b6101875f8051602061461583398151915281565b6101a861024036600461378d565b610765565b6101a861078e565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610157565b6101875f8051602061469583398151915281565b6102a461029f3660046136ba565b6107a1565b604051901515815260200161016b565b6103516102c236600461368c565b60408051608080820183525f808352602080840182905283850182905260609384018290529581525f8051602061463583398151915286528381206001600160a01b039590951681529385529282902082519384018352805460ff9081161515855260018201549585019590955260028101549284019290925260039091015490921615159181019190915290565b60405161016b9190815115158152602080830151908201526040808301519082015260609182015115159181019190915260800190565b6101a86103963660046137d3565b6107c1565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0254610187565b6101a86103d03660046136ba565b61097e565b6101a86103e3366004613854565b6109b8565b5f8281527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03851684529091529020545b92915050565b5f805160206146958339815191526104466109c8565b6001600160a01b0382166104755760405162461bcd60e51b815260040161046c90613889565b60405180910390fd5b61047f81836109d0565b156104e25760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b606482015260840161046c565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156105765750825b90505f826001600160401b031660011480156105915750303b155b90508115801561059f575080155b156105bd5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156105e757845460ff60401b1916600160401b1785555b6105f48a8a8a8a8a6109f1565b831561063a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b5f8051602061469583398151915261065c6109c8565b6001600160a01b0382166106825760405162461bcd60e51b815260040161046c90613889565b61068c81836109d0565b6106ea5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b606482015260840161046c565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b61074d61074736849003840184613989565b82610a16565b5050565b6107596109c8565b61076281610c27565b50565b61074d61077d5f805160206146158339815191525490565b303361078886613a8b565b85610dbf565b610796610fcb565b61079f5f611026565b565b5f5f805160206146958339815191526107ba81846109d0565b9392505050565b6107c9611096565b5f5f8051602061469583398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610834573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108589190613b59565b10156108bf5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b606482015260840161046c565b6108c981336109d0565b1561092f5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b606482015260840161046c565b61096f858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506110e092505050565b506109786114d3565b50505050565b610986610fcb565b6001600160a01b0381166109af57604051631e4fbdf760e01b81525f600482015260240161046c565b61076281611026565b6109c38383836114fd565b505050565b61079f610fcb565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b6109f96116ed565b610a068585858585611736565b610a0f8261175b565b5050505050565b5f805160206146558339815191528054600114610a455760405162461bcd60e51b815260040161046c90613b70565b60028155610a5283611791565b60e08301516001600160a01b031615610a7d5760405162461bcd60e51b815260040161046c90613bb4565b5f80610a9b855f01518660200151868860600151896080015161183a565b915091505f604051806040016040528060016004811115610abe57610abe613bfa565b8152602001604051806040016040528089604001516001600160a01b0316815260200186815250604051602001610af59190613c0e565b60405160208183030381529060405281525090505f610bd46040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b606001516001600160a01b031681526020018781525081526020018960c0015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b604051908082528060200260200182016040528015610ba6578160200160208202803683370190505b50815260200184604051602001610bbd9190613c7b565b6040516020818303038152906040528152506119ff565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb528987604051610c12929190613cbd565b60405180910390a35050600190925550505050565b5f8051602061469583398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015610c7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9f9190613b59565b600283015490915081841115610d115760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b606482015260840161046c565b808411610d865760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e00606482015260840161046c565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b5f805160206146558339815191528054600114610dee5760405162461bcd60e51b815260040161046c90613b70565b60028155610dfb83611b1a565b60c08301516001600160a01b031615610e265760405162461bcd60e51b815260040161046c90613bb4565b5f80610e46855f015186602001518688610100015189610120015161183a565b915091505f604051806040016040528060026004811115610e6957610e69613bfa565b81526020016040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b0316815260200189604001516001600160a01b03168152602001868152602001896060015181526020018960a0015181526020018960e001516001600160a01b0316815250604051602001610eec9190613d3e565b60405160208183030381529060405281525090505f610f756040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b61010001516001600160a01b03168152602001878152508152602001896080015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050876001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168987604051610fb3929190613ddc565b60405180910390a35050600190925550505050505050565b33610ffd7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461079f5760405163118cdaa760e01b815233600482015260240161046c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016110da57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f5f8051602061461583398151915290505f828060200190518101906111069190613f00565b905060018151600481111561111d5761111d613bfa565b03611165575f816020015180602001905181019061113b9190613f88565b90505f61114d87878460200151611cff565b905061115c825f015182611d8a565b50505050505050565b60028151600481111561117a5761117a613bfa565b03611293575f81602001518060200190518101906111989190613fc0565b90505f6111aa87878460800151611cff565b825190915087146112105760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a206d69736d61746368656420736f7572636520626c6f60448201526918dad8da185a5b88125160b21b606482015260840161046c565b856001600160a01b031682602001516001600160a01b0316146112895760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e486f6d653a206d69736d617463686564206f726967696e2073656e60448201526a646572206164647265737360a81b606482015260840161046c565b61115c8282611ded565b6003815160048111156112a8576112a8613bfa565b0361137c575f81602001518060200190518101906112c6919061408a565b90505f806112de888885606001518660800151611fcd565b91509150611372604051806101000160405280855f0151815260200185602001516001600160a01b0316815260200185604001516001600160a01b03168152602001876001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018381526020015f81526020018560a0015181526020018560c001516001600160a01b031681525083612078565b5050505050505050565b60048151600481111561139157611391613bfa565b0361148c575f81602001518060200190518101906113af9190614123565b90505f806113c888888560800151866101400151611fcd565b915091506113728888855f01516040518061016001604052808860200151815260200188604001516001600160a01b0316815260200188606001516001600160a01b031681526020018860a00151815260200188610100015181526020018860c0015181526020018861012001516001600160a01b031681526020018860e001516001600160a01b031681526020018a6001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018681526020015f81525086612203565b5f815160048111156114a0576114a0613bfa565b03610a0f575f81602001518060200190518101906114be919061421b565b90506114cb8686836123e0565b505050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b5f80516020614655833981519152805460011461152c5760405162461bcd60e51b815260040161046c90613b70565b60028082555f8581525f80516020614635833981519152602090815260408083206001600160a01b03881684528252918290208251608081018452815460ff9081161515808352600184015494830194909452948201549381019390935260030154909216151560608201525f80516020614615833981519152916115c35760405162461bcd60e51b815260040161046c90614281565b5f8160200151116116205760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20636f6c6c61746572616c206e656564656044820152601960fa1b606482015260840161046c565b611629846127e7565b93505f80826020015186106116585760208301515f925061164a90876142ca565b90508260200151955061166b565b85836020015161166891906142ca565b91505b5f88815260028501602090815260408083206001600160a01b038b168085529083529281902060010185905580518981529182018590528a917f6769a5f9bfc8b6e0db839ab981cbf9239274ae72d2d035081a9157d43bd33cb6910160405180910390a380156116df576116df3382611d8a565b505060019092555050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661079f57604051631afcd79f60e31b815260040160405180910390fd5b61173e6116ed565b61174985858561280e565b611751612829565b610a0f8282612839565b6117636116ed565b5f8051602061467583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60408101516001600160a01b03166117f55760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20726563697069656e74206164647265736044820152607360f81b606482015260840161046c565b5f8160c00151116118185760405162461bcd60e51b815260040161046c906142dd565b60a0810151156107625760405162461bcd60e51b815260040161046c9061431f565b5f8581525f80516020614635833981519152602090815260408083206001600160a01b038816845282528083208151608081018352815460ff90811615158083526001840154958301959095526002830154938201939093526003909101549091161515606082015282915f8051602061461583398151915291906118d15760405162461bcd60e51b815260040161046c90614281565b6020810151156119335760405162461bcd60e51b815260206004820152602760248201527f546f6b656e486f6d653a20636f6c6c61746572616c206e656564656420666f726044820152662072656d6f746560c81b606482015260840161046c565b61193c876127e7565b965084156119525761194f8633876129a0565b94505b5f611966826040015183606001518a612af9565b90505f81116119b75760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f207363616c656420616d6f756e74000000604482015260640161046c565b5f8a815260038401602090815260408083206001600160a01b038d168452909152812080548392906119ea908490614360565b90915550909a95995094975050505050505050565b5f80611a09612b0f565b60408401516020015190915015611aae576040830151516001600160a01b0316611a8b5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b606482015260840161046c565b604083015160208101519051611aae916001600160a01b03909116908390612bff565b604051630624488560e41b81526001600160a01b03821690636244885090611ada908690600401614373565b6020604051808303815f875af1158015611af6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba9190613b59565b60408101516001600160a01b0316611b875760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420636f6e7472616044820152696374206164647265737360b01b606482015260840161046c565b5f816080015111611baa5760405162461bcd60e51b815260040161046c906142dd565b5f8160a0015111611c095760405162461bcd60e51b815260206004820152602360248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420676173206c696044820152621b5a5d60ea1b606482015260840161046c565b80608001518160a0015110611c6f5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420726563697069656e7420676173604482015265081b1a5b5a5d60d21b606482015260840161046c565b60e08101516001600160a01b0316611cdc5760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f2066616c6c6261636b20726563697069656044820152696e74206164647265737360b01b606482015260840161046c565b610140810151156107625760405162461bcd60e51b815260040161046c9061431f565b5f8381525f80516020614635833981519152602090815260408083206001600160a01b038616845282528083208151608081018352815460ff9081161515825260018301549482019490945260028201549281019290925260030154909116151560608201525f8051602061461583398151915290611d8081878787612c86565b9695505050505050565b6040518181525f80516020614675833981519152906001600160a01b038416907f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b9060200160405180910390a280546109c3906001600160a01b03168484612d7d565b5f80516020614675833981519152805460608401516001600160a01b0390911690611e1a90829085612bff565b5f845f01518560200151866040015184878960a00151604051602401611e459695949392919061442a565b60408051601f198184030181529190526020810180516001600160e01b03166394395edd60e01b17905260c086015160608701519192505f91611e89919084612ddc565b6060870151604051636eb1769f60e11b81523060048201526001600160a01b0391821660248201529192505f919085169063dd62ed3e90604401602060405180830381865afa158015611ede573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f029190613b59565b9050611f138488606001515f612de9565b8115611f655786606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff487604051611f5891815260200190565b60405180910390a2611fad565b86606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb087604051611fa491815260200190565b60405180910390a25b801561115c5760e087015161115c906001600160a01b0386169083612d7d565b5f8481525f80516020614635833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff90811615158252600183015494820194909452600282015492810192909252600301549091161515606082015281905f805160206146158339815191529082612051828a8a8a612c86565b90505f6120678360400151846060015189612e78565b919a91995090975050505050505050565b5f8051602061465583398151915280546001146120a75760405162461bcd60e51b815260040161046c90613b70565b600281556120b483611791565b5f6120cc845f01518560200151858760800151612e85565b9050805f036120e9576120e38460e0015184611d8a565b506121fb565b604080518082019091525f908060018152602001604051806040016040528088604001516001600160a01b031681526020018581525060405160200161212f9190613c0e565b60405160208183030381529060405281525090505f6121bb6040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a606001516001600160a01b031681526020018a6080015181525081526020018860c0015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050807f825080857c76cef4a1629c0705a7f8b4ef0282ddcafde0b6715c4fb34b68aaf087856040516121ef929190613cbd565b60405180910390a25050505b600190555050565b5f8051602061465583398151915280546001146122325760405162461bcd60e51b815260040161046c90613b70565b6002815561223f83611b1a565b5f612258845f0151856020015185876101200151612e85565b9050805f036122755761226f8460c0015184611d8a565b506123d5565b604080518082019091525f9080600281526020016040518061010001604052808b81526020018a6001600160a01b03168152602001896001600160a01b0316815260200188604001516001600160a01b03168152602001858152602001886060015181526020018860a0015181526020018860e001516001600160a01b03168152506040516020016123079190613d3e565b60405160208183030381529060405281525090505f6123956040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a61010001516001600160a01b031681526020018a61012001518152508152602001886080015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050807f42eff9005856e3c586b096d67211a566dc926052119fd7cc08023c70937ecb3087856040516123c9929190613ddc565b60405180910390a25050505b600190555050505050565b5f80516020614615833981519152836124475760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a207a65726f2072656d6f746520626c6f636b636861696044820152631b88125160e21b606482015260840161046c565b805484036124af5760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e486f6d653a2063616e6e6f742072656769737465722072656d6f7460448201526e329037b71039b0b6b29031b430b4b760891b606482015260840161046c565b6001600160a01b03831661251e5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e486f6d653a207a65726f2072656d6f746520746f6b656e2074726160448201526f6e73666572726572206164647265737360801b606482015260840161046c565b5f84815260028201602090815260408083206001600160a01b038716845290915290205460ff161561259e5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f746520616c726561647920726567697374604482015263195c995960e21b606482015260840161046c565b6012826040015160ff1611156126085760405162461bcd60e51b815260206004820152602960248201527f546f6b656e486f6d653a2072656d6f746520746f6b656e20646563696d616c73604482015268040e8dede40d0d2ced60bb1b606482015260840161046c565b6001810154602083015160ff908116600160a01b909204161461267c5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420686f6d6520746f6b656e20646560448201526563696d616c7360d01b606482015260840161046c565b5f8061269d8360010160149054906101000a900460ff168560400151612ff6565b915091505f6126b08383875f0151612e78565b90508180156126ca575084516126c790849061447e565b15155b156126dd576126da600182614360565b90505b6040518060800160405280600115158152602001828152602001848152602001831515815250846002015f8981526020019081526020015f205f886001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff02191690831515021790555060208201518160010155604082015181600201556060820151816003015f6101000a81548160ff021916908315150217905550905050856001600160a01b0316877ff229b02a51a4c8d5ef03a096ae0dd727d7b48b710d21b50ebebb560eef739b908388604001516040516127d692919091825260ff16602082015260400190565b60405180910390a350505050505050565b5f8051602061467583398151915280545f91906107ba906001600160a01b031633856129a0565b6128166116ed565b612820838261303e565b6109c382613060565b6128316116ed565b61079f613071565b6128416116ed565b6001600160a01b0382166128975760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e2061646472657373000000604482015260640161046c565b60128160ff1611156128f65760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b606482015260840161046c565b5f5f8051602061461583398151915290506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561294a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296e9190613b59565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa1580156129e6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0a9190613b59565b9050612a216001600160a01b038616853086613085565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612a65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a899190613b59565b9050818111612aef5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161046c565b611d8082826142ca565b5f612b0784848460016130be565b949350505050565b5f8051602061469583398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612b69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b8d9190614491565b9050612b9982826109d0565b1561042a5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b606482015260840161046c565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612c4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c709190613b59565b90506109788484612c818585614360565b612de9565b83515f90612ca65760405162461bcd60e51b815260040161046c90614281565b602085015115612d045760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f7465206e6f7420636f6c6c61746572616c6044820152631a5e995960e21b606482015260840161046c565b612d0f8484846130e5565b5f612d238660400151876060015185612e78565b90505f8111612d745760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e486f6d653a207a65726f20746f6b656e20616d6f756e7400000000604482015260640161046c565b95945050505050565b6040516001600160a01b038381166024830152604482018390526109c391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506131d2565b5f612b07845f8585613233565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612e3a8482613303565b610978576040516001600160a01b0384811660248301525f6044830152612e6e91869182169063095ea7b390606401612daa565b61097884826131d2565b5f612b078484845f6130be565b5f8481525f80516020614635833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff9081161580158352600184015495830195909552600283015493820193909352600390910154909116151560608201525f805160206146158339815191529180612f0b57505f8160200151115b15612f1a575f92505050612b07565b838511612f7e5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e486f6d653a20696e73756666696369656e7420616d6f756e74207460448201526b6f20636f766572206665657360a01b606482015260840161046c565b612f8884866142ca565b94505f612f9e8260400151836060015188612af9565b9050805f03612fb2575f9350505050612b07565b5f88815260038401602090815260408083206001600160a01b038b16845290915281208054839290612fe5908490614360565b909155509098975050505050505050565b5f8060ff8085169084161181816130195761301185876144ac565b60ff16613027565b61302386866144ac565b60ff165b61303290600a6145a5565b96919550909350505050565b6130466116ed565b61304e6133a0565b6130566133b0565b61074d82826133b8565b6130686116ed565b6107628161353c565b5f5f805160206146558339815191526114f6565b6040516001600160a01b0384811660248301528381166044830152606482018390526109789186918216906323b872dd90608401612daa565b5f811515841515036130db576130d485846145b0565b9050612b07565b612d7485846145c7565b5f8381527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03861684529091529020545f80516020614615833981519152908281101561319c5760405162461bcd60e51b815260206004820152602e60248201527f546f6b656e486f6d653a20696e73756666696369656e7420746f6b656e20747260448201526d616e736665722062616c616e636560901b606482015260840161046c565b6131a683826142ca565b5f9586526003909201602090815260408087206001600160a01b03909616875294905250919092205550565b5f6131e66001600160a01b03841683613544565b905080515f1415801561320a57508080602001905181019061320891906145da565b155b156109c357604051635274afe760e01b81526001600160a01b038416600482015260240161046c565b5f845a10156132845760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e74206761730000000000604482015260640161046c565b834710156132d45760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c7565000000604482015260640161046c565b826001600160a01b03163b5f036132ec57505f612b07565b5f805f84516020860188888bf19695505050505050565b5f805f846001600160a01b03168460405161331e91906145f9565b5f604051808303815f865af19150503d805f8114613357576040519150601f19603f3d011682016040523d82523d5f602084013e61335c565b606091505b509150915081801561338657508051158061338657508080602001905181019061338691906145da565b8015612d745750505050506001600160a01b03163b151590565b6133a86116ed565b61079f613551565b61079f6116ed565b6133c06116ed565b6001600160a01b03821661343c5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f727465722072656769737472792061646472657373000000000000000000606482015260840161046c565b5f5f8051602061469583398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134b29190613b59565b1161351a5760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b606482015260840161046c565b81546001600160a01b0319166001600160a01b03821617825561097883610c27565b6109866116ed565b60606107ba83835f613559565b6114d36116ed565b60608147101561357e5760405163cd78605960e01b815230600482015260240161046c565b5f80856001600160a01b0316848660405161359991906145f9565b5f6040518083038185875af1925050503d805f81146135d3576040519150601f19603f3d011682016040523d82523d5f602084013e6135d8565b606091505b5091509150611d808683836060826135f8576135f38261363f565b6107ba565b815115801561360f57506001600160a01b0384163b155b1561363857604051639996b31560e01b81526001600160a01b038516600482015260240161046c565b50806107ba565b80511561364f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b0381168114610762575f80fd5b803561368781613668565b919050565b5f806040838503121561369d575f80fd5b8235915060208301356136af81613668565b809150509250929050565b5f602082840312156136ca575f80fd5b81356107ba81613668565b60ff81168114610762575f80fd5b5f805f805f60a086880312156136f7575f80fd5b853561370281613668565b9450602086013561371281613668565b935060408601359250606086013561372981613668565b91506080860135613739816136d5565b809150509295509295909350565b5f8082840361012081121561375a575f80fd5b61010080821215613769575f80fd5b9395938601359450505050565b5f60208284031215613786575f80fd5b5035919050565b5f806040838503121561379e575f80fd5b82356001600160401b038111156137b3575f80fd5b830161016081860312156137c5575f80fd5b946020939093013593505050565b5f805f80606085870312156137e6575f80fd5b8435935060208501356137f881613668565b925060408501356001600160401b0380821115613813575f80fd5b818701915087601f830112613826575f80fd5b813581811115613834575f80fd5b886020828501011115613845575f80fd5b95989497505060200194505050565b5f805f60608486031215613866575f80fd5b83359250602084013561387881613668565b929592945050506040919091013590565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b60405161010081016001600160401b038111828210171561390e5761390e6138d7565b60405290565b60405161016081016001600160401b038111828210171561390e5761390e6138d7565b604080519081016001600160401b038111828210171561390e5761390e6138d7565b604051601f8201601f191681016001600160401b0381118282101715613981576139816138d7565b604052919050565b5f610100828403121561399a575f80fd5b6139a26138eb565b8235815260208301356139b481613668565b602082015260408301356139c781613668565b60408201526139d86060840161367c565b60608201526080830135608082015260a083013560a082015260c083013560c0820152613a0760e0840161367c565b60e08201529392505050565b5f6001600160401b03821115613a2b57613a2b6138d7565b50601f01601f191660200190565b5f82601f830112613a48575f80fd5b8135613a5b613a5682613a13565b613959565b818152846020838601011115613a6f575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6101608236031215613a9c575f80fd5b613aa4613914565b82358152613ab46020840161367c565b6020820152613ac56040840161367c565b604082015260608301356001600160401b03811115613ae2575f80fd5b613aee36828601613a39565b6060830152506080830135608082015260a083013560a0820152613b1460c0840161367c565b60c0820152613b2560e0840161367c565b60e0820152610100613b3881850161367c565b90820152610120838101359082015261014092830135928101929092525090565b5f60208284031215613b69575f80fd5b5051919050565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b60208082526026908201527f546f6b656e486f6d653a206e6f6e2d7a65726f206d756c74692d686f702066616040820152656c6c6261636b60d01b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b81516001600160a01b03168152602080830151908201526040810161042a565b5f5b83811015613c48578181015183820152602001613c30565b50505f910152565b5f8151808452613c67816020860160208601613c2e565b601f01601f19169290920160200192915050565b602081525f825160058110613c9e57634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612b076060840182613c50565b5f6101208201905083518252602084015160018060a01b03808216602085015280604087015116604085015280606087015116606085015250506080840151608083015260a084015160a083015260c084015160c083015260e0840151613d2f60e08401826001600160a01b03169052565b50826101008301529392505050565b60208152815160208201525f602083015160018060a01b03808216604085015280604086015116606085015250506060830151613d8660808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c0850152613dad610120850183613c50565b915060c085015160e085015260e0850151613dd2828601826001600160a01b03169052565b5090949350505050565b60408152825160408201525f6020840151613e0260608401826001600160a01b03169052565b5060408401516001600160a01b03166080830152606084015161016060a08401819052613e336101a0850183613c50565b9150608086015160c085015260a086015160e085015260c0860151610100613e65818701836001600160a01b03169052565b60e08801519150610120613e83818801846001600160a01b03169052565b90880151915061014090613ea1878301846001600160a01b03169052565b880151928601929092525090940151610180830152506020015290565b5f82601f830112613ecd575f80fd5b8151613edb613a5682613a13565b818152846020838601011115613eef575f80fd5b612b07826020830160208701613c2e565b5f60208284031215613f10575f80fd5b81516001600160401b0380821115613f26575f80fd5b9083019060408286031215613f39575f80fd5b613f41613937565b825160058110613f4f575f80fd5b8152602083015182811115613f62575f80fd5b613f6e87828601613ebe565b60208301525095945050505050565b805161368781613668565b5f60408284031215613f98575f80fd5b613fa0613937565b8251613fab81613668565b81526020928301519281019290925250919050565b5f60208284031215613fd0575f80fd5b81516001600160401b0380821115613fe6575f80fd5b908301906101008286031215613ffa575f80fd5b6140026138eb565b8251815261401260208401613f7d565b602082015261402360408401613f7d565b604082015261403460608401613f7d565b60608201526080830151608082015260a083015182811115614054575f80fd5b61406087828601613ebe565b60a08301525060c083015160c082015261407c60e08401613f7d565b60e082015295945050505050565b5f60e0828403121561409a575f80fd5b60405160e081018181106001600160401b03821117156140bc576140bc6138d7565b6040528251815260208301516140d181613668565b602082015260408301516140e481613668565b80604083015250606083015160608201526080830151608082015260a083015160a082015260c083015161411781613668565b60c08201529392505050565b5f60208284031215614133575f80fd5b81516001600160401b0380821115614149575f80fd5b90830190610160828603121561415d575f80fd5b614165613914565b61416e83613f7d565b81526020830151602082015261418660408401613f7d565b604082015261419760608401613f7d565b60608201526080830151608082015260a0830151828111156141b7575f80fd5b6141c387828601613ebe565b60a08301525060c083015160c08201526141df60e08401613f7d565b60e0820152610100838101519082015261012091506141ff828401613f7d565b9181019190915261014091820151918101919091529392505050565b5f6060828403121561422b575f80fd5b604051606081018181106001600160401b038211171561424d5761424d6138d7565b604052825181526020830151614262816136d5565b60208201526040830151614275816136d5565b60408201529392505050565b6020808252818101527f546f6b656e486f6d653a2072656d6f7465206e6f742072656769737465726564604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561042a5761042a6142b6565b60208082526022908201527f546f6b656e486f6d653a207a65726f20726571756972656420676173206c696d6040820152611a5d60f21b606082015260800190565b60208082526021908201527f546f6b656e486f6d653a206e6f6e2d7a65726f207365636f6e646172792066656040820152606560f81b606082015260800190565b8082018082111561042a5761042a6142b6565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b80841015614400578451831682529385019360019390930192908501906143de565b5060a0880151878203601f190160e0890152945061441e8186613c50565b98975050505050505050565b8681526001600160a01b0386811660208301528581166040830152841660608201526080810183905260c060a082018190525f9061441e90830184613c50565b634e487b7160e01b5f52601260045260245ffd5b5f8261448c5761448c61446a565b500690565b5f602082840312156144a1575f80fd5b81516107ba81613668565b60ff828116828216039081111561042a5761042a6142b6565b600181815b808511156144ff57815f19048211156144e5576144e56142b6565b808516156144f257918102915b93841c93908002906144ca565b509250929050565b5f826145155750600161042a565b8161452157505f61042a565b816001811461453757600281146145415761455d565b600191505061042a565b60ff841115614552576145526142b6565b50506001821b61042a565b5060208310610133831016604e8410600b8410161715614580575081810a61042a565b61458a83836144c5565b805f190482111561459d5761459d6142b6565b029392505050565b5f6107ba8383614507565b808202811582820484141761042a5761042a6142b6565b5f826145d5576145d561446a565b500490565b5f602082840312156145ea575f80fd5b815180151581146107ba575f80fd5b5f825161460a818460208701613c2e565b919091019291505056fe9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e6009316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e602d2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500914a9547f6c3ddce1d5efbd9e687708f0d1d408ce129e8e1a88bce4f40e29500de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a2646970667358221220eed07797a6ba88dde0a2fe869683f192fbb93dec6ee27cf4eee014b4907fe4f764736f6c6343000819003354656c65706f7274657252656769737472794170703a20696e76616c69642054", + Bin: "0x608060405234801561000f575f80fd5b5060405161502438038061502483398101604081905261002e91610893565b61003b8585858585610048565b505050505061090d565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f811580156100915750825b90505f826001600160401b031660011480156100ac5750303b155b9050811580156100ba575080155b156100d85760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561010657845460ff60401b1916680100000000000000001785555b6101138a8a8a8a8a610165565b831561015957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b61016d61018a565b61017a85858585856101da565b610183826101ff565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166101d857604051631afcd79f60e31b815260040160405180910390fd5b565b6101e261018a565b6101ed858585610248565b6101f5610268565b6101838282610278565b61020761018a565b7f914a9547f6c3ddce1d5efbd9e687708f0d1d408ce129e8e1a88bce4f40e2950080546001600160a01b0319166001600160a01b0392909216919091179055565b61025061018a565b61025a8382610404565b6102638261042a565b505050565b61027061018a565b6101d861043b565b61028061018a565b6001600160a01b0382166102db5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e206164647265737300000060448201526064015b60405180910390fd5b60128160ff16111561033a5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b60648201526084016102d2565b5f7f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e60090507302000000000000000000000000000000000000056001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d291906108f6565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b61040c61018a565b610414610465565b61041c610475565b610426828261047d565b5050565b61043261018a565b61004581610607565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75005b6001905550565b61046d61018a565b6101d8610641565b6101d861018a565b61048561018a565b6001600160a01b0382166105015760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016102d2565b5f7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0090505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610566573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061058a91906108f6565b116105df5760405162461bcd60e51b815260206004820152603260248201525f80516020615004833981519152604482015271656c65706f7274657220726567697374727960701b60648201526084016102d2565b81546001600160a01b0319166001600160a01b03821617825561060183610670565b50505050565b61060f61018a565b6001600160a01b03811661063857604051631e4fbdf760e01b81525f60048201526024016102d2565b61004581610808565b61064961018a565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0061045e565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa1580156106d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fb91906108f6565b60028301549091508184111561075a5760405162461bcd60e51b815260206004820152603160248201525f8051602061500483398151915260448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016102d2565b8084116107cf5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016102d2565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b80516001600160a01b038116811461088e575f80fd5b919050565b5f805f805f60a086880312156108a7575f80fd5b6108b086610878565b94506108be60208701610878565b9350604086015192506108d360608701610878565b9150608086015160ff811681146108e8575f80fd5b809150509295509295909350565b5f60208284031215610906575f80fd5b5051919050565b6146ea8061091a5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806365690038116100a9578063c8511ada1161006e578063c8511ada146102b4578063c868efaa14610388578063d2cc7a701461039b578063f2fde38b146103c2578063fd658268146103d5575f80fd5b80636569003814610232578063715018a6146102455780638da5cb5b1461024d578063909a6ac01461027d5780639731429714610291575f80fd5b80634511243e116100ef5780634511243e146101d15780634797735f146101e45780635d16225d146101f85780635eb995141461020b57806362e3901b1461021e575f80fd5b806310fe9ae81461012b578063154d625a146101745780632b0d8f18146101955780633bb03890146101aa5780634213cf78146101bd575b5f80fd5b7f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e601546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b61018761018236600461368c565b6103e8565b60405190815260200161016b565b6101a86101a33660046136ba565b610430565b005b6101a86101b83660046136e3565b610532565b5f8051602061461583398151915254610187565b6101a86101df3660046136ba565b610646565b6101875f8051602061467583398151915281565b6101a8610206366004613747565b610735565b6101a8610219366004613776565b610751565b6101875f8051602061461583398151915281565b6101a861024036600461378d565b610765565b6101a861078e565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610157565b6101875f8051602061469583398151915281565b6102a461029f3660046136ba565b6107a1565b604051901515815260200161016b565b6103516102c236600461368c565b60408051608080820183525f808352602080840182905283850182905260609384018290529581525f8051602061463583398151915286528381206001600160a01b039590951681529385529282902082519384018352805460ff9081161515855260018201549585019590955260028101549284019290925260039091015490921615159181019190915290565b60405161016b9190815115158152602080830151908201526040808301519082015260609182015115159181019190915260800190565b6101a86103963660046137d3565b6107c1565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0254610187565b6101a86103d03660046136ba565b61097e565b6101a86103e3366004613854565b6109b8565b5f8281527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03851684529091529020545b92915050565b5f805160206146958339815191526104466109c8565b6001600160a01b0382166104755760405162461bcd60e51b815260040161046c90613889565b60405180910390fd5b61047f81836109d0565b156104e25760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b606482015260840161046c565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156105765750825b90505f826001600160401b031660011480156105915750303b155b90508115801561059f575080155b156105bd5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156105e757845460ff60401b1916600160401b1785555b6105f48a8a8a8a8a6109f1565b831561063a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b5f8051602061469583398151915261065c6109c8565b6001600160a01b0382166106825760405162461bcd60e51b815260040161046c90613889565b61068c81836109d0565b6106ea5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b606482015260840161046c565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b61074d61074736849003840184613989565b82610a16565b5050565b6107596109c8565b61076281610c27565b50565b61074d61077d5f805160206146158339815191525490565b303361078886613a8b565b85610dbf565b610796610fcb565b61079f5f611026565b565b5f5f805160206146958339815191526107ba81846109d0565b9392505050565b6107c9611096565b5f5f8051602061469583398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610834573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108589190613b59565b10156108bf5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b606482015260840161046c565b6108c981336109d0565b1561092f5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b606482015260840161046c565b61096f858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506110e092505050565b506109786114d3565b50505050565b610986610fcb565b6001600160a01b0381166109af57604051631e4fbdf760e01b81525f600482015260240161046c565b61076281611026565b6109c38383836114fd565b505050565b61079f610fcb565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b6109f96116ed565b610a068585858585611736565b610a0f8261175b565b5050505050565b5f805160206146558339815191528054600114610a455760405162461bcd60e51b815260040161046c90613b70565b60028155610a5283611791565b60e08301516001600160a01b031615610a7d5760405162461bcd60e51b815260040161046c90613bb4565b5f80610a9b855f01518660200151868860600151896080015161183a565b915091505f604051806040016040528060016004811115610abe57610abe613bfa565b8152602001604051806040016040528089604001516001600160a01b0316815260200186815250604051602001610af59190613c0e565b60405160208183030381529060405281525090505f610bd46040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b606001516001600160a01b031681526020018781525081526020018960c0015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b604051908082528060200260200182016040528015610ba6578160200160208202803683370190505b50815260200184604051602001610bbd9190613c7b565b6040516020818303038152906040528152506119ff565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb528987604051610c12929190613cbd565b60405180910390a35050600190925550505050565b5f8051602061469583398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015610c7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9f9190613b59565b600283015490915081841115610d115760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b606482015260840161046c565b808411610d865760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e00606482015260840161046c565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b5f805160206146558339815191528054600114610dee5760405162461bcd60e51b815260040161046c90613b70565b60028155610dfb83611b1a565b60c08301516001600160a01b031615610e265760405162461bcd60e51b815260040161046c90613bb4565b5f80610e46855f015186602001518688610100015189610120015161183a565b915091505f604051806040016040528060026004811115610e6957610e69613bfa565b81526020016040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b0316815260200189604001516001600160a01b03168152602001868152602001896060015181526020018960a0015181526020018960e001516001600160a01b0316815250604051602001610eec9190613d3e565b60405160208183030381529060405281525090505f610f756040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b61010001516001600160a01b03168152602001878152508152602001896080015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050876001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168987604051610fb3929190613ddc565b60405180910390a35050600190925550505050505050565b33610ffd7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461079f5760405163118cdaa760e01b815233600482015260240161046c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016110da57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f5f8051602061461583398151915290505f828060200190518101906111069190613f00565b905060018151600481111561111d5761111d613bfa565b03611165575f816020015180602001905181019061113b9190613f88565b90505f61114d87878460200151611cff565b905061115c825f015182611d8a565b50505050505050565b60028151600481111561117a5761117a613bfa565b03611293575f81602001518060200190518101906111989190613fc0565b90505f6111aa87878460800151611cff565b825190915087146112105760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a206d69736d61746368656420736f7572636520626c6f60448201526918dad8da185a5b88125160b21b606482015260840161046c565b856001600160a01b031682602001516001600160a01b0316146112895760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e486f6d653a206d69736d617463686564206f726967696e2073656e60448201526a646572206164647265737360a81b606482015260840161046c565b61115c8282611ded565b6003815160048111156112a8576112a8613bfa565b0361137c575f81602001518060200190518101906112c6919061408a565b90505f806112de888885606001518660800151611fcd565b91509150611372604051806101000160405280855f0151815260200185602001516001600160a01b0316815260200185604001516001600160a01b03168152602001876001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018381526020015f81526020018560a0015181526020018560c001516001600160a01b031681525083612078565b5050505050505050565b60048151600481111561139157611391613bfa565b0361148c575f81602001518060200190518101906113af9190614123565b90505f806113c888888560800151866101400151611fcd565b915091506113728888855f01516040518061016001604052808860200151815260200188604001516001600160a01b0316815260200188606001516001600160a01b031681526020018860a00151815260200188610100015181526020018860c0015181526020018861012001516001600160a01b031681526020018860e001516001600160a01b031681526020018a6001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018681526020015f81525086612203565b5f815160048111156114a0576114a0613bfa565b03610a0f575f81602001518060200190518101906114be919061421b565b90506114cb8686836123e0565b505050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b5f80516020614655833981519152805460011461152c5760405162461bcd60e51b815260040161046c90613b70565b60028082555f8581525f80516020614635833981519152602090815260408083206001600160a01b03881684528252918290208251608081018452815460ff9081161515808352600184015494830194909452948201549381019390935260030154909216151560608201525f80516020614615833981519152916115c35760405162461bcd60e51b815260040161046c90614281565b5f8160200151116116205760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20636f6c6c61746572616c206e656564656044820152601960fa1b606482015260840161046c565b611629846127e7565b93505f80826020015186106116585760208301515f925061164a90876142ca565b90508260200151955061166b565b85836020015161166891906142ca565b91505b5f88815260028501602090815260408083206001600160a01b038b168085529083529281902060010185905580518981529182018590528a917f6769a5f9bfc8b6e0db839ab981cbf9239274ae72d2d035081a9157d43bd33cb6910160405180910390a380156116df576116df3382611d8a565b505060019092555050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661079f57604051631afcd79f60e31b815260040160405180910390fd5b61173e6116ed565b61174985858561280e565b611751612829565b610a0f8282612839565b6117636116ed565b5f8051602061467583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60408101516001600160a01b03166117f55760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20726563697069656e74206164647265736044820152607360f81b606482015260840161046c565b5f8160c00151116118185760405162461bcd60e51b815260040161046c906142dd565b60a0810151156107625760405162461bcd60e51b815260040161046c9061431f565b5f8581525f80516020614635833981519152602090815260408083206001600160a01b038816845282528083208151608081018352815460ff90811615158083526001840154958301959095526002830154938201939093526003909101549091161515606082015282915f8051602061461583398151915291906118d15760405162461bcd60e51b815260040161046c90614281565b6020810151156119335760405162461bcd60e51b815260206004820152602760248201527f546f6b656e486f6d653a20636f6c6c61746572616c206e656564656420666f726044820152662072656d6f746560c81b606482015260840161046c565b61193c876127e7565b965084156119525761194f8633876129a0565b94505b5f611966826040015183606001518a612af9565b90505f81116119b75760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f207363616c656420616d6f756e74000000604482015260640161046c565b5f8a815260038401602090815260408083206001600160a01b038d168452909152812080548392906119ea908490614360565b90915550909a95995094975050505050505050565b5f80611a09612b0f565b60408401516020015190915015611aae576040830151516001600160a01b0316611a8b5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b606482015260840161046c565b604083015160208101519051611aae916001600160a01b03909116908390612bff565b604051630624488560e41b81526001600160a01b03821690636244885090611ada908690600401614373565b6020604051808303815f875af1158015611af6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba9190613b59565b60408101516001600160a01b0316611b875760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420636f6e7472616044820152696374206164647265737360b01b606482015260840161046c565b5f816080015111611baa5760405162461bcd60e51b815260040161046c906142dd565b5f8160a0015111611c095760405162461bcd60e51b815260206004820152602360248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420676173206c696044820152621b5a5d60ea1b606482015260840161046c565b80608001518160a0015110611c6f5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420726563697069656e7420676173604482015265081b1a5b5a5d60d21b606482015260840161046c565b60e08101516001600160a01b0316611cdc5760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f2066616c6c6261636b20726563697069656044820152696e74206164647265737360b01b606482015260840161046c565b610140810151156107625760405162461bcd60e51b815260040161046c9061431f565b5f8381525f80516020614635833981519152602090815260408083206001600160a01b038616845282528083208151608081018352815460ff9081161515825260018301549482019490945260028201549281019290925260030154909116151560608201525f8051602061461583398151915290611d8081878787612c86565b9695505050505050565b6040518181525f80516020614675833981519152906001600160a01b038416907f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b9060200160405180910390a280546109c3906001600160a01b03168484612d7d565b5f80516020614675833981519152805460608401516001600160a01b0390911690611e1a90829085612bff565b5f845f01518560200151866040015184878960a00151604051602401611e459695949392919061442a565b60408051601f198184030181529190526020810180516001600160e01b03166394395edd60e01b17905260c086015160608701519192505f91611e89919084612ddc565b6060870151604051636eb1769f60e11b81523060048201526001600160a01b0391821660248201529192505f919085169063dd62ed3e90604401602060405180830381865afa158015611ede573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f029190613b59565b9050611f138488606001515f612de9565b8115611f655786606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff487604051611f5891815260200190565b60405180910390a2611fad565b86606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb087604051611fa491815260200190565b60405180910390a25b801561115c5760e087015161115c906001600160a01b0386169083612d7d565b5f8481525f80516020614635833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff90811615158252600183015494820194909452600282015492810192909252600301549091161515606082015281905f805160206146158339815191529082612051828a8a8a612c86565b90505f6120678360400151846060015189612e78565b919a91995090975050505050505050565b5f8051602061465583398151915280546001146120a75760405162461bcd60e51b815260040161046c90613b70565b600281556120b483611791565b5f6120cc845f01518560200151858760800151612e85565b9050805f036120e9576120e38460e0015184611d8a565b506121fb565b604080518082019091525f908060018152602001604051806040016040528088604001516001600160a01b031681526020018581525060405160200161212f9190613c0e565b60405160208183030381529060405281525090505f6121bb6040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a606001516001600160a01b031681526020018a6080015181525081526020018860c0015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050807f825080857c76cef4a1629c0705a7f8b4ef0282ddcafde0b6715c4fb34b68aaf087856040516121ef929190613cbd565b60405180910390a25050505b600190555050565b5f8051602061465583398151915280546001146122325760405162461bcd60e51b815260040161046c90613b70565b6002815561223f83611b1a565b5f612258845f0151856020015185876101200151612e85565b9050805f036122755761226f8460c0015184611d8a565b506123d5565b604080518082019091525f9080600281526020016040518061010001604052808b81526020018a6001600160a01b03168152602001896001600160a01b0316815260200188604001516001600160a01b03168152602001858152602001886060015181526020018860a0015181526020018860e001516001600160a01b03168152506040516020016123079190613d3e565b60405160208183030381529060405281525090505f6123956040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a61010001516001600160a01b031681526020018a61012001518152508152602001886080015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050807f42eff9005856e3c586b096d67211a566dc926052119fd7cc08023c70937ecb3087856040516123c9929190613ddc565b60405180910390a25050505b600190555050505050565b5f80516020614615833981519152836124475760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a207a65726f2072656d6f746520626c6f636b636861696044820152631b88125160e21b606482015260840161046c565b805484036124af5760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e486f6d653a2063616e6e6f742072656769737465722072656d6f7460448201526e329037b71039b0b6b29031b430b4b760891b606482015260840161046c565b6001600160a01b03831661251e5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e486f6d653a207a65726f2072656d6f746520746f6b656e2074726160448201526f6e73666572726572206164647265737360801b606482015260840161046c565b5f84815260028201602090815260408083206001600160a01b038716845290915290205460ff161561259e5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f746520616c726561647920726567697374604482015263195c995960e21b606482015260840161046c565b6012826040015160ff1611156126085760405162461bcd60e51b815260206004820152602960248201527f546f6b656e486f6d653a2072656d6f746520746f6b656e20646563696d616c73604482015268040e8dede40d0d2ced60bb1b606482015260840161046c565b6001810154602083015160ff908116600160a01b909204161461267c5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420686f6d6520746f6b656e20646560448201526563696d616c7360d01b606482015260840161046c565b5f8061269d8360010160149054906101000a900460ff168560400151612ff6565b915091505f6126b08383875f0151612e78565b90508180156126ca575084516126c790849061447e565b15155b156126dd576126da600182614360565b90505b6040518060800160405280600115158152602001828152602001848152602001831515815250846002015f8981526020019081526020015f205f886001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff02191690831515021790555060208201518160010155604082015181600201556060820151816003015f6101000a81548160ff021916908315150217905550905050856001600160a01b0316877ff229b02a51a4c8d5ef03a096ae0dd727d7b48b710d21b50ebebb560eef739b908388604001516040516127d692919091825260ff16602082015260400190565b60405180910390a350505050505050565b5f8051602061467583398151915280545f91906107ba906001600160a01b031633856129a0565b6128166116ed565b612820838261303e565b6109c382613060565b6128316116ed565b61079f613071565b6128416116ed565b6001600160a01b0382166128975760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e2061646472657373000000604482015260640161046c565b60128160ff1611156128f65760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b606482015260840161046c565b5f5f8051602061461583398151915290506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561294a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296e9190613b59565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa1580156129e6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0a9190613b59565b9050612a216001600160a01b038616853086613085565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612a65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a899190613b59565b9050818111612aef5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161046c565b611d8082826142ca565b5f612b0784848460016130be565b949350505050565b5f8051602061469583398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612b69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b8d9190614491565b9050612b9982826109d0565b1561042a5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b606482015260840161046c565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612c4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c709190613b59565b90506109788484612c818585614360565b612de9565b83515f90612ca65760405162461bcd60e51b815260040161046c90614281565b602085015115612d045760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f7465206e6f7420636f6c6c61746572616c6044820152631a5e995960e21b606482015260840161046c565b612d0f8484846130e5565b5f612d238660400151876060015185612e78565b90505f8111612d745760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e486f6d653a207a65726f20746f6b656e20616d6f756e7400000000604482015260640161046c565b95945050505050565b6040516001600160a01b038381166024830152604482018390526109c391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506131d2565b5f612b07845f8585613233565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612e3a8482613303565b610978576040516001600160a01b0384811660248301525f6044830152612e6e91869182169063095ea7b390606401612daa565b61097884826131d2565b5f612b078484845f6130be565b5f8481525f80516020614635833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff9081161580158352600184015495830195909552600283015493820193909352600390910154909116151560608201525f805160206146158339815191529180612f0b57505f8160200151115b15612f1a575f92505050612b07565b838511612f7e5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e486f6d653a20696e73756666696369656e7420616d6f756e74207460448201526b6f20636f766572206665657360a01b606482015260840161046c565b612f8884866142ca565b94505f612f9e8260400151836060015188612af9565b9050805f03612fb2575f9350505050612b07565b5f88815260038401602090815260408083206001600160a01b038b16845290915281208054839290612fe5908490614360565b909155509098975050505050505050565b5f8060ff8085169084161181816130195761301185876144ac565b60ff16613027565b61302386866144ac565b60ff165b61303290600a6145a5565b96919550909350505050565b6130466116ed565b61304e6133a0565b6130566133b0565b61074d82826133b8565b6130686116ed565b6107628161353c565b5f5f805160206146558339815191526114f6565b6040516001600160a01b0384811660248301528381166044830152606482018390526109789186918216906323b872dd90608401612daa565b5f811515841515036130db576130d485846145b0565b9050612b07565b612d7485846145c7565b5f8381527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03861684529091529020545f80516020614615833981519152908281101561319c5760405162461bcd60e51b815260206004820152602e60248201527f546f6b656e486f6d653a20696e73756666696369656e7420746f6b656e20747260448201526d616e736665722062616c616e636560901b606482015260840161046c565b6131a683826142ca565b5f9586526003909201602090815260408087206001600160a01b03909616875294905250919092205550565b5f6131e66001600160a01b03841683613544565b905080515f1415801561320a57508080602001905181019061320891906145da565b155b156109c357604051635274afe760e01b81526001600160a01b038416600482015260240161046c565b5f845a10156132845760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e74206761730000000000604482015260640161046c565b834710156132d45760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c7565000000604482015260640161046c565b826001600160a01b03163b5f036132ec57505f612b07565b5f805f84516020860188888bf19695505050505050565b5f805f846001600160a01b03168460405161331e91906145f9565b5f604051808303815f865af19150503d805f8114613357576040519150601f19603f3d011682016040523d82523d5f602084013e61335c565b606091505b509150915081801561338657508051158061338657508080602001905181019061338691906145da565b8015612d745750505050506001600160a01b03163b151590565b6133a86116ed565b61079f613551565b61079f6116ed565b6133c06116ed565b6001600160a01b03821661343c5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f727465722072656769737472792061646472657373000000000000000000606482015260840161046c565b5f5f8051602061469583398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134b29190613b59565b1161351a5760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b606482015260840161046c565b81546001600160a01b0319166001600160a01b03821617825561097883610c27565b6109866116ed565b60606107ba83835f613559565b6114d36116ed565b60608147101561357e5760405163cd78605960e01b815230600482015260240161046c565b5f80856001600160a01b0316848660405161359991906145f9565b5f6040518083038185875af1925050503d805f81146135d3576040519150601f19603f3d011682016040523d82523d5f602084013e6135d8565b606091505b5091509150611d808683836060826135f8576135f38261363f565b6107ba565b815115801561360f57506001600160a01b0384163b155b1561363857604051639996b31560e01b81526001600160a01b038516600482015260240161046c565b50806107ba565b80511561364f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b0381168114610762575f80fd5b803561368781613668565b919050565b5f806040838503121561369d575f80fd5b8235915060208301356136af81613668565b809150509250929050565b5f602082840312156136ca575f80fd5b81356107ba81613668565b60ff81168114610762575f80fd5b5f805f805f60a086880312156136f7575f80fd5b853561370281613668565b9450602086013561371281613668565b935060408601359250606086013561372981613668565b91506080860135613739816136d5565b809150509295509295909350565b5f8082840361012081121561375a575f80fd5b61010080821215613769575f80fd5b9395938601359450505050565b5f60208284031215613786575f80fd5b5035919050565b5f806040838503121561379e575f80fd5b82356001600160401b038111156137b3575f80fd5b830161016081860312156137c5575f80fd5b946020939093013593505050565b5f805f80606085870312156137e6575f80fd5b8435935060208501356137f881613668565b925060408501356001600160401b0380821115613813575f80fd5b818701915087601f830112613826575f80fd5b813581811115613834575f80fd5b886020828501011115613845575f80fd5b95989497505060200194505050565b5f805f60608486031215613866575f80fd5b83359250602084013561387881613668565b929592945050506040919091013590565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b60405161010081016001600160401b038111828210171561390e5761390e6138d7565b60405290565b60405161016081016001600160401b038111828210171561390e5761390e6138d7565b604080519081016001600160401b038111828210171561390e5761390e6138d7565b604051601f8201601f191681016001600160401b0381118282101715613981576139816138d7565b604052919050565b5f610100828403121561399a575f80fd5b6139a26138eb565b8235815260208301356139b481613668565b602082015260408301356139c781613668565b60408201526139d86060840161367c565b60608201526080830135608082015260a083013560a082015260c083013560c0820152613a0760e0840161367c565b60e08201529392505050565b5f6001600160401b03821115613a2b57613a2b6138d7565b50601f01601f191660200190565b5f82601f830112613a48575f80fd5b8135613a5b613a5682613a13565b613959565b818152846020838601011115613a6f575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6101608236031215613a9c575f80fd5b613aa4613914565b82358152613ab46020840161367c565b6020820152613ac56040840161367c565b604082015260608301356001600160401b03811115613ae2575f80fd5b613aee36828601613a39565b6060830152506080830135608082015260a083013560a0820152613b1460c0840161367c565b60c0820152613b2560e0840161367c565b60e0820152610100613b3881850161367c565b90820152610120838101359082015261014092830135928101929092525090565b5f60208284031215613b69575f80fd5b5051919050565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b60208082526026908201527f546f6b656e486f6d653a206e6f6e2d7a65726f206d756c74692d686f702066616040820152656c6c6261636b60d01b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b81516001600160a01b03168152602080830151908201526040810161042a565b5f5b83811015613c48578181015183820152602001613c30565b50505f910152565b5f8151808452613c67816020860160208601613c2e565b601f01601f19169290920160200192915050565b602081525f825160058110613c9e57634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612b076060840182613c50565b5f6101208201905083518252602084015160018060a01b03808216602085015280604087015116604085015280606087015116606085015250506080840151608083015260a084015160a083015260c084015160c083015260e0840151613d2f60e08401826001600160a01b03169052565b50826101008301529392505050565b60208152815160208201525f602083015160018060a01b03808216604085015280604086015116606085015250506060830151613d8660808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c0850152613dad610120850183613c50565b915060c085015160e085015260e0850151613dd2828601826001600160a01b03169052565b5090949350505050565b60408152825160408201525f6020840151613e0260608401826001600160a01b03169052565b5060408401516001600160a01b03166080830152606084015161016060a08401819052613e336101a0850183613c50565b9150608086015160c085015260a086015160e085015260c0860151610100613e65818701836001600160a01b03169052565b60e08801519150610120613e83818801846001600160a01b03169052565b90880151915061014090613ea1878301846001600160a01b03169052565b880151928601929092525090940151610180830152506020015290565b5f82601f830112613ecd575f80fd5b8151613edb613a5682613a13565b818152846020838601011115613eef575f80fd5b612b07826020830160208701613c2e565b5f60208284031215613f10575f80fd5b81516001600160401b0380821115613f26575f80fd5b9083019060408286031215613f39575f80fd5b613f41613937565b825160058110613f4f575f80fd5b8152602083015182811115613f62575f80fd5b613f6e87828601613ebe565b60208301525095945050505050565b805161368781613668565b5f60408284031215613f98575f80fd5b613fa0613937565b8251613fab81613668565b81526020928301519281019290925250919050565b5f60208284031215613fd0575f80fd5b81516001600160401b0380821115613fe6575f80fd5b908301906101008286031215613ffa575f80fd5b6140026138eb565b8251815261401260208401613f7d565b602082015261402360408401613f7d565b604082015261403460608401613f7d565b60608201526080830151608082015260a083015182811115614054575f80fd5b61406087828601613ebe565b60a08301525060c083015160c082015261407c60e08401613f7d565b60e082015295945050505050565b5f60e0828403121561409a575f80fd5b60405160e081018181106001600160401b03821117156140bc576140bc6138d7565b6040528251815260208301516140d181613668565b602082015260408301516140e481613668565b80604083015250606083015160608201526080830151608082015260a083015160a082015260c083015161411781613668565b60c08201529392505050565b5f60208284031215614133575f80fd5b81516001600160401b0380821115614149575f80fd5b90830190610160828603121561415d575f80fd5b614165613914565b61416e83613f7d565b81526020830151602082015261418660408401613f7d565b604082015261419760608401613f7d565b60608201526080830151608082015260a0830151828111156141b7575f80fd5b6141c387828601613ebe565b60a08301525060c083015160c08201526141df60e08401613f7d565b60e0820152610100838101519082015261012091506141ff828401613f7d565b9181019190915261014091820151918101919091529392505050565b5f6060828403121561422b575f80fd5b604051606081018181106001600160401b038211171561424d5761424d6138d7565b604052825181526020830151614262816136d5565b60208201526040830151614275816136d5565b60408201529392505050565b6020808252818101527f546f6b656e486f6d653a2072656d6f7465206e6f742072656769737465726564604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561042a5761042a6142b6565b60208082526022908201527f546f6b656e486f6d653a207a65726f20726571756972656420676173206c696d6040820152611a5d60f21b606082015260800190565b60208082526021908201527f546f6b656e486f6d653a206e6f6e2d7a65726f207365636f6e646172792066656040820152606560f81b606082015260800190565b8082018082111561042a5761042a6142b6565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b80841015614400578451831682529385019360019390930192908501906143de565b5060a0880151878203601f190160e0890152945061441e8186613c50565b98975050505050505050565b8681526001600160a01b0386811660208301528581166040830152841660608201526080810183905260c060a082018190525f9061441e90830184613c50565b634e487b7160e01b5f52601260045260245ffd5b5f8261448c5761448c61446a565b500690565b5f602082840312156144a1575f80fd5b81516107ba81613668565b60ff828116828216039081111561042a5761042a6142b6565b600181815b808511156144ff57815f19048211156144e5576144e56142b6565b808516156144f257918102915b93841c93908002906144ca565b509250929050565b5f826145155750600161042a565b8161452157505f61042a565b816001811461453757600281146145415761455d565b600191505061042a565b60ff841115614552576145526142b6565b50506001821b61042a565b5060208310610133831016604e8410600b8410161715614580575081810a61042a565b61458a83836144c5565b805f190482111561459d5761459d6142b6565b029392505050565b5f6107ba8383614507565b808202811582820484141761042a5761042a6142b6565b5f826145d5576145d561446a565b500490565b5f602082840312156145ea575f80fd5b815180151581146107ba575f80fd5b5f825161460a818460208701613c2e565b919091019291505056fe9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e6009316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e602d2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500914a9547f6c3ddce1d5efbd9e687708f0d1d408ce129e8e1a88bce4f40e29500de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a2646970667358221220662847510693b11f52f94f6888d3f0593f6536bb478648a59b4b6388b549da3264736f6c6343000819003354656c65706f7274657252656769737472794170703a20696e76616c69642054", } // ERC20TokenHomeABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/ictt/TokenHome/ERC20TokenHomeUpgradeable/ERC20TokenHomeUpgradeable.go b/abi-bindings/go/ictt/TokenHome/ERC20TokenHomeUpgradeable/ERC20TokenHomeUpgradeable.go index 4f6b39cf1..55e87bd64 100644 --- a/abi-bindings/go/ictt/TokenHome/ERC20TokenHomeUpgradeable/ERC20TokenHomeUpgradeable.go +++ b/abi-bindings/go/ictt/TokenHome/ERC20TokenHomeUpgradeable/ERC20TokenHomeUpgradeable.go @@ -67,7 +67,7 @@ type SendTokensInput struct { // ERC20TokenHomeUpgradeableMetaData contains all meta data concerning the ERC20TokenHomeUpgradeable contract. var ERC20TokenHomeUpgradeableMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remaining\",\"type\":\"uint256\"}],\"name\":\"CollateralAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldMinTeleporterVersion\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newMinTeleporterVersion\",\"type\":\"uint256\"}],\"name\":\"MinTeleporterVersionUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"initialCollateralNeeded\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"RemoteRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressUnpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensAndCallRouted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensAndCallSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensRouted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ERC20_TOKEN_HOME_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TELEPORTER_REGISTRY_APP_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_HOME_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"addCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinTeleporterVersion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"}],\"name\":\"getRemoteTokenTransferrerSettings\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"registered\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"collateralNeeded\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenMultiplier\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"multiplyOnRemote\",\"type\":\"bool\"}],\"internalType\":\"structRemoteTokenTransferrerSettings\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"}],\"name\":\"getTransferredBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterRegistryAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"teleporterManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minTeleporterVersion\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"isTeleporterAddressPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"pauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"originSenderAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"receiveTeleporterMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"send\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sendAndCall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"unpauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"updateMinTeleporterVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161483738038061483783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146ea8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806365690038116100a9578063c8511ada1161006e578063c8511ada146102b4578063c868efaa14610388578063d2cc7a701461039b578063f2fde38b146103c2578063fd658268146103d5575f80fd5b80636569003814610232578063715018a6146102455780638da5cb5b1461024d578063909a6ac01461027d5780639731429714610291575f80fd5b80634511243e116100ef5780634511243e146101d15780634797735f146101e45780635d16225d146101f85780635eb995141461020b57806362e3901b1461021e575f80fd5b806310fe9ae81461012b578063154d625a146101745780632b0d8f18146101955780633bb03890146101aa5780634213cf78146101bd575b5f80fd5b7f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e601546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b61018761018236600461368c565b6103e8565b60405190815260200161016b565b6101a86101a33660046136ba565b610430565b005b6101a86101b83660046136e3565b610532565b5f8051602061461583398151915254610187565b6101a86101df3660046136ba565b610646565b6101875f8051602061467583398151915281565b6101a8610206366004613747565b610735565b6101a8610219366004613776565b610751565b6101875f8051602061461583398151915281565b6101a861024036600461378d565b610765565b6101a861078e565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610157565b6101875f8051602061469583398151915281565b6102a461029f3660046136ba565b6107a1565b604051901515815260200161016b565b6103516102c236600461368c565b60408051608080820183525f808352602080840182905283850182905260609384018290529581525f8051602061463583398151915286528381206001600160a01b039590951681529385529282902082519384018352805460ff9081161515855260018201549585019590955260028101549284019290925260039091015490921615159181019190915290565b60405161016b9190815115158152602080830151908201526040808301519082015260609182015115159181019190915260800190565b6101a86103963660046137d3565b6107c1565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0254610187565b6101a86103d03660046136ba565b61097e565b6101a86103e3366004613854565b6109b8565b5f8281527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03851684529091529020545b92915050565b5f805160206146958339815191526104466109c8565b6001600160a01b0382166104755760405162461bcd60e51b815260040161046c90613889565b60405180910390fd5b61047f81836109d0565b156104e25760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b606482015260840161046c565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156105765750825b90505f826001600160401b031660011480156105915750303b155b90508115801561059f575080155b156105bd5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156105e757845460ff60401b1916600160401b1785555b6105f48a8a8a8a8a6109f1565b831561063a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b5f8051602061469583398151915261065c6109c8565b6001600160a01b0382166106825760405162461bcd60e51b815260040161046c90613889565b61068c81836109d0565b6106ea5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b606482015260840161046c565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b61074d61074736849003840184613989565b82610a16565b5050565b6107596109c8565b61076281610c27565b50565b61074d61077d5f805160206146158339815191525490565b303361078886613a8b565b85610dbf565b610796610fcb565b61079f5f611026565b565b5f5f805160206146958339815191526107ba81846109d0565b9392505050565b6107c9611096565b5f5f8051602061469583398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610834573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108589190613b59565b10156108bf5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b606482015260840161046c565b6108c981336109d0565b1561092f5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b606482015260840161046c565b61096f858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506110e092505050565b506109786114d3565b50505050565b610986610fcb565b6001600160a01b0381166109af57604051631e4fbdf760e01b81525f600482015260240161046c565b61076281611026565b6109c38383836114fd565b505050565b61079f610fcb565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b6109f96116ed565b610a068585858585611736565b610a0f8261175b565b5050505050565b5f805160206146558339815191528054600114610a455760405162461bcd60e51b815260040161046c90613b70565b60028155610a5283611791565b60e08301516001600160a01b031615610a7d5760405162461bcd60e51b815260040161046c90613bb4565b5f80610a9b855f01518660200151868860600151896080015161183a565b915091505f604051806040016040528060016004811115610abe57610abe613bfa565b8152602001604051806040016040528089604001516001600160a01b0316815260200186815250604051602001610af59190613c0e565b60405160208183030381529060405281525090505f610bd46040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b606001516001600160a01b031681526020018781525081526020018960c0015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b604051908082528060200260200182016040528015610ba6578160200160208202803683370190505b50815260200184604051602001610bbd9190613c7b565b6040516020818303038152906040528152506119ff565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb528987604051610c12929190613cbd565b60405180910390a35050600190925550505050565b5f8051602061469583398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015610c7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9f9190613b59565b600283015490915081841115610d115760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b606482015260840161046c565b808411610d865760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e00606482015260840161046c565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b5f805160206146558339815191528054600114610dee5760405162461bcd60e51b815260040161046c90613b70565b60028155610dfb83611b1a565b60c08301516001600160a01b031615610e265760405162461bcd60e51b815260040161046c90613bb4565b5f80610e46855f015186602001518688610100015189610120015161183a565b915091505f604051806040016040528060026004811115610e6957610e69613bfa565b81526020016040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b0316815260200189604001516001600160a01b03168152602001868152602001896060015181526020018960a0015181526020018960e001516001600160a01b0316815250604051602001610eec9190613d3e565b60405160208183030381529060405281525090505f610f756040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b61010001516001600160a01b03168152602001878152508152602001896080015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050876001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168987604051610fb3929190613ddc565b60405180910390a35050600190925550505050505050565b33610ffd7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461079f5760405163118cdaa760e01b815233600482015260240161046c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016110da57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f5f8051602061461583398151915290505f828060200190518101906111069190613f00565b905060018151600481111561111d5761111d613bfa565b03611165575f816020015180602001905181019061113b9190613f88565b90505f61114d87878460200151611cff565b905061115c825f015182611d8a565b50505050505050565b60028151600481111561117a5761117a613bfa565b03611293575f81602001518060200190518101906111989190613fc0565b90505f6111aa87878460800151611cff565b825190915087146112105760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a206d69736d61746368656420736f7572636520626c6f60448201526918dad8da185a5b88125160b21b606482015260840161046c565b856001600160a01b031682602001516001600160a01b0316146112895760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e486f6d653a206d69736d617463686564206f726967696e2073656e60448201526a646572206164647265737360a81b606482015260840161046c565b61115c8282611ded565b6003815160048111156112a8576112a8613bfa565b0361137c575f81602001518060200190518101906112c6919061408a565b90505f806112de888885606001518660800151611fcd565b91509150611372604051806101000160405280855f0151815260200185602001516001600160a01b0316815260200185604001516001600160a01b03168152602001876001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018381526020015f81526020018560a0015181526020018560c001516001600160a01b031681525083612078565b5050505050505050565b60048151600481111561139157611391613bfa565b0361148c575f81602001518060200190518101906113af9190614123565b90505f806113c888888560800151866101400151611fcd565b915091506113728888855f01516040518061016001604052808860200151815260200188604001516001600160a01b0316815260200188606001516001600160a01b031681526020018860a00151815260200188610100015181526020018860c0015181526020018861012001516001600160a01b031681526020018860e001516001600160a01b031681526020018a6001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018681526020015f81525086612203565b5f815160048111156114a0576114a0613bfa565b03610a0f575f81602001518060200190518101906114be919061421b565b90506114cb8686836123e0565b505050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b5f80516020614655833981519152805460011461152c5760405162461bcd60e51b815260040161046c90613b70565b60028082555f8581525f80516020614635833981519152602090815260408083206001600160a01b03881684528252918290208251608081018452815460ff9081161515808352600184015494830194909452948201549381019390935260030154909216151560608201525f80516020614615833981519152916115c35760405162461bcd60e51b815260040161046c90614281565b5f8160200151116116205760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20636f6c6c61746572616c206e656564656044820152601960fa1b606482015260840161046c565b611629846127e7565b93505f80826020015186106116585760208301515f925061164a90876142ca565b90508260200151955061166b565b85836020015161166891906142ca565b91505b5f88815260028501602090815260408083206001600160a01b038b168085529083529281902060010185905580518981529182018590528a917f6769a5f9bfc8b6e0db839ab981cbf9239274ae72d2d035081a9157d43bd33cb6910160405180910390a380156116df576116df3382611d8a565b505060019092555050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661079f57604051631afcd79f60e31b815260040160405180910390fd5b61173e6116ed565b61174985858561280e565b611751612829565b610a0f8282612839565b6117636116ed565b5f8051602061467583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60408101516001600160a01b03166117f55760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20726563697069656e74206164647265736044820152607360f81b606482015260840161046c565b5f8160c00151116118185760405162461bcd60e51b815260040161046c906142dd565b60a0810151156107625760405162461bcd60e51b815260040161046c9061431f565b5f8581525f80516020614635833981519152602090815260408083206001600160a01b038816845282528083208151608081018352815460ff90811615158083526001840154958301959095526002830154938201939093526003909101549091161515606082015282915f8051602061461583398151915291906118d15760405162461bcd60e51b815260040161046c90614281565b6020810151156119335760405162461bcd60e51b815260206004820152602760248201527f546f6b656e486f6d653a20636f6c6c61746572616c206e656564656420666f726044820152662072656d6f746560c81b606482015260840161046c565b61193c876127e7565b965084156119525761194f8633876129a0565b94505b5f611966826040015183606001518a612af9565b90505f81116119b75760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f207363616c656420616d6f756e74000000604482015260640161046c565b5f8a815260038401602090815260408083206001600160a01b038d168452909152812080548392906119ea908490614360565b90915550909a95995094975050505050505050565b5f80611a09612b0f565b60408401516020015190915015611aae576040830151516001600160a01b0316611a8b5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b606482015260840161046c565b604083015160208101519051611aae916001600160a01b03909116908390612bff565b604051630624488560e41b81526001600160a01b03821690636244885090611ada908690600401614373565b6020604051808303815f875af1158015611af6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba9190613b59565b60408101516001600160a01b0316611b875760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420636f6e7472616044820152696374206164647265737360b01b606482015260840161046c565b5f816080015111611baa5760405162461bcd60e51b815260040161046c906142dd565b5f8160a0015111611c095760405162461bcd60e51b815260206004820152602360248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420676173206c696044820152621b5a5d60ea1b606482015260840161046c565b80608001518160a0015110611c6f5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420726563697069656e7420676173604482015265081b1a5b5a5d60d21b606482015260840161046c565b60e08101516001600160a01b0316611cdc5760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f2066616c6c6261636b20726563697069656044820152696e74206164647265737360b01b606482015260840161046c565b610140810151156107625760405162461bcd60e51b815260040161046c9061431f565b5f8381525f80516020614635833981519152602090815260408083206001600160a01b038616845282528083208151608081018352815460ff9081161515825260018301549482019490945260028201549281019290925260030154909116151560608201525f8051602061461583398151915290611d8081878787612c86565b9695505050505050565b6040518181525f80516020614675833981519152906001600160a01b038416907f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b9060200160405180910390a280546109c3906001600160a01b03168484612d7d565b5f80516020614675833981519152805460608401516001600160a01b0390911690611e1a90829085612bff565b5f845f01518560200151866040015184878960a00151604051602401611e459695949392919061442a565b60408051601f198184030181529190526020810180516001600160e01b03166394395edd60e01b17905260c086015160608701519192505f91611e89919084612ddc565b6060870151604051636eb1769f60e11b81523060048201526001600160a01b0391821660248201529192505f919085169063dd62ed3e90604401602060405180830381865afa158015611ede573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f029190613b59565b9050611f138488606001515f612de9565b8115611f655786606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff487604051611f5891815260200190565b60405180910390a2611fad565b86606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb087604051611fa491815260200190565b60405180910390a25b801561115c5760e087015161115c906001600160a01b0386169083612d7d565b5f8481525f80516020614635833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff90811615158252600183015494820194909452600282015492810192909252600301549091161515606082015281905f805160206146158339815191529082612051828a8a8a612c86565b90505f6120678360400151846060015189612e78565b919a91995090975050505050505050565b5f8051602061465583398151915280546001146120a75760405162461bcd60e51b815260040161046c90613b70565b600281556120b483611791565b5f6120cc845f01518560200151858760800151612e85565b9050805f036120e9576120e38460e0015184611d8a565b506121fb565b604080518082019091525f908060018152602001604051806040016040528088604001516001600160a01b031681526020018581525060405160200161212f9190613c0e565b60405160208183030381529060405281525090505f6121bb6040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a606001516001600160a01b031681526020018a6080015181525081526020018860c0015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050807f825080857c76cef4a1629c0705a7f8b4ef0282ddcafde0b6715c4fb34b68aaf087856040516121ef929190613cbd565b60405180910390a25050505b600190555050565b5f8051602061465583398151915280546001146122325760405162461bcd60e51b815260040161046c90613b70565b6002815561223f83611b1a565b5f612258845f0151856020015185876101200151612e85565b9050805f036122755761226f8460c0015184611d8a565b506123d5565b604080518082019091525f9080600281526020016040518061010001604052808b81526020018a6001600160a01b03168152602001896001600160a01b0316815260200188604001516001600160a01b03168152602001858152602001886060015181526020018860a0015181526020018860e001516001600160a01b03168152506040516020016123079190613d3e565b60405160208183030381529060405281525090505f6123956040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a61010001516001600160a01b031681526020018a61012001518152508152602001886080015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050807f42eff9005856e3c586b096d67211a566dc926052119fd7cc08023c70937ecb3087856040516123c9929190613ddc565b60405180910390a25050505b600190555050505050565b5f80516020614615833981519152836124475760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a207a65726f2072656d6f746520626c6f636b636861696044820152631b88125160e21b606482015260840161046c565b805484036124af5760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e486f6d653a2063616e6e6f742072656769737465722072656d6f7460448201526e329037b71039b0b6b29031b430b4b760891b606482015260840161046c565b6001600160a01b03831661251e5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e486f6d653a207a65726f2072656d6f746520746f6b656e2074726160448201526f6e73666572726572206164647265737360801b606482015260840161046c565b5f84815260028201602090815260408083206001600160a01b038716845290915290205460ff161561259e5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f746520616c726561647920726567697374604482015263195c995960e21b606482015260840161046c565b6012826040015160ff1611156126085760405162461bcd60e51b815260206004820152602960248201527f546f6b656e486f6d653a2072656d6f746520746f6b656e20646563696d616c73604482015268040e8dede40d0d2ced60bb1b606482015260840161046c565b6001810154602083015160ff908116600160a01b909204161461267c5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420686f6d6520746f6b656e20646560448201526563696d616c7360d01b606482015260840161046c565b5f8061269d8360010160149054906101000a900460ff168560400151612ff6565b915091505f6126b08383875f0151612e78565b90508180156126ca575084516126c790849061447e565b15155b156126dd576126da600182614360565b90505b6040518060800160405280600115158152602001828152602001848152602001831515815250846002015f8981526020019081526020015f205f886001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff02191690831515021790555060208201518160010155604082015181600201556060820151816003015f6101000a81548160ff021916908315150217905550905050856001600160a01b0316877ff229b02a51a4c8d5ef03a096ae0dd727d7b48b710d21b50ebebb560eef739b908388604001516040516127d692919091825260ff16602082015260400190565b60405180910390a350505050505050565b5f8051602061467583398151915280545f91906107ba906001600160a01b031633856129a0565b6128166116ed565b612820838261303e565b6109c382613060565b6128316116ed565b61079f613071565b6128416116ed565b6001600160a01b0382166128975760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e2061646472657373000000604482015260640161046c565b60128160ff1611156128f65760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b606482015260840161046c565b5f5f8051602061461583398151915290506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561294a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296e9190613b59565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa1580156129e6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0a9190613b59565b9050612a216001600160a01b038616853086613085565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612a65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a899190613b59565b9050818111612aef5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161046c565b611d8082826142ca565b5f612b0784848460016130be565b949350505050565b5f8051602061469583398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612b69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b8d9190614491565b9050612b9982826109d0565b1561042a5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b606482015260840161046c565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612c4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c709190613b59565b90506109788484612c818585614360565b612de9565b83515f90612ca65760405162461bcd60e51b815260040161046c90614281565b602085015115612d045760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f7465206e6f7420636f6c6c61746572616c6044820152631a5e995960e21b606482015260840161046c565b612d0f8484846130e5565b5f612d238660400151876060015185612e78565b90505f8111612d745760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e486f6d653a207a65726f20746f6b656e20616d6f756e7400000000604482015260640161046c565b95945050505050565b6040516001600160a01b038381166024830152604482018390526109c391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506131d2565b5f612b07845f8585613233565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612e3a8482613303565b610978576040516001600160a01b0384811660248301525f6044830152612e6e91869182169063095ea7b390606401612daa565b61097884826131d2565b5f612b078484845f6130be565b5f8481525f80516020614635833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff9081161580158352600184015495830195909552600283015493820193909352600390910154909116151560608201525f805160206146158339815191529180612f0b57505f8160200151115b15612f1a575f92505050612b07565b838511612f7e5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e486f6d653a20696e73756666696369656e7420616d6f756e74207460448201526b6f20636f766572206665657360a01b606482015260840161046c565b612f8884866142ca565b94505f612f9e8260400151836060015188612af9565b9050805f03612fb2575f9350505050612b07565b5f88815260038401602090815260408083206001600160a01b038b16845290915281208054839290612fe5908490614360565b909155509098975050505050505050565b5f8060ff8085169084161181816130195761301185876144ac565b60ff16613027565b61302386866144ac565b60ff165b61303290600a6145a5565b96919550909350505050565b6130466116ed565b61304e6133a0565b6130566133b0565b61074d82826133b8565b6130686116ed565b6107628161353c565b5f5f805160206146558339815191526114f6565b6040516001600160a01b0384811660248301528381166044830152606482018390526109789186918216906323b872dd90608401612daa565b5f811515841515036130db576130d485846145b0565b9050612b07565b612d7485846145c7565b5f8381527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03861684529091529020545f80516020614615833981519152908281101561319c5760405162461bcd60e51b815260206004820152602e60248201527f546f6b656e486f6d653a20696e73756666696369656e7420746f6b656e20747260448201526d616e736665722062616c616e636560901b606482015260840161046c565b6131a683826142ca565b5f9586526003909201602090815260408087206001600160a01b03909616875294905250919092205550565b5f6131e66001600160a01b03841683613544565b905080515f1415801561320a57508080602001905181019061320891906145da565b155b156109c357604051635274afe760e01b81526001600160a01b038416600482015260240161046c565b5f845a10156132845760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e74206761730000000000604482015260640161046c565b834710156132d45760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c7565000000604482015260640161046c565b826001600160a01b03163b5f036132ec57505f612b07565b5f805f84516020860188888bf19695505050505050565b5f805f846001600160a01b03168460405161331e91906145f9565b5f604051808303815f865af19150503d805f8114613357576040519150601f19603f3d011682016040523d82523d5f602084013e61335c565b606091505b509150915081801561338657508051158061338657508080602001905181019061338691906145da565b8015612d745750505050506001600160a01b03163b151590565b6133a86116ed565b61079f613551565b61079f6116ed565b6133c06116ed565b6001600160a01b03821661343c5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f727465722072656769737472792061646472657373000000000000000000606482015260840161046c565b5f5f8051602061469583398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134b29190613b59565b1161351a5760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b606482015260840161046c565b81546001600160a01b0319166001600160a01b03821617825561097883610c27565b6109866116ed565b60606107ba83835f613559565b6114d36116ed565b60608147101561357e5760405163cd78605960e01b815230600482015260240161046c565b5f80856001600160a01b0316848660405161359991906145f9565b5f6040518083038185875af1925050503d805f81146135d3576040519150601f19603f3d011682016040523d82523d5f602084013e6135d8565b606091505b5091509150611d808683836060826135f8576135f38261363f565b6107ba565b815115801561360f57506001600160a01b0384163b155b1561363857604051639996b31560e01b81526001600160a01b038516600482015260240161046c565b50806107ba565b80511561364f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b0381168114610762575f80fd5b803561368781613668565b919050565b5f806040838503121561369d575f80fd5b8235915060208301356136af81613668565b809150509250929050565b5f602082840312156136ca575f80fd5b81356107ba81613668565b60ff81168114610762575f80fd5b5f805f805f60a086880312156136f7575f80fd5b853561370281613668565b9450602086013561371281613668565b935060408601359250606086013561372981613668565b91506080860135613739816136d5565b809150509295509295909350565b5f8082840361012081121561375a575f80fd5b61010080821215613769575f80fd5b9395938601359450505050565b5f60208284031215613786575f80fd5b5035919050565b5f806040838503121561379e575f80fd5b82356001600160401b038111156137b3575f80fd5b830161016081860312156137c5575f80fd5b946020939093013593505050565b5f805f80606085870312156137e6575f80fd5b8435935060208501356137f881613668565b925060408501356001600160401b0380821115613813575f80fd5b818701915087601f830112613826575f80fd5b813581811115613834575f80fd5b886020828501011115613845575f80fd5b95989497505060200194505050565b5f805f60608486031215613866575f80fd5b83359250602084013561387881613668565b929592945050506040919091013590565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b60405161010081016001600160401b038111828210171561390e5761390e6138d7565b60405290565b60405161016081016001600160401b038111828210171561390e5761390e6138d7565b604080519081016001600160401b038111828210171561390e5761390e6138d7565b604051601f8201601f191681016001600160401b0381118282101715613981576139816138d7565b604052919050565b5f610100828403121561399a575f80fd5b6139a26138eb565b8235815260208301356139b481613668565b602082015260408301356139c781613668565b60408201526139d86060840161367c565b60608201526080830135608082015260a083013560a082015260c083013560c0820152613a0760e0840161367c565b60e08201529392505050565b5f6001600160401b03821115613a2b57613a2b6138d7565b50601f01601f191660200190565b5f82601f830112613a48575f80fd5b8135613a5b613a5682613a13565b613959565b818152846020838601011115613a6f575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6101608236031215613a9c575f80fd5b613aa4613914565b82358152613ab46020840161367c565b6020820152613ac56040840161367c565b604082015260608301356001600160401b03811115613ae2575f80fd5b613aee36828601613a39565b6060830152506080830135608082015260a083013560a0820152613b1460c0840161367c565b60c0820152613b2560e0840161367c565b60e0820152610100613b3881850161367c565b90820152610120838101359082015261014092830135928101929092525090565b5f60208284031215613b69575f80fd5b5051919050565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b60208082526026908201527f546f6b656e486f6d653a206e6f6e2d7a65726f206d756c74692d686f702066616040820152656c6c6261636b60d01b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b81516001600160a01b03168152602080830151908201526040810161042a565b5f5b83811015613c48578181015183820152602001613c30565b50505f910152565b5f8151808452613c67816020860160208601613c2e565b601f01601f19169290920160200192915050565b602081525f825160058110613c9e57634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612b076060840182613c50565b5f6101208201905083518252602084015160018060a01b03808216602085015280604087015116604085015280606087015116606085015250506080840151608083015260a084015160a083015260c084015160c083015260e0840151613d2f60e08401826001600160a01b03169052565b50826101008301529392505050565b60208152815160208201525f602083015160018060a01b03808216604085015280604086015116606085015250506060830151613d8660808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c0850152613dad610120850183613c50565b915060c085015160e085015260e0850151613dd2828601826001600160a01b03169052565b5090949350505050565b60408152825160408201525f6020840151613e0260608401826001600160a01b03169052565b5060408401516001600160a01b03166080830152606084015161016060a08401819052613e336101a0850183613c50565b9150608086015160c085015260a086015160e085015260c0860151610100613e65818701836001600160a01b03169052565b60e08801519150610120613e83818801846001600160a01b03169052565b90880151915061014090613ea1878301846001600160a01b03169052565b880151928601929092525090940151610180830152506020015290565b5f82601f830112613ecd575f80fd5b8151613edb613a5682613a13565b818152846020838601011115613eef575f80fd5b612b07826020830160208701613c2e565b5f60208284031215613f10575f80fd5b81516001600160401b0380821115613f26575f80fd5b9083019060408286031215613f39575f80fd5b613f41613937565b825160058110613f4f575f80fd5b8152602083015182811115613f62575f80fd5b613f6e87828601613ebe565b60208301525095945050505050565b805161368781613668565b5f60408284031215613f98575f80fd5b613fa0613937565b8251613fab81613668565b81526020928301519281019290925250919050565b5f60208284031215613fd0575f80fd5b81516001600160401b0380821115613fe6575f80fd5b908301906101008286031215613ffa575f80fd5b6140026138eb565b8251815261401260208401613f7d565b602082015261402360408401613f7d565b604082015261403460608401613f7d565b60608201526080830151608082015260a083015182811115614054575f80fd5b61406087828601613ebe565b60a08301525060c083015160c082015261407c60e08401613f7d565b60e082015295945050505050565b5f60e0828403121561409a575f80fd5b60405160e081018181106001600160401b03821117156140bc576140bc6138d7565b6040528251815260208301516140d181613668565b602082015260408301516140e481613668565b80604083015250606083015160608201526080830151608082015260a083015160a082015260c083015161411781613668565b60c08201529392505050565b5f60208284031215614133575f80fd5b81516001600160401b0380821115614149575f80fd5b90830190610160828603121561415d575f80fd5b614165613914565b61416e83613f7d565b81526020830151602082015261418660408401613f7d565b604082015261419760608401613f7d565b60608201526080830151608082015260a0830151828111156141b7575f80fd5b6141c387828601613ebe565b60a08301525060c083015160c08201526141df60e08401613f7d565b60e0820152610100838101519082015261012091506141ff828401613f7d565b9181019190915261014091820151918101919091529392505050565b5f6060828403121561422b575f80fd5b604051606081018181106001600160401b038211171561424d5761424d6138d7565b604052825181526020830151614262816136d5565b60208201526040830151614275816136d5565b60408201529392505050565b6020808252818101527f546f6b656e486f6d653a2072656d6f7465206e6f742072656769737465726564604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561042a5761042a6142b6565b60208082526022908201527f546f6b656e486f6d653a207a65726f20726571756972656420676173206c696d6040820152611a5d60f21b606082015260800190565b60208082526021908201527f546f6b656e486f6d653a206e6f6e2d7a65726f207365636f6e646172792066656040820152606560f81b606082015260800190565b8082018082111561042a5761042a6142b6565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b80841015614400578451831682529385019360019390930192908501906143de565b5060a0880151878203601f190160e0890152945061441e8186613c50565b98975050505050505050565b8681526001600160a01b0386811660208301528581166040830152841660608201526080810183905260c060a082018190525f9061441e90830184613c50565b634e487b7160e01b5f52601260045260245ffd5b5f8261448c5761448c61446a565b500690565b5f602082840312156144a1575f80fd5b81516107ba81613668565b60ff828116828216039081111561042a5761042a6142b6565b600181815b808511156144ff57815f19048211156144e5576144e56142b6565b808516156144f257918102915b93841c93908002906144ca565b509250929050565b5f826145155750600161042a565b8161452157505f61042a565b816001811461453757600281146145415761455d565b600191505061042a565b60ff841115614552576145526142b6565b50506001821b61042a565b5060208310610133831016604e8410600b8410161715614580575081810a61042a565b61458a83836144c5565b805f190482111561459d5761459d6142b6565b029392505050565b5f6107ba8383614507565b808202811582820484141761042a5761042a6142b6565b5f826145d5576145d561446a565b500490565b5f602082840312156145ea575f80fd5b815180151581146107ba575f80fd5b5f825161460a818460208701613c2e565b919091019291505056fe9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e6009316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e602d2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500914a9547f6c3ddce1d5efbd9e687708f0d1d408ce129e8e1a88bce4f40e29500de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a264697066735822122092823e322ffd6798cab6557064b56065b8e2030ffe7407f37af4b50111e2a56364736f6c63430008190033", + Bin: "0x608060405234801561000f575f80fd5b5060405161483738038061483783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146ea8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806365690038116100a9578063c8511ada1161006e578063c8511ada146102b4578063c868efaa14610388578063d2cc7a701461039b578063f2fde38b146103c2578063fd658268146103d5575f80fd5b80636569003814610232578063715018a6146102455780638da5cb5b1461024d578063909a6ac01461027d5780639731429714610291575f80fd5b80634511243e116100ef5780634511243e146101d15780634797735f146101e45780635d16225d146101f85780635eb995141461020b57806362e3901b1461021e575f80fd5b806310fe9ae81461012b578063154d625a146101745780632b0d8f18146101955780633bb03890146101aa5780634213cf78146101bd575b5f80fd5b7f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e601546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b61018761018236600461368c565b6103e8565b60405190815260200161016b565b6101a86101a33660046136ba565b610430565b005b6101a86101b83660046136e3565b610532565b5f8051602061461583398151915254610187565b6101a86101df3660046136ba565b610646565b6101875f8051602061467583398151915281565b6101a8610206366004613747565b610735565b6101a8610219366004613776565b610751565b6101875f8051602061461583398151915281565b6101a861024036600461378d565b610765565b6101a861078e565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610157565b6101875f8051602061469583398151915281565b6102a461029f3660046136ba565b6107a1565b604051901515815260200161016b565b6103516102c236600461368c565b60408051608080820183525f808352602080840182905283850182905260609384018290529581525f8051602061463583398151915286528381206001600160a01b039590951681529385529282902082519384018352805460ff9081161515855260018201549585019590955260028101549284019290925260039091015490921615159181019190915290565b60405161016b9190815115158152602080830151908201526040808301519082015260609182015115159181019190915260800190565b6101a86103963660046137d3565b6107c1565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0254610187565b6101a86103d03660046136ba565b61097e565b6101a86103e3366004613854565b6109b8565b5f8281527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03851684529091529020545b92915050565b5f805160206146958339815191526104466109c8565b6001600160a01b0382166104755760405162461bcd60e51b815260040161046c90613889565b60405180910390fd5b61047f81836109d0565b156104e25760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b606482015260840161046c565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156105765750825b90505f826001600160401b031660011480156105915750303b155b90508115801561059f575080155b156105bd5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156105e757845460ff60401b1916600160401b1785555b6105f48a8a8a8a8a6109f1565b831561063a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b5f8051602061469583398151915261065c6109c8565b6001600160a01b0382166106825760405162461bcd60e51b815260040161046c90613889565b61068c81836109d0565b6106ea5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b606482015260840161046c565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b61074d61074736849003840184613989565b82610a16565b5050565b6107596109c8565b61076281610c27565b50565b61074d61077d5f805160206146158339815191525490565b303361078886613a8b565b85610dbf565b610796610fcb565b61079f5f611026565b565b5f5f805160206146958339815191526107ba81846109d0565b9392505050565b6107c9611096565b5f5f8051602061469583398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610834573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108589190613b59565b10156108bf5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b606482015260840161046c565b6108c981336109d0565b1561092f5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b606482015260840161046c565b61096f858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506110e092505050565b506109786114d3565b50505050565b610986610fcb565b6001600160a01b0381166109af57604051631e4fbdf760e01b81525f600482015260240161046c565b61076281611026565b6109c38383836114fd565b505050565b61079f610fcb565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b6109f96116ed565b610a068585858585611736565b610a0f8261175b565b5050505050565b5f805160206146558339815191528054600114610a455760405162461bcd60e51b815260040161046c90613b70565b60028155610a5283611791565b60e08301516001600160a01b031615610a7d5760405162461bcd60e51b815260040161046c90613bb4565b5f80610a9b855f01518660200151868860600151896080015161183a565b915091505f604051806040016040528060016004811115610abe57610abe613bfa565b8152602001604051806040016040528089604001516001600160a01b0316815260200186815250604051602001610af59190613c0e565b60405160208183030381529060405281525090505f610bd46040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b606001516001600160a01b031681526020018781525081526020018960c0015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b604051908082528060200260200182016040528015610ba6578160200160208202803683370190505b50815260200184604051602001610bbd9190613c7b565b6040516020818303038152906040528152506119ff565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb528987604051610c12929190613cbd565b60405180910390a35050600190925550505050565b5f8051602061469583398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015610c7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9f9190613b59565b600283015490915081841115610d115760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b606482015260840161046c565b808411610d865760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e00606482015260840161046c565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b5f805160206146558339815191528054600114610dee5760405162461bcd60e51b815260040161046c90613b70565b60028155610dfb83611b1a565b60c08301516001600160a01b031615610e265760405162461bcd60e51b815260040161046c90613bb4565b5f80610e46855f015186602001518688610100015189610120015161183a565b915091505f604051806040016040528060026004811115610e6957610e69613bfa565b81526020016040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b0316815260200189604001516001600160a01b03168152602001868152602001896060015181526020018960a0015181526020018960e001516001600160a01b0316815250604051602001610eec9190613d3e565b60405160208183030381529060405281525090505f610f756040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b61010001516001600160a01b03168152602001878152508152602001896080015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050876001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168987604051610fb3929190613ddc565b60405180910390a35050600190925550505050505050565b33610ffd7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461079f5760405163118cdaa760e01b815233600482015260240161046c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016110da57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f5f8051602061461583398151915290505f828060200190518101906111069190613f00565b905060018151600481111561111d5761111d613bfa565b03611165575f816020015180602001905181019061113b9190613f88565b90505f61114d87878460200151611cff565b905061115c825f015182611d8a565b50505050505050565b60028151600481111561117a5761117a613bfa565b03611293575f81602001518060200190518101906111989190613fc0565b90505f6111aa87878460800151611cff565b825190915087146112105760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a206d69736d61746368656420736f7572636520626c6f60448201526918dad8da185a5b88125160b21b606482015260840161046c565b856001600160a01b031682602001516001600160a01b0316146112895760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e486f6d653a206d69736d617463686564206f726967696e2073656e60448201526a646572206164647265737360a81b606482015260840161046c565b61115c8282611ded565b6003815160048111156112a8576112a8613bfa565b0361137c575f81602001518060200190518101906112c6919061408a565b90505f806112de888885606001518660800151611fcd565b91509150611372604051806101000160405280855f0151815260200185602001516001600160a01b0316815260200185604001516001600160a01b03168152602001876001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018381526020015f81526020018560a0015181526020018560c001516001600160a01b031681525083612078565b5050505050505050565b60048151600481111561139157611391613bfa565b0361148c575f81602001518060200190518101906113af9190614123565b90505f806113c888888560800151866101400151611fcd565b915091506113728888855f01516040518061016001604052808860200151815260200188604001516001600160a01b0316815260200188606001516001600160a01b031681526020018860a00151815260200188610100015181526020018860c0015181526020018861012001516001600160a01b031681526020018860e001516001600160a01b031681526020018a6001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018681526020015f81525086612203565b5f815160048111156114a0576114a0613bfa565b03610a0f575f81602001518060200190518101906114be919061421b565b90506114cb8686836123e0565b505050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b5f80516020614655833981519152805460011461152c5760405162461bcd60e51b815260040161046c90613b70565b60028082555f8581525f80516020614635833981519152602090815260408083206001600160a01b03881684528252918290208251608081018452815460ff9081161515808352600184015494830194909452948201549381019390935260030154909216151560608201525f80516020614615833981519152916115c35760405162461bcd60e51b815260040161046c90614281565b5f8160200151116116205760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20636f6c6c61746572616c206e656564656044820152601960fa1b606482015260840161046c565b611629846127e7565b93505f80826020015186106116585760208301515f925061164a90876142ca565b90508260200151955061166b565b85836020015161166891906142ca565b91505b5f88815260028501602090815260408083206001600160a01b038b168085529083529281902060010185905580518981529182018590528a917f6769a5f9bfc8b6e0db839ab981cbf9239274ae72d2d035081a9157d43bd33cb6910160405180910390a380156116df576116df3382611d8a565b505060019092555050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661079f57604051631afcd79f60e31b815260040160405180910390fd5b61173e6116ed565b61174985858561280e565b611751612829565b610a0f8282612839565b6117636116ed565b5f8051602061467583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60408101516001600160a01b03166117f55760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20726563697069656e74206164647265736044820152607360f81b606482015260840161046c565b5f8160c00151116118185760405162461bcd60e51b815260040161046c906142dd565b60a0810151156107625760405162461bcd60e51b815260040161046c9061431f565b5f8581525f80516020614635833981519152602090815260408083206001600160a01b038816845282528083208151608081018352815460ff90811615158083526001840154958301959095526002830154938201939093526003909101549091161515606082015282915f8051602061461583398151915291906118d15760405162461bcd60e51b815260040161046c90614281565b6020810151156119335760405162461bcd60e51b815260206004820152602760248201527f546f6b656e486f6d653a20636f6c6c61746572616c206e656564656420666f726044820152662072656d6f746560c81b606482015260840161046c565b61193c876127e7565b965084156119525761194f8633876129a0565b94505b5f611966826040015183606001518a612af9565b90505f81116119b75760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f207363616c656420616d6f756e74000000604482015260640161046c565b5f8a815260038401602090815260408083206001600160a01b038d168452909152812080548392906119ea908490614360565b90915550909a95995094975050505050505050565b5f80611a09612b0f565b60408401516020015190915015611aae576040830151516001600160a01b0316611a8b5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b606482015260840161046c565b604083015160208101519051611aae916001600160a01b03909116908390612bff565b604051630624488560e41b81526001600160a01b03821690636244885090611ada908690600401614373565b6020604051808303815f875af1158015611af6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba9190613b59565b60408101516001600160a01b0316611b875760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420636f6e7472616044820152696374206164647265737360b01b606482015260840161046c565b5f816080015111611baa5760405162461bcd60e51b815260040161046c906142dd565b5f8160a0015111611c095760405162461bcd60e51b815260206004820152602360248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420676173206c696044820152621b5a5d60ea1b606482015260840161046c565b80608001518160a0015110611c6f5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420726563697069656e7420676173604482015265081b1a5b5a5d60d21b606482015260840161046c565b60e08101516001600160a01b0316611cdc5760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f2066616c6c6261636b20726563697069656044820152696e74206164647265737360b01b606482015260840161046c565b610140810151156107625760405162461bcd60e51b815260040161046c9061431f565b5f8381525f80516020614635833981519152602090815260408083206001600160a01b038616845282528083208151608081018352815460ff9081161515825260018301549482019490945260028201549281019290925260030154909116151560608201525f8051602061461583398151915290611d8081878787612c86565b9695505050505050565b6040518181525f80516020614675833981519152906001600160a01b038416907f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b9060200160405180910390a280546109c3906001600160a01b03168484612d7d565b5f80516020614675833981519152805460608401516001600160a01b0390911690611e1a90829085612bff565b5f845f01518560200151866040015184878960a00151604051602401611e459695949392919061442a565b60408051601f198184030181529190526020810180516001600160e01b03166394395edd60e01b17905260c086015160608701519192505f91611e89919084612ddc565b6060870151604051636eb1769f60e11b81523060048201526001600160a01b0391821660248201529192505f919085169063dd62ed3e90604401602060405180830381865afa158015611ede573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f029190613b59565b9050611f138488606001515f612de9565b8115611f655786606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff487604051611f5891815260200190565b60405180910390a2611fad565b86606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb087604051611fa491815260200190565b60405180910390a25b801561115c5760e087015161115c906001600160a01b0386169083612d7d565b5f8481525f80516020614635833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff90811615158252600183015494820194909452600282015492810192909252600301549091161515606082015281905f805160206146158339815191529082612051828a8a8a612c86565b90505f6120678360400151846060015189612e78565b919a91995090975050505050505050565b5f8051602061465583398151915280546001146120a75760405162461bcd60e51b815260040161046c90613b70565b600281556120b483611791565b5f6120cc845f01518560200151858760800151612e85565b9050805f036120e9576120e38460e0015184611d8a565b506121fb565b604080518082019091525f908060018152602001604051806040016040528088604001516001600160a01b031681526020018581525060405160200161212f9190613c0e565b60405160208183030381529060405281525090505f6121bb6040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a606001516001600160a01b031681526020018a6080015181525081526020018860c0015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050807f825080857c76cef4a1629c0705a7f8b4ef0282ddcafde0b6715c4fb34b68aaf087856040516121ef929190613cbd565b60405180910390a25050505b600190555050565b5f8051602061465583398151915280546001146122325760405162461bcd60e51b815260040161046c90613b70565b6002815561223f83611b1a565b5f612258845f0151856020015185876101200151612e85565b9050805f036122755761226f8460c0015184611d8a565b506123d5565b604080518082019091525f9080600281526020016040518061010001604052808b81526020018a6001600160a01b03168152602001896001600160a01b0316815260200188604001516001600160a01b03168152602001858152602001886060015181526020018860a0015181526020018860e001516001600160a01b03168152506040516020016123079190613d3e565b60405160208183030381529060405281525090505f6123956040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a61010001516001600160a01b031681526020018a61012001518152508152602001886080015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050807f42eff9005856e3c586b096d67211a566dc926052119fd7cc08023c70937ecb3087856040516123c9929190613ddc565b60405180910390a25050505b600190555050505050565b5f80516020614615833981519152836124475760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a207a65726f2072656d6f746520626c6f636b636861696044820152631b88125160e21b606482015260840161046c565b805484036124af5760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e486f6d653a2063616e6e6f742072656769737465722072656d6f7460448201526e329037b71039b0b6b29031b430b4b760891b606482015260840161046c565b6001600160a01b03831661251e5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e486f6d653a207a65726f2072656d6f746520746f6b656e2074726160448201526f6e73666572726572206164647265737360801b606482015260840161046c565b5f84815260028201602090815260408083206001600160a01b038716845290915290205460ff161561259e5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f746520616c726561647920726567697374604482015263195c995960e21b606482015260840161046c565b6012826040015160ff1611156126085760405162461bcd60e51b815260206004820152602960248201527f546f6b656e486f6d653a2072656d6f746520746f6b656e20646563696d616c73604482015268040e8dede40d0d2ced60bb1b606482015260840161046c565b6001810154602083015160ff908116600160a01b909204161461267c5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420686f6d6520746f6b656e20646560448201526563696d616c7360d01b606482015260840161046c565b5f8061269d8360010160149054906101000a900460ff168560400151612ff6565b915091505f6126b08383875f0151612e78565b90508180156126ca575084516126c790849061447e565b15155b156126dd576126da600182614360565b90505b6040518060800160405280600115158152602001828152602001848152602001831515815250846002015f8981526020019081526020015f205f886001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff02191690831515021790555060208201518160010155604082015181600201556060820151816003015f6101000a81548160ff021916908315150217905550905050856001600160a01b0316877ff229b02a51a4c8d5ef03a096ae0dd727d7b48b710d21b50ebebb560eef739b908388604001516040516127d692919091825260ff16602082015260400190565b60405180910390a350505050505050565b5f8051602061467583398151915280545f91906107ba906001600160a01b031633856129a0565b6128166116ed565b612820838261303e565b6109c382613060565b6128316116ed565b61079f613071565b6128416116ed565b6001600160a01b0382166128975760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e2061646472657373000000604482015260640161046c565b60128160ff1611156128f65760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b606482015260840161046c565b5f5f8051602061461583398151915290506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561294a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296e9190613b59565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa1580156129e6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0a9190613b59565b9050612a216001600160a01b038616853086613085565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612a65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a899190613b59565b9050818111612aef5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161046c565b611d8082826142ca565b5f612b0784848460016130be565b949350505050565b5f8051602061469583398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612b69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b8d9190614491565b9050612b9982826109d0565b1561042a5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b606482015260840161046c565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612c4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c709190613b59565b90506109788484612c818585614360565b612de9565b83515f90612ca65760405162461bcd60e51b815260040161046c90614281565b602085015115612d045760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f7465206e6f7420636f6c6c61746572616c6044820152631a5e995960e21b606482015260840161046c565b612d0f8484846130e5565b5f612d238660400151876060015185612e78565b90505f8111612d745760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e486f6d653a207a65726f20746f6b656e20616d6f756e7400000000604482015260640161046c565b95945050505050565b6040516001600160a01b038381166024830152604482018390526109c391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506131d2565b5f612b07845f8585613233565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612e3a8482613303565b610978576040516001600160a01b0384811660248301525f6044830152612e6e91869182169063095ea7b390606401612daa565b61097884826131d2565b5f612b078484845f6130be565b5f8481525f80516020614635833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff9081161580158352600184015495830195909552600283015493820193909352600390910154909116151560608201525f805160206146158339815191529180612f0b57505f8160200151115b15612f1a575f92505050612b07565b838511612f7e5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e486f6d653a20696e73756666696369656e7420616d6f756e74207460448201526b6f20636f766572206665657360a01b606482015260840161046c565b612f8884866142ca565b94505f612f9e8260400151836060015188612af9565b9050805f03612fb2575f9350505050612b07565b5f88815260038401602090815260408083206001600160a01b038b16845290915281208054839290612fe5908490614360565b909155509098975050505050505050565b5f8060ff8085169084161181816130195761301185876144ac565b60ff16613027565b61302386866144ac565b60ff165b61303290600a6145a5565b96919550909350505050565b6130466116ed565b61304e6133a0565b6130566133b0565b61074d82826133b8565b6130686116ed565b6107628161353c565b5f5f805160206146558339815191526114f6565b6040516001600160a01b0384811660248301528381166044830152606482018390526109789186918216906323b872dd90608401612daa565b5f811515841515036130db576130d485846145b0565b9050612b07565b612d7485846145c7565b5f8381527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03861684529091529020545f80516020614615833981519152908281101561319c5760405162461bcd60e51b815260206004820152602e60248201527f546f6b656e486f6d653a20696e73756666696369656e7420746f6b656e20747260448201526d616e736665722062616c616e636560901b606482015260840161046c565b6131a683826142ca565b5f9586526003909201602090815260408087206001600160a01b03909616875294905250919092205550565b5f6131e66001600160a01b03841683613544565b905080515f1415801561320a57508080602001905181019061320891906145da565b155b156109c357604051635274afe760e01b81526001600160a01b038416600482015260240161046c565b5f845a10156132845760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e74206761730000000000604482015260640161046c565b834710156132d45760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c7565000000604482015260640161046c565b826001600160a01b03163b5f036132ec57505f612b07565b5f805f84516020860188888bf19695505050505050565b5f805f846001600160a01b03168460405161331e91906145f9565b5f604051808303815f865af19150503d805f8114613357576040519150601f19603f3d011682016040523d82523d5f602084013e61335c565b606091505b509150915081801561338657508051158061338657508080602001905181019061338691906145da565b8015612d745750505050506001600160a01b03163b151590565b6133a86116ed565b61079f613551565b61079f6116ed565b6133c06116ed565b6001600160a01b03821661343c5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f727465722072656769737472792061646472657373000000000000000000606482015260840161046c565b5f5f8051602061469583398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134b29190613b59565b1161351a5760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b606482015260840161046c565b81546001600160a01b0319166001600160a01b03821617825561097883610c27565b6109866116ed565b60606107ba83835f613559565b6114d36116ed565b60608147101561357e5760405163cd78605960e01b815230600482015260240161046c565b5f80856001600160a01b0316848660405161359991906145f9565b5f6040518083038185875af1925050503d805f81146135d3576040519150601f19603f3d011682016040523d82523d5f602084013e6135d8565b606091505b5091509150611d808683836060826135f8576135f38261363f565b6107ba565b815115801561360f57506001600160a01b0384163b155b1561363857604051639996b31560e01b81526001600160a01b038516600482015260240161046c565b50806107ba565b80511561364f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b0381168114610762575f80fd5b803561368781613668565b919050565b5f806040838503121561369d575f80fd5b8235915060208301356136af81613668565b809150509250929050565b5f602082840312156136ca575f80fd5b81356107ba81613668565b60ff81168114610762575f80fd5b5f805f805f60a086880312156136f7575f80fd5b853561370281613668565b9450602086013561371281613668565b935060408601359250606086013561372981613668565b91506080860135613739816136d5565b809150509295509295909350565b5f8082840361012081121561375a575f80fd5b61010080821215613769575f80fd5b9395938601359450505050565b5f60208284031215613786575f80fd5b5035919050565b5f806040838503121561379e575f80fd5b82356001600160401b038111156137b3575f80fd5b830161016081860312156137c5575f80fd5b946020939093013593505050565b5f805f80606085870312156137e6575f80fd5b8435935060208501356137f881613668565b925060408501356001600160401b0380821115613813575f80fd5b818701915087601f830112613826575f80fd5b813581811115613834575f80fd5b886020828501011115613845575f80fd5b95989497505060200194505050565b5f805f60608486031215613866575f80fd5b83359250602084013561387881613668565b929592945050506040919091013590565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b60405161010081016001600160401b038111828210171561390e5761390e6138d7565b60405290565b60405161016081016001600160401b038111828210171561390e5761390e6138d7565b604080519081016001600160401b038111828210171561390e5761390e6138d7565b604051601f8201601f191681016001600160401b0381118282101715613981576139816138d7565b604052919050565b5f610100828403121561399a575f80fd5b6139a26138eb565b8235815260208301356139b481613668565b602082015260408301356139c781613668565b60408201526139d86060840161367c565b60608201526080830135608082015260a083013560a082015260c083013560c0820152613a0760e0840161367c565b60e08201529392505050565b5f6001600160401b03821115613a2b57613a2b6138d7565b50601f01601f191660200190565b5f82601f830112613a48575f80fd5b8135613a5b613a5682613a13565b613959565b818152846020838601011115613a6f575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6101608236031215613a9c575f80fd5b613aa4613914565b82358152613ab46020840161367c565b6020820152613ac56040840161367c565b604082015260608301356001600160401b03811115613ae2575f80fd5b613aee36828601613a39565b6060830152506080830135608082015260a083013560a0820152613b1460c0840161367c565b60c0820152613b2560e0840161367c565b60e0820152610100613b3881850161367c565b90820152610120838101359082015261014092830135928101929092525090565b5f60208284031215613b69575f80fd5b5051919050565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b60208082526026908201527f546f6b656e486f6d653a206e6f6e2d7a65726f206d756c74692d686f702066616040820152656c6c6261636b60d01b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b81516001600160a01b03168152602080830151908201526040810161042a565b5f5b83811015613c48578181015183820152602001613c30565b50505f910152565b5f8151808452613c67816020860160208601613c2e565b601f01601f19169290920160200192915050565b602081525f825160058110613c9e57634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612b076060840182613c50565b5f6101208201905083518252602084015160018060a01b03808216602085015280604087015116604085015280606087015116606085015250506080840151608083015260a084015160a083015260c084015160c083015260e0840151613d2f60e08401826001600160a01b03169052565b50826101008301529392505050565b60208152815160208201525f602083015160018060a01b03808216604085015280604086015116606085015250506060830151613d8660808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c0850152613dad610120850183613c50565b915060c085015160e085015260e0850151613dd2828601826001600160a01b03169052565b5090949350505050565b60408152825160408201525f6020840151613e0260608401826001600160a01b03169052565b5060408401516001600160a01b03166080830152606084015161016060a08401819052613e336101a0850183613c50565b9150608086015160c085015260a086015160e085015260c0860151610100613e65818701836001600160a01b03169052565b60e08801519150610120613e83818801846001600160a01b03169052565b90880151915061014090613ea1878301846001600160a01b03169052565b880151928601929092525090940151610180830152506020015290565b5f82601f830112613ecd575f80fd5b8151613edb613a5682613a13565b818152846020838601011115613eef575f80fd5b612b07826020830160208701613c2e565b5f60208284031215613f10575f80fd5b81516001600160401b0380821115613f26575f80fd5b9083019060408286031215613f39575f80fd5b613f41613937565b825160058110613f4f575f80fd5b8152602083015182811115613f62575f80fd5b613f6e87828601613ebe565b60208301525095945050505050565b805161368781613668565b5f60408284031215613f98575f80fd5b613fa0613937565b8251613fab81613668565b81526020928301519281019290925250919050565b5f60208284031215613fd0575f80fd5b81516001600160401b0380821115613fe6575f80fd5b908301906101008286031215613ffa575f80fd5b6140026138eb565b8251815261401260208401613f7d565b602082015261402360408401613f7d565b604082015261403460608401613f7d565b60608201526080830151608082015260a083015182811115614054575f80fd5b61406087828601613ebe565b60a08301525060c083015160c082015261407c60e08401613f7d565b60e082015295945050505050565b5f60e0828403121561409a575f80fd5b60405160e081018181106001600160401b03821117156140bc576140bc6138d7565b6040528251815260208301516140d181613668565b602082015260408301516140e481613668565b80604083015250606083015160608201526080830151608082015260a083015160a082015260c083015161411781613668565b60c08201529392505050565b5f60208284031215614133575f80fd5b81516001600160401b0380821115614149575f80fd5b90830190610160828603121561415d575f80fd5b614165613914565b61416e83613f7d565b81526020830151602082015261418660408401613f7d565b604082015261419760608401613f7d565b60608201526080830151608082015260a0830151828111156141b7575f80fd5b6141c387828601613ebe565b60a08301525060c083015160c08201526141df60e08401613f7d565b60e0820152610100838101519082015261012091506141ff828401613f7d565b9181019190915261014091820151918101919091529392505050565b5f6060828403121561422b575f80fd5b604051606081018181106001600160401b038211171561424d5761424d6138d7565b604052825181526020830151614262816136d5565b60208201526040830151614275816136d5565b60408201529392505050565b6020808252818101527f546f6b656e486f6d653a2072656d6f7465206e6f742072656769737465726564604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561042a5761042a6142b6565b60208082526022908201527f546f6b656e486f6d653a207a65726f20726571756972656420676173206c696d6040820152611a5d60f21b606082015260800190565b60208082526021908201527f546f6b656e486f6d653a206e6f6e2d7a65726f207365636f6e646172792066656040820152606560f81b606082015260800190565b8082018082111561042a5761042a6142b6565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b80841015614400578451831682529385019360019390930192908501906143de565b5060a0880151878203601f190160e0890152945061441e8186613c50565b98975050505050505050565b8681526001600160a01b0386811660208301528581166040830152841660608201526080810183905260c060a082018190525f9061441e90830184613c50565b634e487b7160e01b5f52601260045260245ffd5b5f8261448c5761448c61446a565b500690565b5f602082840312156144a1575f80fd5b81516107ba81613668565b60ff828116828216039081111561042a5761042a6142b6565b600181815b808511156144ff57815f19048211156144e5576144e56142b6565b808516156144f257918102915b93841c93908002906144ca565b509250929050565b5f826145155750600161042a565b8161452157505f61042a565b816001811461453757600281146145415761455d565b600191505061042a565b60ff841115614552576145526142b6565b50506001821b61042a565b5060208310610133831016604e8410600b8410161715614580575081810a61042a565b61458a83836144c5565b805f190482111561459d5761459d6142b6565b029392505050565b5f6107ba8383614507565b808202811582820484141761042a5761042a6142b6565b5f826145d5576145d561446a565b500490565b5f602082840312156145ea575f80fd5b815180151581146107ba575f80fd5b5f825161460a818460208701613c2e565b919091019291505056fe9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e6009316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e602d2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500914a9547f6c3ddce1d5efbd9e687708f0d1d408ce129e8e1a88bce4f40e29500de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a26469706673582212209924d0ac481869bfa0483f546c2d1a17b0fcb1ddda43568a1f4acd16829e3fe964736f6c63430008190033", } // ERC20TokenHomeUpgradeableABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/ictt/TokenHome/NativeTokenHome/NativeTokenHome.go b/abi-bindings/go/ictt/TokenHome/NativeTokenHome/NativeTokenHome.go index 09af00c19..176b54df1 100644 --- a/abi-bindings/go/ictt/TokenHome/NativeTokenHome/NativeTokenHome.go +++ b/abi-bindings/go/ictt/TokenHome/NativeTokenHome/NativeTokenHome.go @@ -67,7 +67,7 @@ type SendTokensInput struct { // NativeTokenHomeMetaData contains all meta data concerning the NativeTokenHome contract. var NativeTokenHomeMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterRegistryAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"teleporterManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minTeleporterVersion\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"wrappedTokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remaining\",\"type\":\"uint256\"}],\"name\":\"CollateralAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldMinTeleporterVersion\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newMinTeleporterVersion\",\"type\":\"uint256\"}],\"name\":\"MinTeleporterVersionUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"initialCollateralNeeded\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"RemoteRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressUnpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensAndCallRouted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensAndCallSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensRouted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_HOME_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TELEPORTER_REGISTRY_APP_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_HOME_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"}],\"name\":\"addCollateral\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinTeleporterVersion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"}],\"name\":\"getRemoteTokenTransferrerSettings\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"registered\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"collateralNeeded\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenMultiplier\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"multiplyOnRemote\",\"type\":\"bool\"}],\"internalType\":\"structRemoteTokenTransferrerSettings\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"}],\"name\":\"getTransferredBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterRegistryAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"teleporterManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minTeleporterVersion\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"wrappedTokenAddress\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"isTeleporterAddressPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"pauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"originSenderAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"receiveTeleporterMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"}],\"name\":\"send\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"}],\"name\":\"sendAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"unpauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"updateMinTeleporterVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x608060405234801561000f575f80fd5b506040516152c13803806152c183398101604081905261002e91610890565b61003a84848484610046565b505050506108f1565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f8115801561008f5750825b90505f826001600160401b031660011480156100aa5750303b155b9050811580156100b8575080155b156100d65760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561010457845460ff60401b1916680100000000000000001785555b61011089898989610161565b831561015657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b610169610186565b6101778484848460126101d6565b61018081610202565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166101d457604051631afcd79f60e31b815260040160405180910390fd5b565b6101de610186565b6101e985858561024b565b6101f161026b565b6101fb828261027b565b5050505050565b61020a610186565b7f3b5030f10c94fcbdaa3022348ff0b82dbd4c0c71339e41ff59d0bdc92179d60080546001600160a01b0319166001600160a01b0392909216919091179055565b610253610186565b61025d8382610407565b6102668261042d565b505050565b610273610186565b6101d461043e565b610283610186565b6001600160a01b0382166102de5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e206164647265737300000060448201526064015b60405180910390fd5b60128160ff16111561033d5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b60648201526084016102d5565b5f7f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e60090507302000000000000000000000000000000000000056001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d591906108da565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b61040f610186565b610417610468565b61041f610478565b6104298282610480565b5050565b610435610186565b61004381610604565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75005b6001905550565b610470610186565b6101d461063e565b6101d4610186565b610488610186565b6001600160a01b0382166105045760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016102d5565b5f7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0090505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610569573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061058d91906108da565b116105e25760405162461bcd60e51b815260206004820152603260248201525f805160206152a1833981519152604482015271656c65706f7274657220726567697374727960701b60648201526084016102d5565b81546001600160a01b0319166001600160a01b0382161782556101808361066d565b61060c610186565b6001600160a01b03811661063557604051631e4fbdf760e01b81525f60048201526024016102d5565b61004381610805565b610646610186565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00610461565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa1580156106d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f891906108da565b6002830154909150818411156107575760405162461bcd60e51b815260206004820152603160248201525f805160206152a183398151915260448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016102d5565b8084116107cc5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016102d5565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b80516001600160a01b038116811461088b575f80fd5b919050565b5f805f80608085870312156108a3575f80fd5b6108ac85610875565b93506108ba60208601610875565b9250604085015191506108cf60608601610875565b905092959194509250565b5f602082840312156108ea575f80fd5b5051919050565b6149a3806108fe5f395ff3fe60806040526004361061011e575f3560e01c80638da5cb5b1161009d578063c8511ada11610062578063c8511ada146103d5578063c868efaa146104b5578063d2cc7a70146104d4578063efb5b95e14610507578063f2fde38b14610527575f80fd5b80638da5cb5b14610318578063909a6ac0146103545780639731429714610374578063b0b78b26146103a3578063be203094146103b6575f80fd5b80635eb99514116100e35780635eb995141461029f57806362e3901b146102be5780636e6eef8d146102de578063715018a6146102f15780638bf2fa9414610305575f80fd5b806310fe9ae8146101bf578063154d625a146102145780632b0d8f18146102415780634213cf78146102605780634511243e14610280575f80fd5b366101bb577f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e601546001600160a01b031633146101b95760405162461bcd60e51b815260206004820152602f60248201527f4e6174697665546f6b656e486f6d653a20696e76616c6964207265636569766560448201526e103830bcb0b136329039b2b73232b960891b60648201526084015b60405180910390fd5b005b5f80fd5b3480156101ca575f80fd5b507f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e601546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021f575f80fd5b5061023361022e3660046139c6565b610546565b60405190815260200161020b565b34801561024c575f80fd5b506101b961025b3660046139f4565b61058e565b34801561026b575f80fd5b505f805160206148ce83398151915254610233565b34801561028b575f80fd5b506101b961029a3660046139f4565b610687565b3480156102aa575f80fd5b506101b96102b9366004613a0f565b610776565b3480156102c9575f80fd5b506102335f805160206148ce83398151915281565b6101b96102ec366004613a26565b61078a565b3480156102fc575f80fd5b506101b96107b3565b6101b9610313366004613a5d565b6107c6565b348015610323575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101f7565b34801561035f575f80fd5b506102335f8051602061494e83398151915281565b34801561037f575f80fd5b5061039361038e3660046139f4565b6107de565b604051901515815260200161020b565b6101b96103b13660046139c6565b6107fe565b3480156103c1575f80fd5b506101b96103d0366004613a74565b61080d565b3480156103e0575f80fd5b5061047e6103ef3660046139c6565b60408051608080820183525f808352602080840182905283850182905260609384018290529581525f8051602061490e83398151915286528381206001600160a01b039590951681529385529282902082519384018352805460ff9081161515855260018201549585019590955260028101549284019290925260039091015490921615159181019190915290565b60405161020b9190815115158152602080830151908201526040808301519082015260609182015115159181019190915260800190565b3480156104c0575f80fd5b506101b96104cf366004613ac4565b61091f565b3480156104df575f80fd5b507fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0254610233565b348015610512575f80fd5b506102335f805160206148ee83398151915281565b348015610532575f80fd5b506101b96105413660046139f4565b610adc565b5f8281527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03851684529091529020545b92915050565b5f8051602061494e8339815191526105a4610b16565b6001600160a01b0382166105ca5760405162461bcd60e51b81526004016101b090613b45565b6105d48183610b1e565b156106375760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b60648201526084016101b0565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b5f8051602061494e83398151915261069d610b16565b6001600160a01b0382166106c35760405162461bcd60e51b81526004016101b090613b45565b6106cd8183610b1e565b61072b5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b60648201526084016101b0565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b61077e610b16565b61078781610b3f565b50565b6107876107a25f805160206148ce8339815191525490565b30336107ad85613cbd565b34610cd7565b6107bb610f3a565b6107c45f610f95565b565b6107876107d836839003830183613d8b565b34611005565b5f5f8051602061494e8339815191526107f78184610b1e565b9392505050565b6108098282346111bf565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108515750825b90505f826001600160401b0316600114801561086c5750303b155b90508115801561087a575080155b156108985760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108c257845460ff60401b1916600160401b1785555b6108ce898989896113af565b831561091457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6109276113ce565b5f5f8051602061494e83398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610992573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b69190613e15565b1015610a1d5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b60648201526084016101b0565b610a278133610b1e565b15610a8d5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b60648201526084016101b0565b610acd858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061141892505050565b50610ad661180c565b50505050565b610ae4610f3a565b6001600160a01b038116610b0d57604051631e4fbdf760e01b81525f60048201526024016101b0565b61078781610f95565b6107c4610f3a565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b5f8051602061494e83398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015610b93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb79190613e15565b600283015490915081841115610c295760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016101b0565b808411610c9e5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016101b0565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b5f8051602061492e8339815191528054600114610d065760405162461bcd60e51b81526004016101b090613e2c565b60028155610d1383611836565b60c08301516001600160a01b031615610d3e5760405162461bcd60e51b81526004016101b090613e70565b5f80610d5e855f0151866020015186886101000151896101200151611a1b565b915091505f604051806040016040528060026004811115610d8157610d81613eb6565b81526020016040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b0316815260200189604001516001600160a01b03168152602001868152602001896060015181526020018960a0015181526020018960e001516001600160a01b0316815250604051602001610e049190613f17565b60405160208183030381529060405281525090505f610ee46040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b61010001516001600160a01b03168152602001878152508152602001896080015181526020015f6001600160401b03811115610e8d57610e8d613b93565b604051908082528060200260200182016040528015610eb6578160200160208202803683370190505b50815260200184604051602001610ecd9190613fb5565b604051602081830303815290604052815250611be0565b9050876001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168987604051610f22929190613ff7565b60405180910390a35050600190925550505050505050565b33610f6c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107c45760405163118cdaa760e01b81523360048201526024016101b0565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8051602061492e83398151915280546001146110345760405162461bcd60e51b81526004016101b090613e2c565b6002815561104183611cfb565b60e08301516001600160a01b03161561106c5760405162461bcd60e51b81526004016101b090613e70565b5f8061108a855f015186602001518688606001518960800151611a1b565b915091505f6040518060400160405280600160048111156110ad576110ad613eb6565b8152602001604051806040016040528089604001516001600160a01b03168152602001868152506040516020016110e491906140d9565b60405160208183030381529060405281525090505f61116c6040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b606001516001600160a01b031681526020018781525081526020018960c0015181526020015f6001600160401b03811115610e8d57610e8d613b93565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb5289876040516111aa9291906140f9565b60405180910390a35050600190925550505050565b5f8051602061492e83398151915280546001146111ee5760405162461bcd60e51b81526004016101b090613e2c565b60028082555f8581525f8051602061490e833981519152602090815260408083206001600160a01b03881684528252918290208251608081018452815460ff9081161515808352600184015494830194909452948201549381019390935260030154909216151560608201525f805160206148ce833981519152916112855760405162461bcd60e51b81526004016101b09061417a565b5f8160200151116112e25760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20636f6c6c61746572616c206e656564656044820152601960fa1b60648201526084016101b0565b6112eb84611da4565b93505f808260200151861061131a5760208301515f925061130c90876141c3565b90508260200151955061132d565b85836020015161132a91906141c3565b91505b5f88815260028501602090815260408083206001600160a01b038b168085529083529281902060010185905580518981529182018590528a917f6769a5f9bfc8b6e0db839ab981cbf9239274ae72d2d035081a9157d43bd33cb6910160405180910390a380156113a1576113a13382611dca565b505060019092555050505050565b6113b7611e88565b6113c5848484846012611ed1565b610ad681611ef6565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161141257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f5f805160206148ce83398151915290505f8280602001905181019061143e9190614218565b905060018151600481111561145557611455613eb6565b0361149d575f816020015180602001905181019061147391906142a0565b90505f61148587878460200151611f2c565b9050611494825f015182611dca565b50505050505050565b6002815160048111156114b2576114b2613eb6565b036115cb575f81602001518060200190518101906114d091906142d8565b90505f6114e287878460800151611f2c565b825190915087146115485760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a206d69736d61746368656420736f7572636520626c6f60448201526918dad8da185a5b88125160b21b60648201526084016101b0565b856001600160a01b031682602001516001600160a01b0316146115c15760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e486f6d653a206d69736d617463686564206f726967696e2073656e60448201526a646572206164647265737360a81b60648201526084016101b0565b6114948282611fb7565b6003815160048111156115e0576115e0613eb6565b036116b4575f81602001518060200190518101906115fe91906143a2565b90505f8061161688888560600151866080015161213d565b915091506116aa604051806101000160405280855f0151815260200185602001516001600160a01b0316815260200185604001516001600160a01b03168152602001876001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018381526020015f81526020018560a0015181526020018560c001516001600160a01b0316815250836121e8565b5050505050505050565b6004815160048111156116c9576116c9613eb6565b036117c4575f81602001518060200190518101906116e7919061443b565b90505f806117008888856080015186610140015161213d565b915091506116aa8888855f01516040518061016001604052808860200151815260200188604001516001600160a01b0316815260200188606001516001600160a01b031681526020018860a00151815260200188610100015181526020018860c0015181526020018861012001516001600160a01b031681526020018860e001516001600160a01b031681526020018a6001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018681526020015f81525086612373565b5f815160048111156117d8576117d8613eb6565b03611805575f81602001518060200190518101906117f69190614543565b9050611803868683612550565b505b5050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b60408101516001600160a01b03166118a35760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420636f6e7472616044820152696374206164647265737360b01b60648201526084016101b0565b5f8160800151116118c65760405162461bcd60e51b81526004016101b0906145a5565b5f8160a00151116119255760405162461bcd60e51b815260206004820152602360248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420676173206c696044820152621b5a5d60ea1b60648201526084016101b0565b80608001518160a001511061198b5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420726563697069656e7420676173604482015265081b1a5b5a5d60d21b60648201526084016101b0565b60e08101516001600160a01b03166119f85760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f2066616c6c6261636b20726563697069656044820152696e74206164647265737360b01b60648201526084016101b0565b610140810151156107875760405162461bcd60e51b81526004016101b0906145e7565b5f8581525f8051602061490e833981519152602090815260408083206001600160a01b038816845282528083208151608081018352815460ff90811615158083526001840154958301959095526002830154938201939093526003909101549091161515606082015282915f805160206148ce8339815191529190611ab25760405162461bcd60e51b81526004016101b09061417a565b602081015115611b145760405162461bcd60e51b815260206004820152602760248201527f546f6b656e486f6d653a20636f6c6c61746572616c206e656564656420666f726044820152662072656d6f746560c81b60648201526084016101b0565b611b1d87611da4565b96508415611b3357611b30863387612957565b94505b5f611b47826040015183606001518a612ab0565b90505f8111611b985760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f207363616c656420616d6f756e7400000060448201526064016101b0565b5f8a815260038401602090815260408083206001600160a01b038d16845290915281208054839290611bcb908490614628565b90915550909a95995094975050505050505050565b5f80611bea612ac6565b60408401516020015190915015611c8f576040830151516001600160a01b0316611c6c5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b60648201526084016101b0565b604083015160208101519051611c8f916001600160a01b03909116908390612bb6565b604051630624488560e41b81526001600160a01b03821690636244885090611cbb90869060040161463b565b6020604051808303815f875af1158015611cd7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f79190613e15565b60408101516001600160a01b0316611d5f5760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20726563697069656e74206164647265736044820152607360f81b60648201526084016101b0565b5f8160c0015111611d825760405162461bcd60e51b81526004016101b0906145a5565b60a0810151156107875760405162461bcd60e51b81526004016101b0906145e7565b5f805160206148ee83398151915280545f91906107f7906001600160a01b031684612c3d565b6040518181525f805160206148ee833981519152906001600160a01b038416907f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b9060200160405180910390a28054604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015611e59575f80fd5b505af1158015611e6b573d5f803e3d5ffd5b50611e83925050506001600160a01b03841683612de2565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107c457604051631afcd79f60e31b815260040160405180910390fd5b611ed9611e88565b611ee4858585612e75565b611eec612e90565b6118058282612ea0565b611efe611e88565b5f805160206148ee83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b5f8381525f8051602061490e833981519152602090815260408083206001600160a01b038616845282528083208151608081018352815460ff9081161515825260018301549482019490945260028201549281019290925260030154909116151560608201525f805160206148ce83398151915290611fad81878787613007565b9695505050505050565b5f5f805160206148ee8339815191528054604051632e1a7d4d60e01b8152600481018590529192506001600160a01b031690632e1a7d4d906024015f604051808303815f87803b158015612009575f80fd5b505af115801561201b573d5f803e3d5ffd5b50508451602086015160408088015160a089015191515f965061204495509091906024016146f2565b60408051601f198184030181529190526020810180516001600160e01b031663161b12ff60e11b17905260c085015160608601519192505f9161208a91908690856130f5565b905080156120de5784606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff4856040516120d191815260200190565b60405180910390a2611805565b84606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb08560405161211d91815260200190565b60405180910390a260e0850151611805906001600160a01b031685612de2565b5f8481525f8051602061490e833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff90811615158252600183015494820194909452600282015492810192909252600301549091161515606082015281905f805160206148ce83398151915290826121c1828a8a8a613007565b90505f6121d783604001518460600151896131c5565b919a91995090975050505050505050565b5f8051602061492e83398151915280546001146122175760405162461bcd60e51b81526004016101b090613e2c565b6002815561222483611cfb565b5f61223c845f015185602001518587608001516131d2565b9050805f03612259576122538460e0015184611dca565b5061236b565b604080518082019091525f908060018152602001604051806040016040528088604001516001600160a01b031681526020018581525060405160200161229f91906140d9565b60405160208183030381529060405281525090505f61232b6040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a606001516001600160a01b031681526020018a6080015181525081526020018860c0015181526020015f6001600160401b03811115610e8d57610e8d613b93565b9050807f825080857c76cef4a1629c0705a7f8b4ef0282ddcafde0b6715c4fb34b68aaf0878560405161235f9291906140f9565b60405180910390a25050505b600190555050565b5f8051602061492e83398151915280546001146123a25760405162461bcd60e51b81526004016101b090613e2c565b600281556123af83611836565b5f6123c8845f01518560200151858761012001516131d2565b9050805f036123e5576123df8460c0015184611dca565b50612545565b604080518082019091525f9080600281526020016040518061010001604052808b81526020018a6001600160a01b03168152602001896001600160a01b0316815260200188604001516001600160a01b03168152602001858152602001886060015181526020018860a0015181526020018860e001516001600160a01b03168152506040516020016124779190613f17565b60405160208183030381529060405281525090505f6125056040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a61010001516001600160a01b031681526020018a61012001518152508152602001886080015181526020015f6001600160401b03811115610e8d57610e8d613b93565b9050807f42eff9005856e3c586b096d67211a566dc926052119fd7cc08023c70937ecb308785604051612539929190613ff7565b60405180910390a25050505b600190555050505050565b5f805160206148ce833981519152836125b75760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a207a65726f2072656d6f746520626c6f636b636861696044820152631b88125160e21b60648201526084016101b0565b8054840361261f5760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e486f6d653a2063616e6e6f742072656769737465722072656d6f7460448201526e329037b71039b0b6b29031b430b4b760891b60648201526084016101b0565b6001600160a01b03831661268e5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e486f6d653a207a65726f2072656d6f746520746f6b656e2074726160448201526f6e73666572726572206164647265737360801b60648201526084016101b0565b5f84815260028201602090815260408083206001600160a01b038716845290915290205460ff161561270e5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f746520616c726561647920726567697374604482015263195c995960e21b60648201526084016101b0565b6012826040015160ff1611156127785760405162461bcd60e51b815260206004820152602960248201527f546f6b656e486f6d653a2072656d6f746520746f6b656e20646563696d616c73604482015268040e8dede40d0d2ced60bb1b60648201526084016101b0565b6001810154602083015160ff908116600160a01b90920416146127ec5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420686f6d6520746f6b656e20646560448201526563696d616c7360d01b60648201526084016101b0565b5f8061280d8360010160149054906101000a900460ff168560400151613343565b915091505f6128208383875f01516131c5565b905081801561283a57508451612837908490614737565b15155b1561284d5761284a600182614628565b90505b6040518060800160405280600115158152602001828152602001848152602001831515815250846002015f8981526020019081526020015f205f886001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff02191690831515021790555060208201518160010155604082015181600201556060820151816003015f6101000a81548160ff021916908315150217905550905050856001600160a01b0316877ff229b02a51a4c8d5ef03a096ae0dd727d7b48b710d21b50ebebb560eef739b9083886040015160405161294692919091825260ff16602082015260400190565b60405180910390a350505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa15801561299d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129c19190613e15565b90506129d86001600160a01b03861685308661338b565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612a1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a409190613e15565b9050818111612aa65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016101b0565b611fad82826141c3565b5f612abe84848460016133f2565b949350505050565b5f8051602061494e83398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612b20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b44919061474a565b9050612b508282610b1e565b156105885760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b60648201526084016101b0565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612c03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c279190613e15565b9050610ad68484612c388585614628565b613419565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612c83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ca79190613e15565b9050836001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004015f604051808303818588803b158015612ce2575f80fd5b505af1158015612cf4573d5f803e3d5ffd5b50506040516370a0823160e01b81523060048201525f93506001600160a01b03881692506370a082319150602401602060405180830381865afa158015612d3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d619190613e15565b9050818111612dcf5760405162461bcd60e51b815260206004820152603460248201527f53616665577261707065644e6174697665546f6b656e4465706f7369743a2062604482015273185b185b98d9481b9bdd081a5b98dc99585cd95960621b60648201526084016101b0565b612dd982826141c3565b95945050505050565b80471015612e055760405163cd78605960e01b81523060048201526024016101b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612e4e576040519150601f19603f3d011682016040523d82523d5f602084013e612e53565b606091505b5050905080611e8357604051630a12f52160e11b815260040160405180910390fd5b612e7d611e88565b612e8783826134a8565b611e83826134ca565b612e98611e88565b6107c46134db565b612ea8611e88565b6001600160a01b038216612efe5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e206164647265737300000060448201526064016101b0565b60128160ff161115612f5d5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b60648201526084016101b0565b5f5f805160206148ce83398151915290506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fd59190613e15565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b83515f906130275760405162461bcd60e51b81526004016101b09061417a565b6020850151156130855760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f7465206e6f7420636f6c6c61746572616c6044820152631a5e995960e21b60648201526084016101b0565b6130908484846134ef565b5f6130a486604001518760600151856131c5565b90505f8111612dd95760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e486f6d653a207a65726f20746f6b656e20616d6f756e740000000060448201526064016101b0565b5f845a10156131465760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e7420676173000000000060448201526064016101b0565b834710156131965760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c756500000060448201526064016101b0565b826001600160a01b03163b5f036131ae57505f612abe565b5f805f84516020860188888bf19695505050505050565b5f612abe8484845f6133f2565b5f8481525f8051602061490e833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff9081161580158352600184015495830195909552600283015493820193909352600390910154909116151560608201525f805160206148ce833981519152918061325857505f8160200151115b15613267575f92505050612abe565b8385116132cb5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e486f6d653a20696e73756666696369656e7420616d6f756e74207460448201526b6f20636f766572206665657360a01b60648201526084016101b0565b6132d584866141c3565b94505f6132eb8260400151836060015188612ab0565b9050805f036132ff575f9350505050612abe565b5f88815260038401602090815260408083206001600160a01b038b16845290915281208054839290613332908490614628565b909155509098975050505050505050565b5f8060ff8085169084161181816133665761335e8587614765565b60ff16613374565b6133708686614765565b60ff165b61337f90600a61485e565b96919550909350505050565b6040516001600160a01b038481166024830152838116604483015260648201839052610ad69186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506135dc565b5f8115158415150361340f576134088584614869565b9050612abe565b612dd98584614880565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261346a848261363d565b610ad6576040516001600160a01b0384811660248301525f604483015261349e91869182169063095ea7b3906064016133c0565b610ad684826135dc565b6134b0611e88565b6134b86136da565b6134c06136ea565b61080982826136f2565b6134d2611e88565b61078781613876565b5f5f8051602061492e83398151915261182f565b5f8381527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03861684529091529020545f805160206148ce83398151915290828110156135a65760405162461bcd60e51b815260206004820152602e60248201527f546f6b656e486f6d653a20696e73756666696369656e7420746f6b656e20747260448201526d616e736665722062616c616e636560901b60648201526084016101b0565b6135b083826141c3565b5f9586526003909201602090815260408087206001600160a01b03909616875294905250919092205550565b5f6135f06001600160a01b0384168361387e565b905080515f141580156136145750808060200190518101906136129190614893565b155b15611e8357604051635274afe760e01b81526001600160a01b03841660048201526024016101b0565b5f805f846001600160a01b03168460405161365891906148b2565b5f604051808303815f865af19150503d805f8114613691576040519150601f19603f3d011682016040523d82523d5f602084013e613696565b606091505b50915091508180156136c05750805115806136c05750808060200190518101906136c09190614893565b8015612dd95750505050506001600160a01b03163b151590565b6136e2611e88565b6107c461388b565b6107c4611e88565b6136fa611e88565b6001600160a01b0382166137765760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016101b0565b5f5f8051602061494e83398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137ec9190613e15565b116138545760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b60648201526084016101b0565b81546001600160a01b0319166001600160a01b038216178255610ad683610b3f565b610ae4611e88565b60606107f783835f613893565b61180c611e88565b6060814710156138b85760405163cd78605960e01b81523060048201526024016101b0565b5f80856001600160a01b031684866040516138d391906148b2565b5f6040518083038185875af1925050503d805f811461390d576040519150601f19603f3d011682016040523d82523d5f602084013e613912565b606091505b5091509150611fad8683836060826139325761392d82613979565b6107f7565b815115801561394957506001600160a01b0384163b155b1561397257604051639996b31560e01b81526001600160a01b03851660048201526024016101b0565b50806107f7565b8051156139895780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b0381168114610787575f80fd5b80356139c1816139a2565b919050565b5f80604083850312156139d7575f80fd5b8235915060208301356139e9816139a2565b809150509250929050565b5f60208284031215613a04575f80fd5b81356107f7816139a2565b5f60208284031215613a1f575f80fd5b5035919050565b5f60208284031215613a36575f80fd5b81356001600160401b03811115613a4b575f80fd5b820161016081850312156107f7575f80fd5b5f6101008284031215613a6e575f80fd5b50919050565b5f805f8060808587031215613a87575f80fd5b8435613a92816139a2565b93506020850135613aa2816139a2565b9250604085013591506060850135613ab9816139a2565b939692955090935050565b5f805f8060608587031215613ad7575f80fd5b843593506020850135613ae9816139a2565b925060408501356001600160401b0380821115613b04575f80fd5b818701915087601f830112613b17575f80fd5b813581811115613b25575f80fd5b886020828501011115613b36575f80fd5b95989497505060200194505050565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b60405161016081016001600160401b0381118282101715613bca57613bca613b93565b60405290565b60405161010081016001600160401b0381118282101715613bca57613bca613b93565b604080519081016001600160401b0381118282101715613bca57613bca613b93565b604051601f8201601f191681016001600160401b0381118282101715613c3d57613c3d613b93565b604052919050565b5f6001600160401b03821115613c5d57613c5d613b93565b50601f01601f191660200190565b5f82601f830112613c7a575f80fd5b8135613c8d613c8882613c45565b613c15565b818152846020838601011115613ca1575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6101608236031215613cce575f80fd5b613cd6613ba7565b82358152613ce6602084016139b6565b6020820152613cf7604084016139b6565b604082015260608301356001600160401b03811115613d14575f80fd5b613d2036828601613c6b565b6060830152506080830135608082015260a083013560a0820152613d4660c084016139b6565b60c0820152613d5760e084016139b6565b60e0820152610100613d6a8185016139b6565b90820152610120838101359082015261014092830135928101929092525090565b5f6101008284031215613d9c575f80fd5b613da4613bd0565b823581526020830135613db6816139a2565b60208201526040830135613dc9816139a2565b6040820152613dda606084016139b6565b60608201526080830135608082015260a083013560a082015260c083013560c0820152613e0960e084016139b6565b60e08201529392505050565b5f60208284031215613e25575f80fd5b5051919050565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b60208082526026908201527f546f6b656e486f6d653a206e6f6e2d7a65726f206d756c74692d686f702066616040820152656c6c6261636b60d01b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015613ee4578181015183820152602001613ecc565b50505f910152565b5f8151808452613f03816020860160208601613eca565b601f01601f19169290920160200192915050565b60208152815160208201525f602083015160018060a01b03808216604085015280604086015116606085015250506060830151613f5f60808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c0850152613f86610120850183613eec565b915060c085015160e085015260e0850151613fab828601826001600160a01b03169052565b5090949350505050565b602081525f825160058110613fd857634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612abe6060840182613eec565b60408152825160408201525f602084015161401d60608401826001600160a01b03169052565b5060408401516001600160a01b03166080830152606084015161016060a0840181905261404e6101a0850183613eec565b9150608086015160c085015260a086015160e085015260c0860151610100614080818701836001600160a01b03169052565b60e0880151915061012061409e818801846001600160a01b03169052565b908801519150610140906140bc878301846001600160a01b03169052565b880151928601929092525090940151610180830152506020015290565b81516001600160a01b031681526020808301519082015260408101610588565b5f6101208201905083518252602084015160018060a01b03808216602085015280604087015116604085015280606087015116606085015250506080840151608083015260a084015160a083015260c084015160c083015260e084015161416b60e08401826001600160a01b03169052565b50826101008301529392505050565b6020808252818101527f546f6b656e486f6d653a2072656d6f7465206e6f742072656769737465726564604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610588576105886141af565b5f82601f8301126141e5575f80fd5b81516141f3613c8882613c45565b818152846020838601011115614207575f80fd5b612abe826020830160208701613eca565b5f60208284031215614228575f80fd5b81516001600160401b038082111561423e575f80fd5b9083019060408286031215614251575f80fd5b614259613bf3565b825160058110614267575f80fd5b815260208301518281111561427a575f80fd5b614286878286016141d6565b60208301525095945050505050565b80516139c1816139a2565b5f604082840312156142b0575f80fd5b6142b8613bf3565b82516142c3816139a2565b81526020928301519281019290925250919050565b5f602082840312156142e8575f80fd5b81516001600160401b03808211156142fe575f80fd5b908301906101008286031215614312575f80fd5b61431a613bd0565b8251815261432a60208401614295565b602082015261433b60408401614295565b604082015261434c60608401614295565b60608201526080830151608082015260a08301518281111561436c575f80fd5b614378878286016141d6565b60a08301525060c083015160c082015261439460e08401614295565b60e082015295945050505050565b5f60e082840312156143b2575f80fd5b60405160e081018181106001600160401b03821117156143d4576143d4613b93565b6040528251815260208301516143e9816139a2565b602082015260408301516143fc816139a2565b80604083015250606083015160608201526080830151608082015260a083015160a082015260c083015161442f816139a2565b60c08201529392505050565b5f6020828403121561444b575f80fd5b81516001600160401b0380821115614461575f80fd5b908301906101608286031215614475575f80fd5b61447d613ba7565b61448683614295565b81526020830151602082015261449e60408401614295565b60408201526144af60608401614295565b60608201526080830151608082015260a0830151828111156144cf575f80fd5b6144db878286016141d6565b60a08301525060c083015160c08201526144f760e08401614295565b60e082015261010083810151908201526101209150614517828401614295565b9181019190915261014091820151918101919091529392505050565b805160ff811681146139c1575f80fd5b5f60608284031215614553575f80fd5b604051606081018181106001600160401b038211171561457557614575613b93565b6040528251815261458860208401614533565b602082015261459960408401614533565b60408201529392505050565b60208082526022908201527f546f6b656e486f6d653a207a65726f20726571756972656420676173206c696d6040820152611a5d60f21b606082015260800190565b60208082526021908201527f546f6b656e486f6d653a206e6f6e2d7a65726f207365636f6e646172792066656040820152606560f81b606082015260800190565b80820180821115610588576105886141af565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b808410156146c8578451831682529385019360019390930192908501906146a6565b5060a0880151878203601f190160e089015294506146e68186613eec565b98975050505050505050565b8481526001600160a01b038481166020830152831660408201526080606082018190525f90611fad90830184613eec565b634e487b7160e01b5f52601260045260245ffd5b5f8261474557614745614723565b500690565b5f6020828403121561475a575f80fd5b81516107f7816139a2565b60ff8281168282160390811115610588576105886141af565b600181815b808511156147b857815f190482111561479e5761479e6141af565b808516156147ab57918102915b93841c9390800290614783565b509250929050565b5f826147ce57506001610588565b816147da57505f610588565b81600181146147f057600281146147fa57614816565b6001915050610588565b60ff84111561480b5761480b6141af565b50506001821b610588565b5060208310610133831016604e8410600b8410161715614839575081810a610588565b614843838361477e565b805f1904821115614856576148566141af565b029392505050565b5f6107f783836147c0565b8082028115828204841417610588576105886141af565b5f8261488e5761488e614723565b500490565b5f602082840312156148a3575f80fd5b815180151581146107f7575f80fd5b5f82516148c3818460208701613eca565b919091019291505056fe9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e6003b5030f10c94fcbdaa3022348ff0b82dbd4c0c71339e41ff59d0bdc92179d6009316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e602d2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a2646970667358221220ea0a0e226fbb749e1d4c289c6fd2e9df065bea3446e4cea0074b08c1923e56eb64736f6c6343000819003354656c65706f7274657252656769737472794170703a20696e76616c69642054", + Bin: "0x608060405234801561000f575f80fd5b506040516152c13803806152c183398101604081905261002e91610890565b61003a84848484610046565b505050506108f1565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f8115801561008f5750825b90505f826001600160401b031660011480156100aa5750303b155b9050811580156100b8575080155b156100d65760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561010457845460ff60401b1916680100000000000000001785555b61011089898989610161565b831561015657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b610169610186565b6101778484848460126101d6565b61018081610202565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166101d457604051631afcd79f60e31b815260040160405180910390fd5b565b6101de610186565b6101e985858561024b565b6101f161026b565b6101fb828261027b565b5050505050565b61020a610186565b7f3b5030f10c94fcbdaa3022348ff0b82dbd4c0c71339e41ff59d0bdc92179d60080546001600160a01b0319166001600160a01b0392909216919091179055565b610253610186565b61025d8382610407565b6102668261042d565b505050565b610273610186565b6101d461043e565b610283610186565b6001600160a01b0382166102de5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e206164647265737300000060448201526064015b60405180910390fd5b60128160ff16111561033d5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b60648201526084016102d5565b5f7f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e60090507302000000000000000000000000000000000000056001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d591906108da565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b61040f610186565b610417610468565b61041f610478565b6104298282610480565b5050565b610435610186565b61004381610604565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75005b6001905550565b610470610186565b6101d461063e565b6101d4610186565b610488610186565b6001600160a01b0382166105045760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016102d5565b5f7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0090505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610569573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061058d91906108da565b116105e25760405162461bcd60e51b815260206004820152603260248201525f805160206152a1833981519152604482015271656c65706f7274657220726567697374727960701b60648201526084016102d5565b81546001600160a01b0319166001600160a01b0382161782556101808361066d565b61060c610186565b6001600160a01b03811661063557604051631e4fbdf760e01b81525f60048201526024016102d5565b61004381610805565b610646610186565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00610461565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa1580156106d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f891906108da565b6002830154909150818411156107575760405162461bcd60e51b815260206004820152603160248201525f805160206152a183398151915260448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016102d5565b8084116107cc5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016102d5565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b80516001600160a01b038116811461088b575f80fd5b919050565b5f805f80608085870312156108a3575f80fd5b6108ac85610875565b93506108ba60208601610875565b9250604085015191506108cf60608601610875565b905092959194509250565b5f602082840312156108ea575f80fd5b5051919050565b6149a3806108fe5f395ff3fe60806040526004361061011e575f3560e01c80638da5cb5b1161009d578063c8511ada11610062578063c8511ada146103d5578063c868efaa146104b5578063d2cc7a70146104d4578063efb5b95e14610507578063f2fde38b14610527575f80fd5b80638da5cb5b14610318578063909a6ac0146103545780639731429714610374578063b0b78b26146103a3578063be203094146103b6575f80fd5b80635eb99514116100e35780635eb995141461029f57806362e3901b146102be5780636e6eef8d146102de578063715018a6146102f15780638bf2fa9414610305575f80fd5b806310fe9ae8146101bf578063154d625a146102145780632b0d8f18146102415780634213cf78146102605780634511243e14610280575f80fd5b366101bb577f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e601546001600160a01b031633146101b95760405162461bcd60e51b815260206004820152602f60248201527f4e6174697665546f6b656e486f6d653a20696e76616c6964207265636569766560448201526e103830bcb0b136329039b2b73232b960891b60648201526084015b60405180910390fd5b005b5f80fd5b3480156101ca575f80fd5b507f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e601546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021f575f80fd5b5061023361022e3660046139c6565b610546565b60405190815260200161020b565b34801561024c575f80fd5b506101b961025b3660046139f4565b61058e565b34801561026b575f80fd5b505f805160206148ce83398151915254610233565b34801561028b575f80fd5b506101b961029a3660046139f4565b610687565b3480156102aa575f80fd5b506101b96102b9366004613a0f565b610776565b3480156102c9575f80fd5b506102335f805160206148ce83398151915281565b6101b96102ec366004613a26565b61078a565b3480156102fc575f80fd5b506101b96107b3565b6101b9610313366004613a5d565b6107c6565b348015610323575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101f7565b34801561035f575f80fd5b506102335f8051602061494e83398151915281565b34801561037f575f80fd5b5061039361038e3660046139f4565b6107de565b604051901515815260200161020b565b6101b96103b13660046139c6565b6107fe565b3480156103c1575f80fd5b506101b96103d0366004613a74565b61080d565b3480156103e0575f80fd5b5061047e6103ef3660046139c6565b60408051608080820183525f808352602080840182905283850182905260609384018290529581525f8051602061490e83398151915286528381206001600160a01b039590951681529385529282902082519384018352805460ff9081161515855260018201549585019590955260028101549284019290925260039091015490921615159181019190915290565b60405161020b9190815115158152602080830151908201526040808301519082015260609182015115159181019190915260800190565b3480156104c0575f80fd5b506101b96104cf366004613ac4565b61091f565b3480156104df575f80fd5b507fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0254610233565b348015610512575f80fd5b506102335f805160206148ee83398151915281565b348015610532575f80fd5b506101b96105413660046139f4565b610adc565b5f8281527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03851684529091529020545b92915050565b5f8051602061494e8339815191526105a4610b16565b6001600160a01b0382166105ca5760405162461bcd60e51b81526004016101b090613b45565b6105d48183610b1e565b156106375760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b60648201526084016101b0565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b5f8051602061494e83398151915261069d610b16565b6001600160a01b0382166106c35760405162461bcd60e51b81526004016101b090613b45565b6106cd8183610b1e565b61072b5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b60648201526084016101b0565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b61077e610b16565b61078781610b3f565b50565b6107876107a25f805160206148ce8339815191525490565b30336107ad85613cbd565b34610cd7565b6107bb610f3a565b6107c45f610f95565b565b6107876107d836839003830183613d8b565b34611005565b5f5f8051602061494e8339815191526107f78184610b1e565b9392505050565b6108098282346111bf565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108515750825b90505f826001600160401b0316600114801561086c5750303b155b90508115801561087a575080155b156108985760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108c257845460ff60401b1916600160401b1785555b6108ce898989896113af565b831561091457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6109276113ce565b5f5f8051602061494e83398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610992573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b69190613e15565b1015610a1d5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b60648201526084016101b0565b610a278133610b1e565b15610a8d5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b60648201526084016101b0565b610acd858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061141892505050565b50610ad661180c565b50505050565b610ae4610f3a565b6001600160a01b038116610b0d57604051631e4fbdf760e01b81525f60048201526024016101b0565b61078781610f95565b6107c4610f3a565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b5f8051602061494e83398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015610b93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb79190613e15565b600283015490915081841115610c295760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016101b0565b808411610c9e5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016101b0565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b5f8051602061492e8339815191528054600114610d065760405162461bcd60e51b81526004016101b090613e2c565b60028155610d1383611836565b60c08301516001600160a01b031615610d3e5760405162461bcd60e51b81526004016101b090613e70565b5f80610d5e855f0151866020015186886101000151896101200151611a1b565b915091505f604051806040016040528060026004811115610d8157610d81613eb6565b81526020016040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b0316815260200189604001516001600160a01b03168152602001868152602001896060015181526020018960a0015181526020018960e001516001600160a01b0316815250604051602001610e049190613f17565b60405160208183030381529060405281525090505f610ee46040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b61010001516001600160a01b03168152602001878152508152602001896080015181526020015f6001600160401b03811115610e8d57610e8d613b93565b604051908082528060200260200182016040528015610eb6578160200160208202803683370190505b50815260200184604051602001610ecd9190613fb5565b604051602081830303815290604052815250611be0565b9050876001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168987604051610f22929190613ff7565b60405180910390a35050600190925550505050505050565b33610f6c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107c45760405163118cdaa760e01b81523360048201526024016101b0565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8051602061492e83398151915280546001146110345760405162461bcd60e51b81526004016101b090613e2c565b6002815561104183611cfb565b60e08301516001600160a01b03161561106c5760405162461bcd60e51b81526004016101b090613e70565b5f8061108a855f015186602001518688606001518960800151611a1b565b915091505f6040518060400160405280600160048111156110ad576110ad613eb6565b8152602001604051806040016040528089604001516001600160a01b03168152602001868152506040516020016110e491906140d9565b60405160208183030381529060405281525090505f61116c6040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b606001516001600160a01b031681526020018781525081526020018960c0015181526020015f6001600160401b03811115610e8d57610e8d613b93565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb5289876040516111aa9291906140f9565b60405180910390a35050600190925550505050565b5f8051602061492e83398151915280546001146111ee5760405162461bcd60e51b81526004016101b090613e2c565b60028082555f8581525f8051602061490e833981519152602090815260408083206001600160a01b03881684528252918290208251608081018452815460ff9081161515808352600184015494830194909452948201549381019390935260030154909216151560608201525f805160206148ce833981519152916112855760405162461bcd60e51b81526004016101b09061417a565b5f8160200151116112e25760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20636f6c6c61746572616c206e656564656044820152601960fa1b60648201526084016101b0565b6112eb84611da4565b93505f808260200151861061131a5760208301515f925061130c90876141c3565b90508260200151955061132d565b85836020015161132a91906141c3565b91505b5f88815260028501602090815260408083206001600160a01b038b168085529083529281902060010185905580518981529182018590528a917f6769a5f9bfc8b6e0db839ab981cbf9239274ae72d2d035081a9157d43bd33cb6910160405180910390a380156113a1576113a13382611dca565b505060019092555050505050565b6113b7611e88565b6113c5848484846012611ed1565b610ad681611ef6565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161141257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f5f805160206148ce83398151915290505f8280602001905181019061143e9190614218565b905060018151600481111561145557611455613eb6565b0361149d575f816020015180602001905181019061147391906142a0565b90505f61148587878460200151611f2c565b9050611494825f015182611dca565b50505050505050565b6002815160048111156114b2576114b2613eb6565b036115cb575f81602001518060200190518101906114d091906142d8565b90505f6114e287878460800151611f2c565b825190915087146115485760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a206d69736d61746368656420736f7572636520626c6f60448201526918dad8da185a5b88125160b21b60648201526084016101b0565b856001600160a01b031682602001516001600160a01b0316146115c15760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e486f6d653a206d69736d617463686564206f726967696e2073656e60448201526a646572206164647265737360a81b60648201526084016101b0565b6114948282611fb7565b6003815160048111156115e0576115e0613eb6565b036116b4575f81602001518060200190518101906115fe91906143a2565b90505f8061161688888560600151866080015161213d565b915091506116aa604051806101000160405280855f0151815260200185602001516001600160a01b0316815260200185604001516001600160a01b03168152602001876001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018381526020015f81526020018560a0015181526020018560c001516001600160a01b0316815250836121e8565b5050505050505050565b6004815160048111156116c9576116c9613eb6565b036117c4575f81602001518060200190518101906116e7919061443b565b90505f806117008888856080015186610140015161213d565b915091506116aa8888855f01516040518061016001604052808860200151815260200188604001516001600160a01b0316815260200188606001516001600160a01b031681526020018860a00151815260200188610100015181526020018860c0015181526020018861012001516001600160a01b031681526020018860e001516001600160a01b031681526020018a6001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018681526020015f81525086612373565b5f815160048111156117d8576117d8613eb6565b03611805575f81602001518060200190518101906117f69190614543565b9050611803868683612550565b505b5050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b60408101516001600160a01b03166118a35760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420636f6e7472616044820152696374206164647265737360b01b60648201526084016101b0565b5f8160800151116118c65760405162461bcd60e51b81526004016101b0906145a5565b5f8160a00151116119255760405162461bcd60e51b815260206004820152602360248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420676173206c696044820152621b5a5d60ea1b60648201526084016101b0565b80608001518160a001511061198b5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420726563697069656e7420676173604482015265081b1a5b5a5d60d21b60648201526084016101b0565b60e08101516001600160a01b03166119f85760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f2066616c6c6261636b20726563697069656044820152696e74206164647265737360b01b60648201526084016101b0565b610140810151156107875760405162461bcd60e51b81526004016101b0906145e7565b5f8581525f8051602061490e833981519152602090815260408083206001600160a01b038816845282528083208151608081018352815460ff90811615158083526001840154958301959095526002830154938201939093526003909101549091161515606082015282915f805160206148ce8339815191529190611ab25760405162461bcd60e51b81526004016101b09061417a565b602081015115611b145760405162461bcd60e51b815260206004820152602760248201527f546f6b656e486f6d653a20636f6c6c61746572616c206e656564656420666f726044820152662072656d6f746560c81b60648201526084016101b0565b611b1d87611da4565b96508415611b3357611b30863387612957565b94505b5f611b47826040015183606001518a612ab0565b90505f8111611b985760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f207363616c656420616d6f756e7400000060448201526064016101b0565b5f8a815260038401602090815260408083206001600160a01b038d16845290915281208054839290611bcb908490614628565b90915550909a95995094975050505050505050565b5f80611bea612ac6565b60408401516020015190915015611c8f576040830151516001600160a01b0316611c6c5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b60648201526084016101b0565b604083015160208101519051611c8f916001600160a01b03909116908390612bb6565b604051630624488560e41b81526001600160a01b03821690636244885090611cbb90869060040161463b565b6020604051808303815f875af1158015611cd7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f79190613e15565b60408101516001600160a01b0316611d5f5760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20726563697069656e74206164647265736044820152607360f81b60648201526084016101b0565b5f8160c0015111611d825760405162461bcd60e51b81526004016101b0906145a5565b60a0810151156107875760405162461bcd60e51b81526004016101b0906145e7565b5f805160206148ee83398151915280545f91906107f7906001600160a01b031684612c3d565b6040518181525f805160206148ee833981519152906001600160a01b038416907f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b9060200160405180910390a28054604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015611e59575f80fd5b505af1158015611e6b573d5f803e3d5ffd5b50611e83925050506001600160a01b03841683612de2565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107c457604051631afcd79f60e31b815260040160405180910390fd5b611ed9611e88565b611ee4858585612e75565b611eec612e90565b6118058282612ea0565b611efe611e88565b5f805160206148ee83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b5f8381525f8051602061490e833981519152602090815260408083206001600160a01b038616845282528083208151608081018352815460ff9081161515825260018301549482019490945260028201549281019290925260030154909116151560608201525f805160206148ce83398151915290611fad81878787613007565b9695505050505050565b5f5f805160206148ee8339815191528054604051632e1a7d4d60e01b8152600481018590529192506001600160a01b031690632e1a7d4d906024015f604051808303815f87803b158015612009575f80fd5b505af115801561201b573d5f803e3d5ffd5b50508451602086015160408088015160a089015191515f965061204495509091906024016146f2565b60408051601f198184030181529190526020810180516001600160e01b031663161b12ff60e11b17905260c085015160608601519192505f9161208a91908690856130f5565b905080156120de5784606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff4856040516120d191815260200190565b60405180910390a2611805565b84606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb08560405161211d91815260200190565b60405180910390a260e0850151611805906001600160a01b031685612de2565b5f8481525f8051602061490e833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff90811615158252600183015494820194909452600282015492810192909252600301549091161515606082015281905f805160206148ce83398151915290826121c1828a8a8a613007565b90505f6121d783604001518460600151896131c5565b919a91995090975050505050505050565b5f8051602061492e83398151915280546001146122175760405162461bcd60e51b81526004016101b090613e2c565b6002815561222483611cfb565b5f61223c845f015185602001518587608001516131d2565b9050805f03612259576122538460e0015184611dca565b5061236b565b604080518082019091525f908060018152602001604051806040016040528088604001516001600160a01b031681526020018581525060405160200161229f91906140d9565b60405160208183030381529060405281525090505f61232b6040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a606001516001600160a01b031681526020018a6080015181525081526020018860c0015181526020015f6001600160401b03811115610e8d57610e8d613b93565b9050807f825080857c76cef4a1629c0705a7f8b4ef0282ddcafde0b6715c4fb34b68aaf0878560405161235f9291906140f9565b60405180910390a25050505b600190555050565b5f8051602061492e83398151915280546001146123a25760405162461bcd60e51b81526004016101b090613e2c565b600281556123af83611836565b5f6123c8845f01518560200151858761012001516131d2565b9050805f036123e5576123df8460c0015184611dca565b50612545565b604080518082019091525f9080600281526020016040518061010001604052808b81526020018a6001600160a01b03168152602001896001600160a01b0316815260200188604001516001600160a01b03168152602001858152602001886060015181526020018860a0015181526020018860e001516001600160a01b03168152506040516020016124779190613f17565b60405160208183030381529060405281525090505f6125056040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a61010001516001600160a01b031681526020018a61012001518152508152602001886080015181526020015f6001600160401b03811115610e8d57610e8d613b93565b9050807f42eff9005856e3c586b096d67211a566dc926052119fd7cc08023c70937ecb308785604051612539929190613ff7565b60405180910390a25050505b600190555050505050565b5f805160206148ce833981519152836125b75760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a207a65726f2072656d6f746520626c6f636b636861696044820152631b88125160e21b60648201526084016101b0565b8054840361261f5760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e486f6d653a2063616e6e6f742072656769737465722072656d6f7460448201526e329037b71039b0b6b29031b430b4b760891b60648201526084016101b0565b6001600160a01b03831661268e5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e486f6d653a207a65726f2072656d6f746520746f6b656e2074726160448201526f6e73666572726572206164647265737360801b60648201526084016101b0565b5f84815260028201602090815260408083206001600160a01b038716845290915290205460ff161561270e5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f746520616c726561647920726567697374604482015263195c995960e21b60648201526084016101b0565b6012826040015160ff1611156127785760405162461bcd60e51b815260206004820152602960248201527f546f6b656e486f6d653a2072656d6f746520746f6b656e20646563696d616c73604482015268040e8dede40d0d2ced60bb1b60648201526084016101b0565b6001810154602083015160ff908116600160a01b90920416146127ec5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420686f6d6520746f6b656e20646560448201526563696d616c7360d01b60648201526084016101b0565b5f8061280d8360010160149054906101000a900460ff168560400151613343565b915091505f6128208383875f01516131c5565b905081801561283a57508451612837908490614737565b15155b1561284d5761284a600182614628565b90505b6040518060800160405280600115158152602001828152602001848152602001831515815250846002015f8981526020019081526020015f205f886001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff02191690831515021790555060208201518160010155604082015181600201556060820151816003015f6101000a81548160ff021916908315150217905550905050856001600160a01b0316877ff229b02a51a4c8d5ef03a096ae0dd727d7b48b710d21b50ebebb560eef739b9083886040015160405161294692919091825260ff16602082015260400190565b60405180910390a350505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa15801561299d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129c19190613e15565b90506129d86001600160a01b03861685308661338b565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612a1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a409190613e15565b9050818111612aa65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016101b0565b611fad82826141c3565b5f612abe84848460016133f2565b949350505050565b5f8051602061494e83398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612b20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b44919061474a565b9050612b508282610b1e565b156105885760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b60648201526084016101b0565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612c03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c279190613e15565b9050610ad68484612c388585614628565b613419565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612c83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ca79190613e15565b9050836001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004015f604051808303818588803b158015612ce2575f80fd5b505af1158015612cf4573d5f803e3d5ffd5b50506040516370a0823160e01b81523060048201525f93506001600160a01b03881692506370a082319150602401602060405180830381865afa158015612d3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d619190613e15565b9050818111612dcf5760405162461bcd60e51b815260206004820152603460248201527f53616665577261707065644e6174697665546f6b656e4465706f7369743a2062604482015273185b185b98d9481b9bdd081a5b98dc99585cd95960621b60648201526084016101b0565b612dd982826141c3565b95945050505050565b80471015612e055760405163cd78605960e01b81523060048201526024016101b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612e4e576040519150601f19603f3d011682016040523d82523d5f602084013e612e53565b606091505b5050905080611e8357604051630a12f52160e11b815260040160405180910390fd5b612e7d611e88565b612e8783826134a8565b611e83826134ca565b612e98611e88565b6107c46134db565b612ea8611e88565b6001600160a01b038216612efe5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e206164647265737300000060448201526064016101b0565b60128160ff161115612f5d5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b60648201526084016101b0565b5f5f805160206148ce83398151915290506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fd59190613e15565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b83515f906130275760405162461bcd60e51b81526004016101b09061417a565b6020850151156130855760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f7465206e6f7420636f6c6c61746572616c6044820152631a5e995960e21b60648201526084016101b0565b6130908484846134ef565b5f6130a486604001518760600151856131c5565b90505f8111612dd95760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e486f6d653a207a65726f20746f6b656e20616d6f756e740000000060448201526064016101b0565b5f845a10156131465760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e7420676173000000000060448201526064016101b0565b834710156131965760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c756500000060448201526064016101b0565b826001600160a01b03163b5f036131ae57505f612abe565b5f805f84516020860188888bf19695505050505050565b5f612abe8484845f6133f2565b5f8481525f8051602061490e833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff9081161580158352600184015495830195909552600283015493820193909352600390910154909116151560608201525f805160206148ce833981519152918061325857505f8160200151115b15613267575f92505050612abe565b8385116132cb5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e486f6d653a20696e73756666696369656e7420616d6f756e74207460448201526b6f20636f766572206665657360a01b60648201526084016101b0565b6132d584866141c3565b94505f6132eb8260400151836060015188612ab0565b9050805f036132ff575f9350505050612abe565b5f88815260038401602090815260408083206001600160a01b038b16845290915281208054839290613332908490614628565b909155509098975050505050505050565b5f8060ff8085169084161181816133665761335e8587614765565b60ff16613374565b6133708686614765565b60ff165b61337f90600a61485e565b96919550909350505050565b6040516001600160a01b038481166024830152838116604483015260648201839052610ad69186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506135dc565b5f8115158415150361340f576134088584614869565b9050612abe565b612dd98584614880565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261346a848261363d565b610ad6576040516001600160a01b0384811660248301525f604483015261349e91869182169063095ea7b3906064016133c0565b610ad684826135dc565b6134b0611e88565b6134b86136da565b6134c06136ea565b61080982826136f2565b6134d2611e88565b61078781613876565b5f5f8051602061492e83398151915261182f565b5f8381527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03861684529091529020545f805160206148ce83398151915290828110156135a65760405162461bcd60e51b815260206004820152602e60248201527f546f6b656e486f6d653a20696e73756666696369656e7420746f6b656e20747260448201526d616e736665722062616c616e636560901b60648201526084016101b0565b6135b083826141c3565b5f9586526003909201602090815260408087206001600160a01b03909616875294905250919092205550565b5f6135f06001600160a01b0384168361387e565b905080515f141580156136145750808060200190518101906136129190614893565b155b15611e8357604051635274afe760e01b81526001600160a01b03841660048201526024016101b0565b5f805f846001600160a01b03168460405161365891906148b2565b5f604051808303815f865af19150503d805f8114613691576040519150601f19603f3d011682016040523d82523d5f602084013e613696565b606091505b50915091508180156136c05750805115806136c05750808060200190518101906136c09190614893565b8015612dd95750505050506001600160a01b03163b151590565b6136e2611e88565b6107c461388b565b6107c4611e88565b6136fa611e88565b6001600160a01b0382166137765760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016101b0565b5f5f8051602061494e83398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137ec9190613e15565b116138545760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b60648201526084016101b0565b81546001600160a01b0319166001600160a01b038216178255610ad683610b3f565b610ae4611e88565b60606107f783835f613893565b61180c611e88565b6060814710156138b85760405163cd78605960e01b81523060048201526024016101b0565b5f80856001600160a01b031684866040516138d391906148b2565b5f6040518083038185875af1925050503d805f811461390d576040519150601f19603f3d011682016040523d82523d5f602084013e613912565b606091505b5091509150611fad8683836060826139325761392d82613979565b6107f7565b815115801561394957506001600160a01b0384163b155b1561397257604051639996b31560e01b81526001600160a01b03851660048201526024016101b0565b50806107f7565b8051156139895780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b0381168114610787575f80fd5b80356139c1816139a2565b919050565b5f80604083850312156139d7575f80fd5b8235915060208301356139e9816139a2565b809150509250929050565b5f60208284031215613a04575f80fd5b81356107f7816139a2565b5f60208284031215613a1f575f80fd5b5035919050565b5f60208284031215613a36575f80fd5b81356001600160401b03811115613a4b575f80fd5b820161016081850312156107f7575f80fd5b5f6101008284031215613a6e575f80fd5b50919050565b5f805f8060808587031215613a87575f80fd5b8435613a92816139a2565b93506020850135613aa2816139a2565b9250604085013591506060850135613ab9816139a2565b939692955090935050565b5f805f8060608587031215613ad7575f80fd5b843593506020850135613ae9816139a2565b925060408501356001600160401b0380821115613b04575f80fd5b818701915087601f830112613b17575f80fd5b813581811115613b25575f80fd5b886020828501011115613b36575f80fd5b95989497505060200194505050565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b60405161016081016001600160401b0381118282101715613bca57613bca613b93565b60405290565b60405161010081016001600160401b0381118282101715613bca57613bca613b93565b604080519081016001600160401b0381118282101715613bca57613bca613b93565b604051601f8201601f191681016001600160401b0381118282101715613c3d57613c3d613b93565b604052919050565b5f6001600160401b03821115613c5d57613c5d613b93565b50601f01601f191660200190565b5f82601f830112613c7a575f80fd5b8135613c8d613c8882613c45565b613c15565b818152846020838601011115613ca1575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6101608236031215613cce575f80fd5b613cd6613ba7565b82358152613ce6602084016139b6565b6020820152613cf7604084016139b6565b604082015260608301356001600160401b03811115613d14575f80fd5b613d2036828601613c6b565b6060830152506080830135608082015260a083013560a0820152613d4660c084016139b6565b60c0820152613d5760e084016139b6565b60e0820152610100613d6a8185016139b6565b90820152610120838101359082015261014092830135928101929092525090565b5f6101008284031215613d9c575f80fd5b613da4613bd0565b823581526020830135613db6816139a2565b60208201526040830135613dc9816139a2565b6040820152613dda606084016139b6565b60608201526080830135608082015260a083013560a082015260c083013560c0820152613e0960e084016139b6565b60e08201529392505050565b5f60208284031215613e25575f80fd5b5051919050565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b60208082526026908201527f546f6b656e486f6d653a206e6f6e2d7a65726f206d756c74692d686f702066616040820152656c6c6261636b60d01b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015613ee4578181015183820152602001613ecc565b50505f910152565b5f8151808452613f03816020860160208601613eca565b601f01601f19169290920160200192915050565b60208152815160208201525f602083015160018060a01b03808216604085015280604086015116606085015250506060830151613f5f60808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c0850152613f86610120850183613eec565b915060c085015160e085015260e0850151613fab828601826001600160a01b03169052565b5090949350505050565b602081525f825160058110613fd857634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612abe6060840182613eec565b60408152825160408201525f602084015161401d60608401826001600160a01b03169052565b5060408401516001600160a01b03166080830152606084015161016060a0840181905261404e6101a0850183613eec565b9150608086015160c085015260a086015160e085015260c0860151610100614080818701836001600160a01b03169052565b60e0880151915061012061409e818801846001600160a01b03169052565b908801519150610140906140bc878301846001600160a01b03169052565b880151928601929092525090940151610180830152506020015290565b81516001600160a01b031681526020808301519082015260408101610588565b5f6101208201905083518252602084015160018060a01b03808216602085015280604087015116604085015280606087015116606085015250506080840151608083015260a084015160a083015260c084015160c083015260e084015161416b60e08401826001600160a01b03169052565b50826101008301529392505050565b6020808252818101527f546f6b656e486f6d653a2072656d6f7465206e6f742072656769737465726564604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610588576105886141af565b5f82601f8301126141e5575f80fd5b81516141f3613c8882613c45565b818152846020838601011115614207575f80fd5b612abe826020830160208701613eca565b5f60208284031215614228575f80fd5b81516001600160401b038082111561423e575f80fd5b9083019060408286031215614251575f80fd5b614259613bf3565b825160058110614267575f80fd5b815260208301518281111561427a575f80fd5b614286878286016141d6565b60208301525095945050505050565b80516139c1816139a2565b5f604082840312156142b0575f80fd5b6142b8613bf3565b82516142c3816139a2565b81526020928301519281019290925250919050565b5f602082840312156142e8575f80fd5b81516001600160401b03808211156142fe575f80fd5b908301906101008286031215614312575f80fd5b61431a613bd0565b8251815261432a60208401614295565b602082015261433b60408401614295565b604082015261434c60608401614295565b60608201526080830151608082015260a08301518281111561436c575f80fd5b614378878286016141d6565b60a08301525060c083015160c082015261439460e08401614295565b60e082015295945050505050565b5f60e082840312156143b2575f80fd5b60405160e081018181106001600160401b03821117156143d4576143d4613b93565b6040528251815260208301516143e9816139a2565b602082015260408301516143fc816139a2565b80604083015250606083015160608201526080830151608082015260a083015160a082015260c083015161442f816139a2565b60c08201529392505050565b5f6020828403121561444b575f80fd5b81516001600160401b0380821115614461575f80fd5b908301906101608286031215614475575f80fd5b61447d613ba7565b61448683614295565b81526020830151602082015261449e60408401614295565b60408201526144af60608401614295565b60608201526080830151608082015260a0830151828111156144cf575f80fd5b6144db878286016141d6565b60a08301525060c083015160c08201526144f760e08401614295565b60e082015261010083810151908201526101209150614517828401614295565b9181019190915261014091820151918101919091529392505050565b805160ff811681146139c1575f80fd5b5f60608284031215614553575f80fd5b604051606081018181106001600160401b038211171561457557614575613b93565b6040528251815261458860208401614533565b602082015261459960408401614533565b60408201529392505050565b60208082526022908201527f546f6b656e486f6d653a207a65726f20726571756972656420676173206c696d6040820152611a5d60f21b606082015260800190565b60208082526021908201527f546f6b656e486f6d653a206e6f6e2d7a65726f207365636f6e646172792066656040820152606560f81b606082015260800190565b80820180821115610588576105886141af565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b808410156146c8578451831682529385019360019390930192908501906146a6565b5060a0880151878203601f190160e089015294506146e68186613eec565b98975050505050505050565b8481526001600160a01b038481166020830152831660408201526080606082018190525f90611fad90830184613eec565b634e487b7160e01b5f52601260045260245ffd5b5f8261474557614745614723565b500690565b5f6020828403121561475a575f80fd5b81516107f7816139a2565b60ff8281168282160390811115610588576105886141af565b600181815b808511156147b857815f190482111561479e5761479e6141af565b808516156147ab57918102915b93841c9390800290614783565b509250929050565b5f826147ce57506001610588565b816147da57505f610588565b81600181146147f057600281146147fa57614816565b6001915050610588565b60ff84111561480b5761480b6141af565b50506001821b610588565b5060208310610133831016604e8410600b8410161715614839575081810a610588565b614843838361477e565b805f1904821115614856576148566141af565b029392505050565b5f6107f783836147c0565b8082028115828204841417610588576105886141af565b5f8261488e5761488e614723565b500490565b5f602082840312156148a3575f80fd5b815180151581146107f7575f80fd5b5f82516148c3818460208701613eca565b919091019291505056fe9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e6003b5030f10c94fcbdaa3022348ff0b82dbd4c0c71339e41ff59d0bdc92179d6009316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e602d2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a2646970667358221220885f401908e8d20bb8603083038950cc5c9c62c19782c1b7c08caae5ddc297f764736f6c6343000819003354656c65706f7274657252656769737472794170703a20696e76616c69642054", } // NativeTokenHomeABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/ictt/TokenHome/NativeTokenHomeUpgradeable/NativeTokenHomeUpgradeable.go b/abi-bindings/go/ictt/TokenHome/NativeTokenHomeUpgradeable/NativeTokenHomeUpgradeable.go index 9558e7ca8..239cf9b0b 100644 --- a/abi-bindings/go/ictt/TokenHome/NativeTokenHomeUpgradeable/NativeTokenHomeUpgradeable.go +++ b/abi-bindings/go/ictt/TokenHome/NativeTokenHomeUpgradeable/NativeTokenHomeUpgradeable.go @@ -67,7 +67,7 @@ type SendTokensInput struct { // NativeTokenHomeUpgradeableMetaData contains all meta data concerning the NativeTokenHomeUpgradeable contract. var NativeTokenHomeUpgradeableMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remaining\",\"type\":\"uint256\"}],\"name\":\"CollateralAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldMinTeleporterVersion\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newMinTeleporterVersion\",\"type\":\"uint256\"}],\"name\":\"MinTeleporterVersionUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"initialCollateralNeeded\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"RemoteRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressUnpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensAndCallRouted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensAndCallSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensRouted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_HOME_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TELEPORTER_REGISTRY_APP_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_HOME_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"}],\"name\":\"addCollateral\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinTeleporterVersion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"}],\"name\":\"getRemoteTokenTransferrerSettings\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"registered\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"collateralNeeded\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenMultiplier\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"multiplyOnRemote\",\"type\":\"bool\"}],\"internalType\":\"structRemoteTokenTransferrerSettings\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"remoteBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"remoteTokenTransferrerAddress\",\"type\":\"address\"}],\"name\":\"getTransferredBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterRegistryAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"teleporterManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minTeleporterVersion\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"wrappedTokenAddress\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"isTeleporterAddressPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"pauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"originSenderAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"receiveTeleporterMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"}],\"name\":\"send\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"}],\"name\":\"sendAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"unpauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"updateMinTeleporterVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614af0380380614af083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6149a38061014d5f395ff3fe60806040526004361061011e575f3560e01c80638da5cb5b1161009d578063c8511ada11610062578063c8511ada146103d5578063c868efaa146104b5578063d2cc7a70146104d4578063efb5b95e14610507578063f2fde38b14610527575f80fd5b80638da5cb5b14610318578063909a6ac0146103545780639731429714610374578063b0b78b26146103a3578063be203094146103b6575f80fd5b80635eb99514116100e35780635eb995141461029f57806362e3901b146102be5780636e6eef8d146102de578063715018a6146102f15780638bf2fa9414610305575f80fd5b806310fe9ae8146101bf578063154d625a146102145780632b0d8f18146102415780634213cf78146102605780634511243e14610280575f80fd5b366101bb577f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e601546001600160a01b031633146101b95760405162461bcd60e51b815260206004820152602f60248201527f4e6174697665546f6b656e486f6d653a20696e76616c6964207265636569766560448201526e103830bcb0b136329039b2b73232b960891b60648201526084015b60405180910390fd5b005b5f80fd5b3480156101ca575f80fd5b507f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e601546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021f575f80fd5b5061023361022e3660046139c6565b610546565b60405190815260200161020b565b34801561024c575f80fd5b506101b961025b3660046139f4565b61058e565b34801561026b575f80fd5b505f805160206148ce83398151915254610233565b34801561028b575f80fd5b506101b961029a3660046139f4565b610687565b3480156102aa575f80fd5b506101b96102b9366004613a0f565b610776565b3480156102c9575f80fd5b506102335f805160206148ce83398151915281565b6101b96102ec366004613a26565b61078a565b3480156102fc575f80fd5b506101b96107b3565b6101b9610313366004613a5d565b6107c6565b348015610323575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101f7565b34801561035f575f80fd5b506102335f8051602061494e83398151915281565b34801561037f575f80fd5b5061039361038e3660046139f4565b6107de565b604051901515815260200161020b565b6101b96103b13660046139c6565b6107fe565b3480156103c1575f80fd5b506101b96103d0366004613a74565b61080d565b3480156103e0575f80fd5b5061047e6103ef3660046139c6565b60408051608080820183525f808352602080840182905283850182905260609384018290529581525f8051602061490e83398151915286528381206001600160a01b039590951681529385529282902082519384018352805460ff9081161515855260018201549585019590955260028101549284019290925260039091015490921615159181019190915290565b60405161020b9190815115158152602080830151908201526040808301519082015260609182015115159181019190915260800190565b3480156104c0575f80fd5b506101b96104cf366004613ac4565b61091f565b3480156104df575f80fd5b507fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0254610233565b348015610512575f80fd5b506102335f805160206148ee83398151915281565b348015610532575f80fd5b506101b96105413660046139f4565b610adc565b5f8281527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03851684529091529020545b92915050565b5f8051602061494e8339815191526105a4610b16565b6001600160a01b0382166105ca5760405162461bcd60e51b81526004016101b090613b45565b6105d48183610b1e565b156106375760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b60648201526084016101b0565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b5f8051602061494e83398151915261069d610b16565b6001600160a01b0382166106c35760405162461bcd60e51b81526004016101b090613b45565b6106cd8183610b1e565b61072b5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b60648201526084016101b0565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b61077e610b16565b61078781610b3f565b50565b6107876107a25f805160206148ce8339815191525490565b30336107ad85613cbd565b34610cd7565b6107bb610f3a565b6107c45f610f95565b565b6107876107d836839003830183613d8b565b34611005565b5f5f8051602061494e8339815191526107f78184610b1e565b9392505050565b6108098282346111bf565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108515750825b90505f826001600160401b0316600114801561086c5750303b155b90508115801561087a575080155b156108985760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108c257845460ff60401b1916600160401b1785555b6108ce898989896113af565b831561091457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6109276113ce565b5f5f8051602061494e83398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610992573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b69190613e15565b1015610a1d5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b60648201526084016101b0565b610a278133610b1e565b15610a8d5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b60648201526084016101b0565b610acd858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061141892505050565b50610ad661180c565b50505050565b610ae4610f3a565b6001600160a01b038116610b0d57604051631e4fbdf760e01b81525f60048201526024016101b0565b61078781610f95565b6107c4610f3a565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b5f8051602061494e83398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015610b93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb79190613e15565b600283015490915081841115610c295760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016101b0565b808411610c9e5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016101b0565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b5f8051602061492e8339815191528054600114610d065760405162461bcd60e51b81526004016101b090613e2c565b60028155610d1383611836565b60c08301516001600160a01b031615610d3e5760405162461bcd60e51b81526004016101b090613e70565b5f80610d5e855f0151866020015186886101000151896101200151611a1b565b915091505f604051806040016040528060026004811115610d8157610d81613eb6565b81526020016040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b0316815260200189604001516001600160a01b03168152602001868152602001896060015181526020018960a0015181526020018960e001516001600160a01b0316815250604051602001610e049190613f17565b60405160208183030381529060405281525090505f610ee46040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b61010001516001600160a01b03168152602001878152508152602001896080015181526020015f6001600160401b03811115610e8d57610e8d613b93565b604051908082528060200260200182016040528015610eb6578160200160208202803683370190505b50815260200184604051602001610ecd9190613fb5565b604051602081830303815290604052815250611be0565b9050876001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168987604051610f22929190613ff7565b60405180910390a35050600190925550505050505050565b33610f6c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107c45760405163118cdaa760e01b81523360048201526024016101b0565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8051602061492e83398151915280546001146110345760405162461bcd60e51b81526004016101b090613e2c565b6002815561104183611cfb565b60e08301516001600160a01b03161561106c5760405162461bcd60e51b81526004016101b090613e70565b5f8061108a855f015186602001518688606001518960800151611a1b565b915091505f6040518060400160405280600160048111156110ad576110ad613eb6565b8152602001604051806040016040528089604001516001600160a01b03168152602001868152506040516020016110e491906140d9565b60405160208183030381529060405281525090505f61116c6040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b606001516001600160a01b031681526020018781525081526020018960c0015181526020015f6001600160401b03811115610e8d57610e8d613b93565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb5289876040516111aa9291906140f9565b60405180910390a35050600190925550505050565b5f8051602061492e83398151915280546001146111ee5760405162461bcd60e51b81526004016101b090613e2c565b60028082555f8581525f8051602061490e833981519152602090815260408083206001600160a01b03881684528252918290208251608081018452815460ff9081161515808352600184015494830194909452948201549381019390935260030154909216151560608201525f805160206148ce833981519152916112855760405162461bcd60e51b81526004016101b09061417a565b5f8160200151116112e25760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20636f6c6c61746572616c206e656564656044820152601960fa1b60648201526084016101b0565b6112eb84611da4565b93505f808260200151861061131a5760208301515f925061130c90876141c3565b90508260200151955061132d565b85836020015161132a91906141c3565b91505b5f88815260028501602090815260408083206001600160a01b038b168085529083529281902060010185905580518981529182018590528a917f6769a5f9bfc8b6e0db839ab981cbf9239274ae72d2d035081a9157d43bd33cb6910160405180910390a380156113a1576113a13382611dca565b505060019092555050505050565b6113b7611e88565b6113c5848484846012611ed1565b610ad681611ef6565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161141257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f5f805160206148ce83398151915290505f8280602001905181019061143e9190614218565b905060018151600481111561145557611455613eb6565b0361149d575f816020015180602001905181019061147391906142a0565b90505f61148587878460200151611f2c565b9050611494825f015182611dca565b50505050505050565b6002815160048111156114b2576114b2613eb6565b036115cb575f81602001518060200190518101906114d091906142d8565b90505f6114e287878460800151611f2c565b825190915087146115485760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a206d69736d61746368656420736f7572636520626c6f60448201526918dad8da185a5b88125160b21b60648201526084016101b0565b856001600160a01b031682602001516001600160a01b0316146115c15760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e486f6d653a206d69736d617463686564206f726967696e2073656e60448201526a646572206164647265737360a81b60648201526084016101b0565b6114948282611fb7565b6003815160048111156115e0576115e0613eb6565b036116b4575f81602001518060200190518101906115fe91906143a2565b90505f8061161688888560600151866080015161213d565b915091506116aa604051806101000160405280855f0151815260200185602001516001600160a01b0316815260200185604001516001600160a01b03168152602001876001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018381526020015f81526020018560a0015181526020018560c001516001600160a01b0316815250836121e8565b5050505050505050565b6004815160048111156116c9576116c9613eb6565b036117c4575f81602001518060200190518101906116e7919061443b565b90505f806117008888856080015186610140015161213d565b915091506116aa8888855f01516040518061016001604052808860200151815260200188604001516001600160a01b0316815260200188606001516001600160a01b031681526020018860a00151815260200188610100015181526020018860c0015181526020018861012001516001600160a01b031681526020018860e001516001600160a01b031681526020018a6001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018681526020015f81525086612373565b5f815160048111156117d8576117d8613eb6565b03611805575f81602001518060200190518101906117f69190614543565b9050611803868683612550565b505b5050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b60408101516001600160a01b03166118a35760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420636f6e7472616044820152696374206164647265737360b01b60648201526084016101b0565b5f8160800151116118c65760405162461bcd60e51b81526004016101b0906145a5565b5f8160a00151116119255760405162461bcd60e51b815260206004820152602360248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420676173206c696044820152621b5a5d60ea1b60648201526084016101b0565b80608001518160a001511061198b5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420726563697069656e7420676173604482015265081b1a5b5a5d60d21b60648201526084016101b0565b60e08101516001600160a01b03166119f85760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f2066616c6c6261636b20726563697069656044820152696e74206164647265737360b01b60648201526084016101b0565b610140810151156107875760405162461bcd60e51b81526004016101b0906145e7565b5f8581525f8051602061490e833981519152602090815260408083206001600160a01b038816845282528083208151608081018352815460ff90811615158083526001840154958301959095526002830154938201939093526003909101549091161515606082015282915f805160206148ce8339815191529190611ab25760405162461bcd60e51b81526004016101b09061417a565b602081015115611b145760405162461bcd60e51b815260206004820152602760248201527f546f6b656e486f6d653a20636f6c6c61746572616c206e656564656420666f726044820152662072656d6f746560c81b60648201526084016101b0565b611b1d87611da4565b96508415611b3357611b30863387612957565b94505b5f611b47826040015183606001518a612ab0565b90505f8111611b985760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f207363616c656420616d6f756e7400000060448201526064016101b0565b5f8a815260038401602090815260408083206001600160a01b038d16845290915281208054839290611bcb908490614628565b90915550909a95995094975050505050505050565b5f80611bea612ac6565b60408401516020015190915015611c8f576040830151516001600160a01b0316611c6c5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b60648201526084016101b0565b604083015160208101519051611c8f916001600160a01b03909116908390612bb6565b604051630624488560e41b81526001600160a01b03821690636244885090611cbb90869060040161463b565b6020604051808303815f875af1158015611cd7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f79190613e15565b60408101516001600160a01b0316611d5f5760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20726563697069656e74206164647265736044820152607360f81b60648201526084016101b0565b5f8160c0015111611d825760405162461bcd60e51b81526004016101b0906145a5565b60a0810151156107875760405162461bcd60e51b81526004016101b0906145e7565b5f805160206148ee83398151915280545f91906107f7906001600160a01b031684612c3d565b6040518181525f805160206148ee833981519152906001600160a01b038416907f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b9060200160405180910390a28054604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015611e59575f80fd5b505af1158015611e6b573d5f803e3d5ffd5b50611e83925050506001600160a01b03841683612de2565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107c457604051631afcd79f60e31b815260040160405180910390fd5b611ed9611e88565b611ee4858585612e75565b611eec612e90565b6118058282612ea0565b611efe611e88565b5f805160206148ee83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b5f8381525f8051602061490e833981519152602090815260408083206001600160a01b038616845282528083208151608081018352815460ff9081161515825260018301549482019490945260028201549281019290925260030154909116151560608201525f805160206148ce83398151915290611fad81878787613007565b9695505050505050565b5f5f805160206148ee8339815191528054604051632e1a7d4d60e01b8152600481018590529192506001600160a01b031690632e1a7d4d906024015f604051808303815f87803b158015612009575f80fd5b505af115801561201b573d5f803e3d5ffd5b50508451602086015160408088015160a089015191515f965061204495509091906024016146f2565b60408051601f198184030181529190526020810180516001600160e01b031663161b12ff60e11b17905260c085015160608601519192505f9161208a91908690856130f5565b905080156120de5784606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff4856040516120d191815260200190565b60405180910390a2611805565b84606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb08560405161211d91815260200190565b60405180910390a260e0850151611805906001600160a01b031685612de2565b5f8481525f8051602061490e833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff90811615158252600183015494820194909452600282015492810192909252600301549091161515606082015281905f805160206148ce83398151915290826121c1828a8a8a613007565b90505f6121d783604001518460600151896131c5565b919a91995090975050505050505050565b5f8051602061492e83398151915280546001146122175760405162461bcd60e51b81526004016101b090613e2c565b6002815561222483611cfb565b5f61223c845f015185602001518587608001516131d2565b9050805f03612259576122538460e0015184611dca565b5061236b565b604080518082019091525f908060018152602001604051806040016040528088604001516001600160a01b031681526020018581525060405160200161229f91906140d9565b60405160208183030381529060405281525090505f61232b6040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a606001516001600160a01b031681526020018a6080015181525081526020018860c0015181526020015f6001600160401b03811115610e8d57610e8d613b93565b9050807f825080857c76cef4a1629c0705a7f8b4ef0282ddcafde0b6715c4fb34b68aaf0878560405161235f9291906140f9565b60405180910390a25050505b600190555050565b5f8051602061492e83398151915280546001146123a25760405162461bcd60e51b81526004016101b090613e2c565b600281556123af83611836565b5f6123c8845f01518560200151858761012001516131d2565b9050805f036123e5576123df8460c0015184611dca565b50612545565b604080518082019091525f9080600281526020016040518061010001604052808b81526020018a6001600160a01b03168152602001896001600160a01b0316815260200188604001516001600160a01b03168152602001858152602001886060015181526020018860a0015181526020018860e001516001600160a01b03168152506040516020016124779190613f17565b60405160208183030381529060405281525090505f6125056040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a61010001516001600160a01b031681526020018a61012001518152508152602001886080015181526020015f6001600160401b03811115610e8d57610e8d613b93565b9050807f42eff9005856e3c586b096d67211a566dc926052119fd7cc08023c70937ecb308785604051612539929190613ff7565b60405180910390a25050505b600190555050505050565b5f805160206148ce833981519152836125b75760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a207a65726f2072656d6f746520626c6f636b636861696044820152631b88125160e21b60648201526084016101b0565b8054840361261f5760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e486f6d653a2063616e6e6f742072656769737465722072656d6f7460448201526e329037b71039b0b6b29031b430b4b760891b60648201526084016101b0565b6001600160a01b03831661268e5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e486f6d653a207a65726f2072656d6f746520746f6b656e2074726160448201526f6e73666572726572206164647265737360801b60648201526084016101b0565b5f84815260028201602090815260408083206001600160a01b038716845290915290205460ff161561270e5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f746520616c726561647920726567697374604482015263195c995960e21b60648201526084016101b0565b6012826040015160ff1611156127785760405162461bcd60e51b815260206004820152602960248201527f546f6b656e486f6d653a2072656d6f746520746f6b656e20646563696d616c73604482015268040e8dede40d0d2ced60bb1b60648201526084016101b0565b6001810154602083015160ff908116600160a01b90920416146127ec5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420686f6d6520746f6b656e20646560448201526563696d616c7360d01b60648201526084016101b0565b5f8061280d8360010160149054906101000a900460ff168560400151613343565b915091505f6128208383875f01516131c5565b905081801561283a57508451612837908490614737565b15155b1561284d5761284a600182614628565b90505b6040518060800160405280600115158152602001828152602001848152602001831515815250846002015f8981526020019081526020015f205f886001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff02191690831515021790555060208201518160010155604082015181600201556060820151816003015f6101000a81548160ff021916908315150217905550905050856001600160a01b0316877ff229b02a51a4c8d5ef03a096ae0dd727d7b48b710d21b50ebebb560eef739b9083886040015160405161294692919091825260ff16602082015260400190565b60405180910390a350505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa15801561299d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129c19190613e15565b90506129d86001600160a01b03861685308661338b565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612a1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a409190613e15565b9050818111612aa65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016101b0565b611fad82826141c3565b5f612abe84848460016133f2565b949350505050565b5f8051602061494e83398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612b20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b44919061474a565b9050612b508282610b1e565b156105885760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b60648201526084016101b0565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612c03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c279190613e15565b9050610ad68484612c388585614628565b613419565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612c83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ca79190613e15565b9050836001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004015f604051808303818588803b158015612ce2575f80fd5b505af1158015612cf4573d5f803e3d5ffd5b50506040516370a0823160e01b81523060048201525f93506001600160a01b03881692506370a082319150602401602060405180830381865afa158015612d3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d619190613e15565b9050818111612dcf5760405162461bcd60e51b815260206004820152603460248201527f53616665577261707065644e6174697665546f6b656e4465706f7369743a2062604482015273185b185b98d9481b9bdd081a5b98dc99585cd95960621b60648201526084016101b0565b612dd982826141c3565b95945050505050565b80471015612e055760405163cd78605960e01b81523060048201526024016101b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612e4e576040519150601f19603f3d011682016040523d82523d5f602084013e612e53565b606091505b5050905080611e8357604051630a12f52160e11b815260040160405180910390fd5b612e7d611e88565b612e8783826134a8565b611e83826134ca565b612e98611e88565b6107c46134db565b612ea8611e88565b6001600160a01b038216612efe5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e206164647265737300000060448201526064016101b0565b60128160ff161115612f5d5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b60648201526084016101b0565b5f5f805160206148ce83398151915290506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fd59190613e15565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b83515f906130275760405162461bcd60e51b81526004016101b09061417a565b6020850151156130855760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f7465206e6f7420636f6c6c61746572616c6044820152631a5e995960e21b60648201526084016101b0565b6130908484846134ef565b5f6130a486604001518760600151856131c5565b90505f8111612dd95760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e486f6d653a207a65726f20746f6b656e20616d6f756e740000000060448201526064016101b0565b5f845a10156131465760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e7420676173000000000060448201526064016101b0565b834710156131965760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c756500000060448201526064016101b0565b826001600160a01b03163b5f036131ae57505f612abe565b5f805f84516020860188888bf19695505050505050565b5f612abe8484845f6133f2565b5f8481525f8051602061490e833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff9081161580158352600184015495830195909552600283015493820193909352600390910154909116151560608201525f805160206148ce833981519152918061325857505f8160200151115b15613267575f92505050612abe565b8385116132cb5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e486f6d653a20696e73756666696369656e7420616d6f756e74207460448201526b6f20636f766572206665657360a01b60648201526084016101b0565b6132d584866141c3565b94505f6132eb8260400151836060015188612ab0565b9050805f036132ff575f9350505050612abe565b5f88815260038401602090815260408083206001600160a01b038b16845290915281208054839290613332908490614628565b909155509098975050505050505050565b5f8060ff8085169084161181816133665761335e8587614765565b60ff16613374565b6133708686614765565b60ff165b61337f90600a61485e565b96919550909350505050565b6040516001600160a01b038481166024830152838116604483015260648201839052610ad69186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506135dc565b5f8115158415150361340f576134088584614869565b9050612abe565b612dd98584614880565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261346a848261363d565b610ad6576040516001600160a01b0384811660248301525f604483015261349e91869182169063095ea7b3906064016133c0565b610ad684826135dc565b6134b0611e88565b6134b86136da565b6134c06136ea565b61080982826136f2565b6134d2611e88565b61078781613876565b5f5f8051602061492e83398151915261182f565b5f8381527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03861684529091529020545f805160206148ce83398151915290828110156135a65760405162461bcd60e51b815260206004820152602e60248201527f546f6b656e486f6d653a20696e73756666696369656e7420746f6b656e20747260448201526d616e736665722062616c616e636560901b60648201526084016101b0565b6135b083826141c3565b5f9586526003909201602090815260408087206001600160a01b03909616875294905250919092205550565b5f6135f06001600160a01b0384168361387e565b905080515f141580156136145750808060200190518101906136129190614893565b155b15611e8357604051635274afe760e01b81526001600160a01b03841660048201526024016101b0565b5f805f846001600160a01b03168460405161365891906148b2565b5f604051808303815f865af19150503d805f8114613691576040519150601f19603f3d011682016040523d82523d5f602084013e613696565b606091505b50915091508180156136c05750805115806136c05750808060200190518101906136c09190614893565b8015612dd95750505050506001600160a01b03163b151590565b6136e2611e88565b6107c461388b565b6107c4611e88565b6136fa611e88565b6001600160a01b0382166137765760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016101b0565b5f5f8051602061494e83398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137ec9190613e15565b116138545760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b60648201526084016101b0565b81546001600160a01b0319166001600160a01b038216178255610ad683610b3f565b610ae4611e88565b60606107f783835f613893565b61180c611e88565b6060814710156138b85760405163cd78605960e01b81523060048201526024016101b0565b5f80856001600160a01b031684866040516138d391906148b2565b5f6040518083038185875af1925050503d805f811461390d576040519150601f19603f3d011682016040523d82523d5f602084013e613912565b606091505b5091509150611fad8683836060826139325761392d82613979565b6107f7565b815115801561394957506001600160a01b0384163b155b1561397257604051639996b31560e01b81526001600160a01b03851660048201526024016101b0565b50806107f7565b8051156139895780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b0381168114610787575f80fd5b80356139c1816139a2565b919050565b5f80604083850312156139d7575f80fd5b8235915060208301356139e9816139a2565b809150509250929050565b5f60208284031215613a04575f80fd5b81356107f7816139a2565b5f60208284031215613a1f575f80fd5b5035919050565b5f60208284031215613a36575f80fd5b81356001600160401b03811115613a4b575f80fd5b820161016081850312156107f7575f80fd5b5f6101008284031215613a6e575f80fd5b50919050565b5f805f8060808587031215613a87575f80fd5b8435613a92816139a2565b93506020850135613aa2816139a2565b9250604085013591506060850135613ab9816139a2565b939692955090935050565b5f805f8060608587031215613ad7575f80fd5b843593506020850135613ae9816139a2565b925060408501356001600160401b0380821115613b04575f80fd5b818701915087601f830112613b17575f80fd5b813581811115613b25575f80fd5b886020828501011115613b36575f80fd5b95989497505060200194505050565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b60405161016081016001600160401b0381118282101715613bca57613bca613b93565b60405290565b60405161010081016001600160401b0381118282101715613bca57613bca613b93565b604080519081016001600160401b0381118282101715613bca57613bca613b93565b604051601f8201601f191681016001600160401b0381118282101715613c3d57613c3d613b93565b604052919050565b5f6001600160401b03821115613c5d57613c5d613b93565b50601f01601f191660200190565b5f82601f830112613c7a575f80fd5b8135613c8d613c8882613c45565b613c15565b818152846020838601011115613ca1575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6101608236031215613cce575f80fd5b613cd6613ba7565b82358152613ce6602084016139b6565b6020820152613cf7604084016139b6565b604082015260608301356001600160401b03811115613d14575f80fd5b613d2036828601613c6b565b6060830152506080830135608082015260a083013560a0820152613d4660c084016139b6565b60c0820152613d5760e084016139b6565b60e0820152610100613d6a8185016139b6565b90820152610120838101359082015261014092830135928101929092525090565b5f6101008284031215613d9c575f80fd5b613da4613bd0565b823581526020830135613db6816139a2565b60208201526040830135613dc9816139a2565b6040820152613dda606084016139b6565b60608201526080830135608082015260a083013560a082015260c083013560c0820152613e0960e084016139b6565b60e08201529392505050565b5f60208284031215613e25575f80fd5b5051919050565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b60208082526026908201527f546f6b656e486f6d653a206e6f6e2d7a65726f206d756c74692d686f702066616040820152656c6c6261636b60d01b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015613ee4578181015183820152602001613ecc565b50505f910152565b5f8151808452613f03816020860160208601613eca565b601f01601f19169290920160200192915050565b60208152815160208201525f602083015160018060a01b03808216604085015280604086015116606085015250506060830151613f5f60808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c0850152613f86610120850183613eec565b915060c085015160e085015260e0850151613fab828601826001600160a01b03169052565b5090949350505050565b602081525f825160058110613fd857634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612abe6060840182613eec565b60408152825160408201525f602084015161401d60608401826001600160a01b03169052565b5060408401516001600160a01b03166080830152606084015161016060a0840181905261404e6101a0850183613eec565b9150608086015160c085015260a086015160e085015260c0860151610100614080818701836001600160a01b03169052565b60e0880151915061012061409e818801846001600160a01b03169052565b908801519150610140906140bc878301846001600160a01b03169052565b880151928601929092525090940151610180830152506020015290565b81516001600160a01b031681526020808301519082015260408101610588565b5f6101208201905083518252602084015160018060a01b03808216602085015280604087015116604085015280606087015116606085015250506080840151608083015260a084015160a083015260c084015160c083015260e084015161416b60e08401826001600160a01b03169052565b50826101008301529392505050565b6020808252818101527f546f6b656e486f6d653a2072656d6f7465206e6f742072656769737465726564604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610588576105886141af565b5f82601f8301126141e5575f80fd5b81516141f3613c8882613c45565b818152846020838601011115614207575f80fd5b612abe826020830160208701613eca565b5f60208284031215614228575f80fd5b81516001600160401b038082111561423e575f80fd5b9083019060408286031215614251575f80fd5b614259613bf3565b825160058110614267575f80fd5b815260208301518281111561427a575f80fd5b614286878286016141d6565b60208301525095945050505050565b80516139c1816139a2565b5f604082840312156142b0575f80fd5b6142b8613bf3565b82516142c3816139a2565b81526020928301519281019290925250919050565b5f602082840312156142e8575f80fd5b81516001600160401b03808211156142fe575f80fd5b908301906101008286031215614312575f80fd5b61431a613bd0565b8251815261432a60208401614295565b602082015261433b60408401614295565b604082015261434c60608401614295565b60608201526080830151608082015260a08301518281111561436c575f80fd5b614378878286016141d6565b60a08301525060c083015160c082015261439460e08401614295565b60e082015295945050505050565b5f60e082840312156143b2575f80fd5b60405160e081018181106001600160401b03821117156143d4576143d4613b93565b6040528251815260208301516143e9816139a2565b602082015260408301516143fc816139a2565b80604083015250606083015160608201526080830151608082015260a083015160a082015260c083015161442f816139a2565b60c08201529392505050565b5f6020828403121561444b575f80fd5b81516001600160401b0380821115614461575f80fd5b908301906101608286031215614475575f80fd5b61447d613ba7565b61448683614295565b81526020830151602082015261449e60408401614295565b60408201526144af60608401614295565b60608201526080830151608082015260a0830151828111156144cf575f80fd5b6144db878286016141d6565b60a08301525060c083015160c08201526144f760e08401614295565b60e082015261010083810151908201526101209150614517828401614295565b9181019190915261014091820151918101919091529392505050565b805160ff811681146139c1575f80fd5b5f60608284031215614553575f80fd5b604051606081018181106001600160401b038211171561457557614575613b93565b6040528251815261458860208401614533565b602082015261459960408401614533565b60408201529392505050565b60208082526022908201527f546f6b656e486f6d653a207a65726f20726571756972656420676173206c696d6040820152611a5d60f21b606082015260800190565b60208082526021908201527f546f6b656e486f6d653a206e6f6e2d7a65726f207365636f6e646172792066656040820152606560f81b606082015260800190565b80820180821115610588576105886141af565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b808410156146c8578451831682529385019360019390930192908501906146a6565b5060a0880151878203601f190160e089015294506146e68186613eec565b98975050505050505050565b8481526001600160a01b038481166020830152831660408201526080606082018190525f90611fad90830184613eec565b634e487b7160e01b5f52601260045260245ffd5b5f8261474557614745614723565b500690565b5f6020828403121561475a575f80fd5b81516107f7816139a2565b60ff8281168282160390811115610588576105886141af565b600181815b808511156147b857815f190482111561479e5761479e6141af565b808516156147ab57918102915b93841c9390800290614783565b509250929050565b5f826147ce57506001610588565b816147da57505f610588565b81600181146147f057600281146147fa57614816565b6001915050610588565b60ff84111561480b5761480b6141af565b50506001821b610588565b5060208310610133831016604e8410600b8410161715614839575081810a610588565b614843838361477e565b805f1904821115614856576148566141af565b029392505050565b5f6107f783836147c0565b8082028115828204841417610588576105886141af565b5f8261488e5761488e614723565b500490565b5f602082840312156148a3575f80fd5b815180151581146107f7575f80fd5b5f82516148c3818460208701613eca565b919091019291505056fe9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e6003b5030f10c94fcbdaa3022348ff0b82dbd4c0c71339e41ff59d0bdc92179d6009316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e602d2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a264697066735822122077a7ef20648a5cbde6027308f8136c2d1e4d1bb46b864ee20033d5729ce7184964736f6c63430008190033", + Bin: "0x608060405234801561000f575f80fd5b50604051614af0380380614af083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6149a38061014d5f395ff3fe60806040526004361061011e575f3560e01c80638da5cb5b1161009d578063c8511ada11610062578063c8511ada146103d5578063c868efaa146104b5578063d2cc7a70146104d4578063efb5b95e14610507578063f2fde38b14610527575f80fd5b80638da5cb5b14610318578063909a6ac0146103545780639731429714610374578063b0b78b26146103a3578063be203094146103b6575f80fd5b80635eb99514116100e35780635eb995141461029f57806362e3901b146102be5780636e6eef8d146102de578063715018a6146102f15780638bf2fa9414610305575f80fd5b806310fe9ae8146101bf578063154d625a146102145780632b0d8f18146102415780634213cf78146102605780634511243e14610280575f80fd5b366101bb577f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e601546001600160a01b031633146101b95760405162461bcd60e51b815260206004820152602f60248201527f4e6174697665546f6b656e486f6d653a20696e76616c6964207265636569766560448201526e103830bcb0b136329039b2b73232b960891b60648201526084015b60405180910390fd5b005b5f80fd5b3480156101ca575f80fd5b507f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e601546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021f575f80fd5b5061023361022e3660046139c6565b610546565b60405190815260200161020b565b34801561024c575f80fd5b506101b961025b3660046139f4565b61058e565b34801561026b575f80fd5b505f805160206148ce83398151915254610233565b34801561028b575f80fd5b506101b961029a3660046139f4565b610687565b3480156102aa575f80fd5b506101b96102b9366004613a0f565b610776565b3480156102c9575f80fd5b506102335f805160206148ce83398151915281565b6101b96102ec366004613a26565b61078a565b3480156102fc575f80fd5b506101b96107b3565b6101b9610313366004613a5d565b6107c6565b348015610323575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101f7565b34801561035f575f80fd5b506102335f8051602061494e83398151915281565b34801561037f575f80fd5b5061039361038e3660046139f4565b6107de565b604051901515815260200161020b565b6101b96103b13660046139c6565b6107fe565b3480156103c1575f80fd5b506101b96103d0366004613a74565b61080d565b3480156103e0575f80fd5b5061047e6103ef3660046139c6565b60408051608080820183525f808352602080840182905283850182905260609384018290529581525f8051602061490e83398151915286528381206001600160a01b039590951681529385529282902082519384018352805460ff9081161515855260018201549585019590955260028101549284019290925260039091015490921615159181019190915290565b60405161020b9190815115158152602080830151908201526040808301519082015260609182015115159181019190915260800190565b3480156104c0575f80fd5b506101b96104cf366004613ac4565b61091f565b3480156104df575f80fd5b507fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0254610233565b348015610512575f80fd5b506102335f805160206148ee83398151915281565b348015610532575f80fd5b506101b96105413660046139f4565b610adc565b5f8281527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03851684529091529020545b92915050565b5f8051602061494e8339815191526105a4610b16565b6001600160a01b0382166105ca5760405162461bcd60e51b81526004016101b090613b45565b6105d48183610b1e565b156106375760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b60648201526084016101b0565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b5f8051602061494e83398151915261069d610b16565b6001600160a01b0382166106c35760405162461bcd60e51b81526004016101b090613b45565b6106cd8183610b1e565b61072b5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b60648201526084016101b0565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b61077e610b16565b61078781610b3f565b50565b6107876107a25f805160206148ce8339815191525490565b30336107ad85613cbd565b34610cd7565b6107bb610f3a565b6107c45f610f95565b565b6107876107d836839003830183613d8b565b34611005565b5f5f8051602061494e8339815191526107f78184610b1e565b9392505050565b6108098282346111bf565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108515750825b90505f826001600160401b0316600114801561086c5750303b155b90508115801561087a575080155b156108985760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108c257845460ff60401b1916600160401b1785555b6108ce898989896113af565b831561091457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6109276113ce565b5f5f8051602061494e83398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610992573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b69190613e15565b1015610a1d5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b60648201526084016101b0565b610a278133610b1e565b15610a8d5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b60648201526084016101b0565b610acd858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061141892505050565b50610ad661180c565b50505050565b610ae4610f3a565b6001600160a01b038116610b0d57604051631e4fbdf760e01b81525f60048201526024016101b0565b61078781610f95565b6107c4610f3a565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b5f8051602061494e83398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015610b93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb79190613e15565b600283015490915081841115610c295760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016101b0565b808411610c9e5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016101b0565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b5f8051602061492e8339815191528054600114610d065760405162461bcd60e51b81526004016101b090613e2c565b60028155610d1383611836565b60c08301516001600160a01b031615610d3e5760405162461bcd60e51b81526004016101b090613e70565b5f80610d5e855f0151866020015186886101000151896101200151611a1b565b915091505f604051806040016040528060026004811115610d8157610d81613eb6565b81526020016040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b0316815260200189604001516001600160a01b03168152602001868152602001896060015181526020018960a0015181526020018960e001516001600160a01b0316815250604051602001610e049190613f17565b60405160208183030381529060405281525090505f610ee46040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b61010001516001600160a01b03168152602001878152508152602001896080015181526020015f6001600160401b03811115610e8d57610e8d613b93565b604051908082528060200260200182016040528015610eb6578160200160208202803683370190505b50815260200184604051602001610ecd9190613fb5565b604051602081830303815290604052815250611be0565b9050876001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168987604051610f22929190613ff7565b60405180910390a35050600190925550505050505050565b33610f6c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107c45760405163118cdaa760e01b81523360048201526024016101b0565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8051602061492e83398151915280546001146110345760405162461bcd60e51b81526004016101b090613e2c565b6002815561104183611cfb565b60e08301516001600160a01b03161561106c5760405162461bcd60e51b81526004016101b090613e70565b5f8061108a855f015186602001518688606001518960800151611a1b565b915091505f6040518060400160405280600160048111156110ad576110ad613eb6565b8152602001604051806040016040528089604001516001600160a01b03168152602001868152506040516020016110e491906140d9565b60405160208183030381529060405281525090505f61116c6040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b606001516001600160a01b031681526020018781525081526020018960c0015181526020015f6001600160401b03811115610e8d57610e8d613b93565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb5289876040516111aa9291906140f9565b60405180910390a35050600190925550505050565b5f8051602061492e83398151915280546001146111ee5760405162461bcd60e51b81526004016101b090613e2c565b60028082555f8581525f8051602061490e833981519152602090815260408083206001600160a01b03881684528252918290208251608081018452815460ff9081161515808352600184015494830194909452948201549381019390935260030154909216151560608201525f805160206148ce833981519152916112855760405162461bcd60e51b81526004016101b09061417a565b5f8160200151116112e25760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20636f6c6c61746572616c206e656564656044820152601960fa1b60648201526084016101b0565b6112eb84611da4565b93505f808260200151861061131a5760208301515f925061130c90876141c3565b90508260200151955061132d565b85836020015161132a91906141c3565b91505b5f88815260028501602090815260408083206001600160a01b038b168085529083529281902060010185905580518981529182018590528a917f6769a5f9bfc8b6e0db839ab981cbf9239274ae72d2d035081a9157d43bd33cb6910160405180910390a380156113a1576113a13382611dca565b505060019092555050505050565b6113b7611e88565b6113c5848484846012611ed1565b610ad681611ef6565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161141257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f5f805160206148ce83398151915290505f8280602001905181019061143e9190614218565b905060018151600481111561145557611455613eb6565b0361149d575f816020015180602001905181019061147391906142a0565b90505f61148587878460200151611f2c565b9050611494825f015182611dca565b50505050505050565b6002815160048111156114b2576114b2613eb6565b036115cb575f81602001518060200190518101906114d091906142d8565b90505f6114e287878460800151611f2c565b825190915087146115485760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a206d69736d61746368656420736f7572636520626c6f60448201526918dad8da185a5b88125160b21b60648201526084016101b0565b856001600160a01b031682602001516001600160a01b0316146115c15760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e486f6d653a206d69736d617463686564206f726967696e2073656e60448201526a646572206164647265737360a81b60648201526084016101b0565b6114948282611fb7565b6003815160048111156115e0576115e0613eb6565b036116b4575f81602001518060200190518101906115fe91906143a2565b90505f8061161688888560600151866080015161213d565b915091506116aa604051806101000160405280855f0151815260200185602001516001600160a01b0316815260200185604001516001600160a01b03168152602001876001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018381526020015f81526020018560a0015181526020018560c001516001600160a01b0316815250836121e8565b5050505050505050565b6004815160048111156116c9576116c9613eb6565b036117c4575f81602001518060200190518101906116e7919061443b565b90505f806117008888856080015186610140015161213d565b915091506116aa8888855f01516040518061016001604052808860200151815260200188604001516001600160a01b0316815260200188606001516001600160a01b031681526020018860a00151815260200188610100015181526020018860c0015181526020018861012001516001600160a01b031681526020018860e001516001600160a01b031681526020018a6001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018681526020015f81525086612373565b5f815160048111156117d8576117d8613eb6565b03611805575f81602001518060200190518101906117f69190614543565b9050611803868683612550565b505b5050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b60408101516001600160a01b03166118a35760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420636f6e7472616044820152696374206164647265737360b01b60648201526084016101b0565b5f8160800151116118c65760405162461bcd60e51b81526004016101b0906145a5565b5f8160a00151116119255760405162461bcd60e51b815260206004820152602360248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420676173206c696044820152621b5a5d60ea1b60648201526084016101b0565b80608001518160a001511061198b5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420726563697069656e7420676173604482015265081b1a5b5a5d60d21b60648201526084016101b0565b60e08101516001600160a01b03166119f85760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f2066616c6c6261636b20726563697069656044820152696e74206164647265737360b01b60648201526084016101b0565b610140810151156107875760405162461bcd60e51b81526004016101b0906145e7565b5f8581525f8051602061490e833981519152602090815260408083206001600160a01b038816845282528083208151608081018352815460ff90811615158083526001840154958301959095526002830154938201939093526003909101549091161515606082015282915f805160206148ce8339815191529190611ab25760405162461bcd60e51b81526004016101b09061417a565b602081015115611b145760405162461bcd60e51b815260206004820152602760248201527f546f6b656e486f6d653a20636f6c6c61746572616c206e656564656420666f726044820152662072656d6f746560c81b60648201526084016101b0565b611b1d87611da4565b96508415611b3357611b30863387612957565b94505b5f611b47826040015183606001518a612ab0565b90505f8111611b985760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f207363616c656420616d6f756e7400000060448201526064016101b0565b5f8a815260038401602090815260408083206001600160a01b038d16845290915281208054839290611bcb908490614628565b90915550909a95995094975050505050505050565b5f80611bea612ac6565b60408401516020015190915015611c8f576040830151516001600160a01b0316611c6c5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b60648201526084016101b0565b604083015160208101519051611c8f916001600160a01b03909116908390612bb6565b604051630624488560e41b81526001600160a01b03821690636244885090611cbb90869060040161463b565b6020604051808303815f875af1158015611cd7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f79190613e15565b60408101516001600160a01b0316611d5f5760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20726563697069656e74206164647265736044820152607360f81b60648201526084016101b0565b5f8160c0015111611d825760405162461bcd60e51b81526004016101b0906145a5565b60a0810151156107875760405162461bcd60e51b81526004016101b0906145e7565b5f805160206148ee83398151915280545f91906107f7906001600160a01b031684612c3d565b6040518181525f805160206148ee833981519152906001600160a01b038416907f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b9060200160405180910390a28054604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015611e59575f80fd5b505af1158015611e6b573d5f803e3d5ffd5b50611e83925050506001600160a01b03841683612de2565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107c457604051631afcd79f60e31b815260040160405180910390fd5b611ed9611e88565b611ee4858585612e75565b611eec612e90565b6118058282612ea0565b611efe611e88565b5f805160206148ee83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b5f8381525f8051602061490e833981519152602090815260408083206001600160a01b038616845282528083208151608081018352815460ff9081161515825260018301549482019490945260028201549281019290925260030154909116151560608201525f805160206148ce83398151915290611fad81878787613007565b9695505050505050565b5f5f805160206148ee8339815191528054604051632e1a7d4d60e01b8152600481018590529192506001600160a01b031690632e1a7d4d906024015f604051808303815f87803b158015612009575f80fd5b505af115801561201b573d5f803e3d5ffd5b50508451602086015160408088015160a089015191515f965061204495509091906024016146f2565b60408051601f198184030181529190526020810180516001600160e01b031663161b12ff60e11b17905260c085015160608601519192505f9161208a91908690856130f5565b905080156120de5784606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff4856040516120d191815260200190565b60405180910390a2611805565b84606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb08560405161211d91815260200190565b60405180910390a260e0850151611805906001600160a01b031685612de2565b5f8481525f8051602061490e833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff90811615158252600183015494820194909452600282015492810192909252600301549091161515606082015281905f805160206148ce83398151915290826121c1828a8a8a613007565b90505f6121d783604001518460600151896131c5565b919a91995090975050505050505050565b5f8051602061492e83398151915280546001146122175760405162461bcd60e51b81526004016101b090613e2c565b6002815561222483611cfb565b5f61223c845f015185602001518587608001516131d2565b9050805f03612259576122538460e0015184611dca565b5061236b565b604080518082019091525f908060018152602001604051806040016040528088604001516001600160a01b031681526020018581525060405160200161229f91906140d9565b60405160208183030381529060405281525090505f61232b6040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a606001516001600160a01b031681526020018a6080015181525081526020018860c0015181526020015f6001600160401b03811115610e8d57610e8d613b93565b9050807f825080857c76cef4a1629c0705a7f8b4ef0282ddcafde0b6715c4fb34b68aaf0878560405161235f9291906140f9565b60405180910390a25050505b600190555050565b5f8051602061492e83398151915280546001146123a25760405162461bcd60e51b81526004016101b090613e2c565b600281556123af83611836565b5f6123c8845f01518560200151858761012001516131d2565b9050805f036123e5576123df8460c0015184611dca565b50612545565b604080518082019091525f9080600281526020016040518061010001604052808b81526020018a6001600160a01b03168152602001896001600160a01b0316815260200188604001516001600160a01b03168152602001858152602001886060015181526020018860a0015181526020018860e001516001600160a01b03168152506040516020016124779190613f17565b60405160208183030381529060405281525090505f6125056040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a61010001516001600160a01b031681526020018a61012001518152508152602001886080015181526020015f6001600160401b03811115610e8d57610e8d613b93565b9050807f42eff9005856e3c586b096d67211a566dc926052119fd7cc08023c70937ecb308785604051612539929190613ff7565b60405180910390a25050505b600190555050505050565b5f805160206148ce833981519152836125b75760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a207a65726f2072656d6f746520626c6f636b636861696044820152631b88125160e21b60648201526084016101b0565b8054840361261f5760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e486f6d653a2063616e6e6f742072656769737465722072656d6f7460448201526e329037b71039b0b6b29031b430b4b760891b60648201526084016101b0565b6001600160a01b03831661268e5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e486f6d653a207a65726f2072656d6f746520746f6b656e2074726160448201526f6e73666572726572206164647265737360801b60648201526084016101b0565b5f84815260028201602090815260408083206001600160a01b038716845290915290205460ff161561270e5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f746520616c726561647920726567697374604482015263195c995960e21b60648201526084016101b0565b6012826040015160ff1611156127785760405162461bcd60e51b815260206004820152602960248201527f546f6b656e486f6d653a2072656d6f746520746f6b656e20646563696d616c73604482015268040e8dede40d0d2ced60bb1b60648201526084016101b0565b6001810154602083015160ff908116600160a01b90920416146127ec5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420686f6d6520746f6b656e20646560448201526563696d616c7360d01b60648201526084016101b0565b5f8061280d8360010160149054906101000a900460ff168560400151613343565b915091505f6128208383875f01516131c5565b905081801561283a57508451612837908490614737565b15155b1561284d5761284a600182614628565b90505b6040518060800160405280600115158152602001828152602001848152602001831515815250846002015f8981526020019081526020015f205f886001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff02191690831515021790555060208201518160010155604082015181600201556060820151816003015f6101000a81548160ff021916908315150217905550905050856001600160a01b0316877ff229b02a51a4c8d5ef03a096ae0dd727d7b48b710d21b50ebebb560eef739b9083886040015160405161294692919091825260ff16602082015260400190565b60405180910390a350505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa15801561299d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129c19190613e15565b90506129d86001600160a01b03861685308661338b565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612a1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a409190613e15565b9050818111612aa65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016101b0565b611fad82826141c3565b5f612abe84848460016133f2565b949350505050565b5f8051602061494e83398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612b20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b44919061474a565b9050612b508282610b1e565b156105885760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b60648201526084016101b0565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612c03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c279190613e15565b9050610ad68484612c388585614628565b613419565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612c83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ca79190613e15565b9050836001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004015f604051808303818588803b158015612ce2575f80fd5b505af1158015612cf4573d5f803e3d5ffd5b50506040516370a0823160e01b81523060048201525f93506001600160a01b03881692506370a082319150602401602060405180830381865afa158015612d3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d619190613e15565b9050818111612dcf5760405162461bcd60e51b815260206004820152603460248201527f53616665577261707065644e6174697665546f6b656e4465706f7369743a2062604482015273185b185b98d9481b9bdd081a5b98dc99585cd95960621b60648201526084016101b0565b612dd982826141c3565b95945050505050565b80471015612e055760405163cd78605960e01b81523060048201526024016101b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612e4e576040519150601f19603f3d011682016040523d82523d5f602084013e612e53565b606091505b5050905080611e8357604051630a12f52160e11b815260040160405180910390fd5b612e7d611e88565b612e8783826134a8565b611e83826134ca565b612e98611e88565b6107c46134db565b612ea8611e88565b6001600160a01b038216612efe5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e206164647265737300000060448201526064016101b0565b60128160ff161115612f5d5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b60648201526084016101b0565b5f5f805160206148ce83398151915290506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fd59190613e15565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b83515f906130275760405162461bcd60e51b81526004016101b09061417a565b6020850151156130855760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f7465206e6f7420636f6c6c61746572616c6044820152631a5e995960e21b60648201526084016101b0565b6130908484846134ef565b5f6130a486604001518760600151856131c5565b90505f8111612dd95760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e486f6d653a207a65726f20746f6b656e20616d6f756e740000000060448201526064016101b0565b5f845a10156131465760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e7420676173000000000060448201526064016101b0565b834710156131965760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c756500000060448201526064016101b0565b826001600160a01b03163b5f036131ae57505f612abe565b5f805f84516020860188888bf19695505050505050565b5f612abe8484845f6133f2565b5f8481525f8051602061490e833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff9081161580158352600184015495830195909552600283015493820193909352600390910154909116151560608201525f805160206148ce833981519152918061325857505f8160200151115b15613267575f92505050612abe565b8385116132cb5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e486f6d653a20696e73756666696369656e7420616d6f756e74207460448201526b6f20636f766572206665657360a01b60648201526084016101b0565b6132d584866141c3565b94505f6132eb8260400151836060015188612ab0565b9050805f036132ff575f9350505050612abe565b5f88815260038401602090815260408083206001600160a01b038b16845290915281208054839290613332908490614628565b909155509098975050505050505050565b5f8060ff8085169084161181816133665761335e8587614765565b60ff16613374565b6133708686614765565b60ff165b61337f90600a61485e565b96919550909350505050565b6040516001600160a01b038481166024830152838116604483015260648201839052610ad69186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506135dc565b5f8115158415150361340f576134088584614869565b9050612abe565b612dd98584614880565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261346a848261363d565b610ad6576040516001600160a01b0384811660248301525f604483015261349e91869182169063095ea7b3906064016133c0565b610ad684826135dc565b6134b0611e88565b6134b86136da565b6134c06136ea565b61080982826136f2565b6134d2611e88565b61078781613876565b5f5f8051602061492e83398151915261182f565b5f8381527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03861684529091529020545f805160206148ce83398151915290828110156135a65760405162461bcd60e51b815260206004820152602e60248201527f546f6b656e486f6d653a20696e73756666696369656e7420746f6b656e20747260448201526d616e736665722062616c616e636560901b60648201526084016101b0565b6135b083826141c3565b5f9586526003909201602090815260408087206001600160a01b03909616875294905250919092205550565b5f6135f06001600160a01b0384168361387e565b905080515f141580156136145750808060200190518101906136129190614893565b155b15611e8357604051635274afe760e01b81526001600160a01b03841660048201526024016101b0565b5f805f846001600160a01b03168460405161365891906148b2565b5f604051808303815f865af19150503d805f8114613691576040519150601f19603f3d011682016040523d82523d5f602084013e613696565b606091505b50915091508180156136c05750805115806136c05750808060200190518101906136c09190614893565b8015612dd95750505050506001600160a01b03163b151590565b6136e2611e88565b6107c461388b565b6107c4611e88565b6136fa611e88565b6001600160a01b0382166137765760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016101b0565b5f5f8051602061494e83398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137ec9190613e15565b116138545760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b60648201526084016101b0565b81546001600160a01b0319166001600160a01b038216178255610ad683610b3f565b610ae4611e88565b60606107f783835f613893565b61180c611e88565b6060814710156138b85760405163cd78605960e01b81523060048201526024016101b0565b5f80856001600160a01b031684866040516138d391906148b2565b5f6040518083038185875af1925050503d805f811461390d576040519150601f19603f3d011682016040523d82523d5f602084013e613912565b606091505b5091509150611fad8683836060826139325761392d82613979565b6107f7565b815115801561394957506001600160a01b0384163b155b1561397257604051639996b31560e01b81526001600160a01b03851660048201526024016101b0565b50806107f7565b8051156139895780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b0381168114610787575f80fd5b80356139c1816139a2565b919050565b5f80604083850312156139d7575f80fd5b8235915060208301356139e9816139a2565b809150509250929050565b5f60208284031215613a04575f80fd5b81356107f7816139a2565b5f60208284031215613a1f575f80fd5b5035919050565b5f60208284031215613a36575f80fd5b81356001600160401b03811115613a4b575f80fd5b820161016081850312156107f7575f80fd5b5f6101008284031215613a6e575f80fd5b50919050565b5f805f8060808587031215613a87575f80fd5b8435613a92816139a2565b93506020850135613aa2816139a2565b9250604085013591506060850135613ab9816139a2565b939692955090935050565b5f805f8060608587031215613ad7575f80fd5b843593506020850135613ae9816139a2565b925060408501356001600160401b0380821115613b04575f80fd5b818701915087601f830112613b17575f80fd5b813581811115613b25575f80fd5b886020828501011115613b36575f80fd5b95989497505060200194505050565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b60405161016081016001600160401b0381118282101715613bca57613bca613b93565b60405290565b60405161010081016001600160401b0381118282101715613bca57613bca613b93565b604080519081016001600160401b0381118282101715613bca57613bca613b93565b604051601f8201601f191681016001600160401b0381118282101715613c3d57613c3d613b93565b604052919050565b5f6001600160401b03821115613c5d57613c5d613b93565b50601f01601f191660200190565b5f82601f830112613c7a575f80fd5b8135613c8d613c8882613c45565b613c15565b818152846020838601011115613ca1575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6101608236031215613cce575f80fd5b613cd6613ba7565b82358152613ce6602084016139b6565b6020820152613cf7604084016139b6565b604082015260608301356001600160401b03811115613d14575f80fd5b613d2036828601613c6b565b6060830152506080830135608082015260a083013560a0820152613d4660c084016139b6565b60c0820152613d5760e084016139b6565b60e0820152610100613d6a8185016139b6565b90820152610120838101359082015261014092830135928101929092525090565b5f6101008284031215613d9c575f80fd5b613da4613bd0565b823581526020830135613db6816139a2565b60208201526040830135613dc9816139a2565b6040820152613dda606084016139b6565b60608201526080830135608082015260a083013560a082015260c083013560c0820152613e0960e084016139b6565b60e08201529392505050565b5f60208284031215613e25575f80fd5b5051919050565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b60208082526026908201527f546f6b656e486f6d653a206e6f6e2d7a65726f206d756c74692d686f702066616040820152656c6c6261636b60d01b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015613ee4578181015183820152602001613ecc565b50505f910152565b5f8151808452613f03816020860160208601613eca565b601f01601f19169290920160200192915050565b60208152815160208201525f602083015160018060a01b03808216604085015280604086015116606085015250506060830151613f5f60808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c0850152613f86610120850183613eec565b915060c085015160e085015260e0850151613fab828601826001600160a01b03169052565b5090949350505050565b602081525f825160058110613fd857634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612abe6060840182613eec565b60408152825160408201525f602084015161401d60608401826001600160a01b03169052565b5060408401516001600160a01b03166080830152606084015161016060a0840181905261404e6101a0850183613eec565b9150608086015160c085015260a086015160e085015260c0860151610100614080818701836001600160a01b03169052565b60e0880151915061012061409e818801846001600160a01b03169052565b908801519150610140906140bc878301846001600160a01b03169052565b880151928601929092525090940151610180830152506020015290565b81516001600160a01b031681526020808301519082015260408101610588565b5f6101208201905083518252602084015160018060a01b03808216602085015280604087015116604085015280606087015116606085015250506080840151608083015260a084015160a083015260c084015160c083015260e084015161416b60e08401826001600160a01b03169052565b50826101008301529392505050565b6020808252818101527f546f6b656e486f6d653a2072656d6f7465206e6f742072656769737465726564604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610588576105886141af565b5f82601f8301126141e5575f80fd5b81516141f3613c8882613c45565b818152846020838601011115614207575f80fd5b612abe826020830160208701613eca565b5f60208284031215614228575f80fd5b81516001600160401b038082111561423e575f80fd5b9083019060408286031215614251575f80fd5b614259613bf3565b825160058110614267575f80fd5b815260208301518281111561427a575f80fd5b614286878286016141d6565b60208301525095945050505050565b80516139c1816139a2565b5f604082840312156142b0575f80fd5b6142b8613bf3565b82516142c3816139a2565b81526020928301519281019290925250919050565b5f602082840312156142e8575f80fd5b81516001600160401b03808211156142fe575f80fd5b908301906101008286031215614312575f80fd5b61431a613bd0565b8251815261432a60208401614295565b602082015261433b60408401614295565b604082015261434c60608401614295565b60608201526080830151608082015260a08301518281111561436c575f80fd5b614378878286016141d6565b60a08301525060c083015160c082015261439460e08401614295565b60e082015295945050505050565b5f60e082840312156143b2575f80fd5b60405160e081018181106001600160401b03821117156143d4576143d4613b93565b6040528251815260208301516143e9816139a2565b602082015260408301516143fc816139a2565b80604083015250606083015160608201526080830151608082015260a083015160a082015260c083015161442f816139a2565b60c08201529392505050565b5f6020828403121561444b575f80fd5b81516001600160401b0380821115614461575f80fd5b908301906101608286031215614475575f80fd5b61447d613ba7565b61448683614295565b81526020830151602082015261449e60408401614295565b60408201526144af60608401614295565b60608201526080830151608082015260a0830151828111156144cf575f80fd5b6144db878286016141d6565b60a08301525060c083015160c08201526144f760e08401614295565b60e082015261010083810151908201526101209150614517828401614295565b9181019190915261014091820151918101919091529392505050565b805160ff811681146139c1575f80fd5b5f60608284031215614553575f80fd5b604051606081018181106001600160401b038211171561457557614575613b93565b6040528251815261458860208401614533565b602082015261459960408401614533565b60408201529392505050565b60208082526022908201527f546f6b656e486f6d653a207a65726f20726571756972656420676173206c696d6040820152611a5d60f21b606082015260800190565b60208082526021908201527f546f6b656e486f6d653a206e6f6e2d7a65726f207365636f6e646172792066656040820152606560f81b606082015260800190565b80820180821115610588576105886141af565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b808410156146c8578451831682529385019360019390930192908501906146a6565b5060a0880151878203601f190160e089015294506146e68186613eec565b98975050505050505050565b8481526001600160a01b038481166020830152831660408201526080606082018190525f90611fad90830184613eec565b634e487b7160e01b5f52601260045260245ffd5b5f8261474557614745614723565b500690565b5f6020828403121561475a575f80fd5b81516107f7816139a2565b60ff8281168282160390811115610588576105886141af565b600181815b808511156147b857815f190482111561479e5761479e6141af565b808516156147ab57918102915b93841c9390800290614783565b509250929050565b5f826147ce57506001610588565b816147da57505f610588565b81600181146147f057600281146147fa57614816565b6001915050610588565b60ff84111561480b5761480b6141af565b50506001821b610588565b5060208310610133831016604e8410600b8410161715614839575081810a610588565b614843838361477e565b805f1904821115614856576148566141af565b029392505050565b5f6107f783836147c0565b8082028115828204841417610588576105886141af565b5f8261488e5761488e614723565b500490565b5f602082840312156148a3575f80fd5b815180151581146107f7575f80fd5b5f82516148c3818460208701613eca565b919091019291505056fe9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e6003b5030f10c94fcbdaa3022348ff0b82dbd4c0c71339e41ff59d0bdc92179d6009316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e602d2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a26469706673582212205d3c0aa1d7e06a15a3b3dce4d8592a9b6b5a7bda2fa4450b627072a52c4a55c664736f6c63430008190033", } // NativeTokenHomeUpgradeableABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/ictt/TokenRemote/ERC20TokenRemote/ERC20TokenRemote.go b/abi-bindings/go/ictt/TokenRemote/ERC20TokenRemote/ERC20TokenRemote.go index 0688722f2..159bc0931 100644 --- a/abi-bindings/go/ictt/TokenRemote/ERC20TokenRemote/ERC20TokenRemote.go +++ b/abi-bindings/go/ictt/TokenRemote/ERC20TokenRemote/ERC20TokenRemote.go @@ -75,7 +75,7 @@ type TokenRemoteSettings struct { // ERC20TokenRemoteMetaData contains all meta data concerning the ERC20TokenRemote contract. var ERC20TokenRemoteMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"teleporterRegistryAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"teleporterManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minTeleporterVersion\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"tokenHomeBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"tokenHomeAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenHomeDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structTokenRemoteSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldMinTeleporterVersion\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newMinTeleporterVersion\",\"type\":\"uint256\"}],\"name\":\"MinTeleporterVersionUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressUnpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensAndCallSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ERC20_TOKEN_REMOTE_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MULTI_HOP_CALL_GAS_PER_WORD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MULTI_HOP_CALL_REQUIRED_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MULTI_HOP_SEND_REQUIRED_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REGISTER_REMOTE_REQUIRED_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TELEPORTER_REGISTRY_APP_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_REMOTE_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"payloadSize\",\"type\":\"uint256\"}],\"name\":\"calculateNumWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getInitialReserveImbalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getIsCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinTeleporterVersion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMultiplyOnRemote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenHomeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenHomeBlockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenMultiplier\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"teleporterRegistryAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"teleporterManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minTeleporterVersion\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"tokenHomeBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"tokenHomeAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenHomeDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structTokenRemoteSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"isTeleporterAddressPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"pauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"originSenderAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"receiveTeleporterMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structTeleporterFeeInfo\",\"name\":\"feeInfo\",\"type\":\"tuple\"}],\"name\":\"registerWithHome\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"send\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sendAndCall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"unpauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"updateMinTeleporterVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161570338038061570383398101604081905261002e91610bf5565b61003a84848484610046565b50505050610f55565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f8115801561008f5750825b90505f826001600160401b031660011480156100aa5750303b155b9050811580156100b8575080155b156100d65760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561010457845460ff60401b1916680100000000000000001785555b61011089898989610161565b831561015657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6101696101b3565b6101738383610203565b61017e845f83610219565b7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf62622300805460ff191660ff83161790555b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff1661020157604051631afcd79f60e31b815260040160405180910390fd5b565b61020b6101b3565b6102158282610250565b5050565b6102216101b3565b8251602084015160408501516102389291906102b3565b6102406102ce565b61024b8383836102de565b505050565b6102586101b3565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036102a48482610d5a565b50600481016101ad8382610d5a565b6102bb6101b3565b6102c5838261062d565b61024b8261064f565b6102d66101b3565b610201610660565b6102e66101b3565b5f7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090507302000000000000000000000000000000000000056001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561035a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037e9190610e19565b815560608401516103e95760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b60648201526084015b60405180910390fd5b80546060850151036104635760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d65000000000060648201526084016103e0565b60808401516001600160a01b03166104c95760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b60648201526084016103e0565b60128460a0015160ff1611156105335760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b60648201526084016103e0565b60128260ff1611156105935760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b60648201526084016103e0565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b9186169190910217905561060f908361068a565b60048301805460ff1916911515919091179055600390910155505050565b6106356101b3565b61063d6106d2565b6106456106e2565b61021582826106ea565b6106576101b3565b6100438161086e565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75005b6001905550565b5f8060ff8085169084161181816106ad576106a58587610e44565b60ff166106bb565b6106b78686610e44565b60ff165b6106c690600a610f43565b96919550909350505050565b6106da6101b3565b6102016108a8565b6102016101b3565b6106f26101b3565b6001600160a01b03821661076e5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016103e0565b5f7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0090505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f79190610e19565b1161084c5760405162461bcd60e51b815260206004820152603260248201525f805160206156e3833981519152604482015271656c65706f7274657220726567697374727960701b60648201526084016103e0565b81546001600160a01b0319166001600160a01b0382161782556101ad836108d7565b6108766101b3565b6001600160a01b03811661089f57604051631e4fbdf760e01b81525f60048201526024016103e0565b61004381610a6f565b6108b06101b3565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00610683565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa15801561093e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109629190610e19565b6002830154909150818411156109c15760405162461bcd60e51b815260206004820152603160248201525f805160206156e383398151915260448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016103e0565b808411610a365760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016103e0565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b0381118282101715610b1557610b15610adf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610b4357610b43610adf565b604052919050565b80516001600160a01b0381168114610b61575f80fd5b919050565b805160ff81168114610b61575f80fd5b5f82601f830112610b85575f80fd5b81516001600160401b03811115610b9e57610b9e610adf565b6020610bb2601f8301601f19168201610b1b565b8281528582848701011115610bc5575f80fd5b5f5b83811015610be2578581018301518282018401528201610bc7565b505f928101909101919091529392505050565b5f805f80848603610120811215610c0a575f80fd5b60c0811215610c17575f80fd5b50610c20610af3565b610c2986610b4b565b8152610c3760208701610b4b565b60208201526040860151604082015260608601516060820152610c5c60808701610b4b565b6080820152610c6d60a08701610b66565b60a082015260c08601519094506001600160401b0380821115610c8e575f80fd5b610c9a88838901610b76565b945060e0870151915080821115610caf575f80fd5b50610cbc87828801610b76565b925050610ccc6101008601610b66565b905092959194509250565b600181811c90821680610ceb57607f821691505b602082108103610d0957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561024b57805f5260205f20601f840160051c81016020851015610d345750805b601f840160051c820191505b81811015610d53575f8155600101610d40565b5050505050565b81516001600160401b03811115610d7357610d73610adf565b610d8781610d818454610cd7565b84610d0f565b602080601f831160018114610dba575f8415610da35750858301515b5f19600386901b1c1916600185901b178555610e11565b5f85815260208120601f198616915b82811015610de857888601518255948401946001909101908401610dc9565b5085821015610e0557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215610e29575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b60ff8281168282160390811115610e5d57610e5d610e30565b92915050565b600181815b80851115610e9d57815f1904821115610e8357610e83610e30565b80851615610e9057918102915b93841c9390800290610e68565b509250929050565b5f82610eb357506001610e5d565b81610ebf57505f610e5d565b8160018114610ed55760028114610edf57610efb565b6001915050610e5d565b60ff841115610ef057610ef0610e30565b50506001821b610e5d565b5060208310610133831016604e8410600b8410161715610f1e575081810a610e5d565b610f288383610e63565b805f1904821115610f3b57610f3b610e30565b029392505050565b5f610f4e8383610ea5565b9392505050565b61478180610f625f395ff3fe608060405234801561000f575f80fd5b506004361061021e575f3560e01c806370a082311161012a578063b8a46d02116100b4578063dd62ed3e11610079578063dd62ed3e146104bd578063e0fd9cb8146104d0578063ef793e2a146104d8578063f2fde38b146104e0578063f3f981d8146104f3575f80fd5b8063b8a46d0214610474578063c3cd692714610487578063c868efaa1461048f578063c9fe4ddf146104a2578063d2cc7a70146104b5575f80fd5b80638da5cb5b116100fa5780638da5cb5b146103ee578063909a6ac01461043257806395d89b4114610446578063973142971461044e578063a9059cbb14610461575f80fd5b806370a08231146103a0578063715018a6146103d457806371717c18146103dc5780637ee3779a146103e6575f80fd5b8063313ce567116101ab5780635507f3d11161017b5780635507f3d1146103365780635d16225d146103405780635eb995141461035357806362431a6514610366578063656900381461038d575f80fd5b8063313ce567146102c057806335cac159146102f45780634213cf781461031b5780634511243e14610323575f80fd5b806315beb59f116101f157806315beb59f1461027d57806318160ddd1461028657806323b872dd1461028e578063254ac160146102a15780632b0d8f18146102ab575f80fd5b806302a30c7d1461022257806306fdde031461023f5780630733c8c814610254578063095ea7b31461026a575b5f80fd5b61022a610506565b60405190151581526020015b60405180910390f35b61024761051d565b60405161023691906136ec565b61025c6105dd565b604051908152602001610236565b61022a610278366004613722565b6105f1565b61025c6105dc81565b61025c61060a565b61022a61029c36600461374c565b610625565b61025c6201fbd081565b6102be6102b936600461378a565b61064a565b005b7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf626223005460405160ff9091168152602001610236565b61025c7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0081565b61025c61074c565b6102be61033136600461378a565b61075d565b61025c6205302081565b6102be61034e3660046137a5565b61084c565b6102be6103613660046137d4565b61085a565b61025c7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf6262230081565b6102be61039b3660046137eb565b61086e565b61025c6103ae36600461378a565b6001600160a01b03165f9081525f8051602061470c833981519152602052604090205490565b6102be610878565b61025c6205573081565b61022a61088b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610236565b61025c5f8051602061472c83398151915281565b6102476108a2565b61022a61045c36600461378a565b6108e0565b61022a61046f366004613722565b6108f9565b6102be610482366004613823565b610906565b61041a610acd565b6102be61049d366004613839565b610aea565b6102be6104b03660046139f3565b610ca7565b61025c610db9565b61025c6104cb366004613adc565b610dce565b61025c610e17565b61025c610e2b565b6102be6104ee36600461378a565b610e3f565b61025c6105013660046137d4565b610e79565b5f80610510610e8f565b6006015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f8051602061470c8339815191529161055b90613b13565b80601f016020809104026020016040519081016040528092919081815260200182805461058790613b13565b80156105d25780601f106105a9576101008083540402835291602001916105d2565b820191905f5260205f20905b8154815290600101906020018083116105b557829003601f168201915b505050505091505090565b5f806105e7610e8f565b6003015492915050565b5f336105fe818585610eb3565b60019150505b92915050565b5f805f8051602061470c8339815191525b6002015492915050565b5f33610632858285610ec5565b61063d858585610f22565b60019150505b9392505050565b5f8051602061472c833981519152610660610f7f565b6001600160a01b03821661068f5760405162461bcd60e51b815260040161068690613b45565b60405180910390fd5b6106998183610f87565b156106fc5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b6064820152608401610686565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b5f80610756610e8f565b5492915050565b5f8051602061472c833981519152610773610f7f565b6001600160a01b0382166107995760405162461bcd60e51b815260040161068690613b45565b6107a38183610f87565b6108015760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b6064820152608401610686565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b6108568282610fa8565b5050565b610862610f7f565b61086b81611030565b50565b61085682826111c8565b610880611250565b6108895f6112ab565b565b5f80610895610e8f565b6004015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f8051602061470c8339815191529161055b90613b13565b5f5f8051602061472c8339815191526106438184610f87565b5f336105fe818585610f22565b5f61090f610e8f565b6006810154909150610100900460ff161561096c5760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e52656d6f74653a20616c72656164792072656769737465726564006044820152606401610686565b604080516060808201835260058401548252600284015460ff600160a01b820481166020808601918252600160a81b9093048216858701908152865180880188525f808252885188518188015293518516848a01529151909316828601528651808303909501855260809091019095528082019290925291929091610a01906109f79087018761378a565b866020013561131b565b6040805160c0810182526001870154815260028701546001600160a01b031660208083019190915282518084018452939450610ac5939192830191908190610a4b908b018b61378a565b6001600160a01b0316815260209081018690529082526201fbd0908201526040015f5b604051908082528060200260200182016040528015610a97578160200160208202803683370190505b50815260200184604051602001610aae9190613ba7565b604051602081830303815290604052815250611363565b505050505050565b5f80610ad7610e8f565b600201546001600160a01b031692915050565b610af261147e565b5f5f8051602061472c83398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610b5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b819190613be9565b1015610be85760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b6064820152608401610686565b610bf28133610f87565b15610c585760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b6064820152608401610686565b610c98858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506114c892505050565b50610ca16116df565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ceb5750825b90505f826001600160401b03166001148015610d065750303b155b905081158015610d14575080155b15610d325760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610d5c57845460ff60401b1916600160401b1785555b610d6889898989611709565b8315610dae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b5f805f8051602061472c83398151915261061b565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f80610e21610e8f565b6001015492915050565b5f80610e35610e8f565b6005015492915050565b610e47611250565b6001600160a01b038116610e7057604051631e4fbdf760e01b81525f6004820152602401610686565b61086b816112ab565b5f6005610e8783601f613c14565b901c92915050565b7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090565b610ec08383836001611759565b505050565b5f610ed08484610dce565b90505f198114610ca15781811015610f1457604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610686565b610ca184848484035f611759565b6001600160a01b038316610f4b57604051634b637e8f60e11b81525f6004820152602401610686565b6001600160a01b038216610f745760405163ec442f0560e01b81525f6004820152602401610686565b610ec083838361183c565b610889611250565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75008054600114610fea5760405162461bcd60e51b815260040161068690613c27565b600281555f610ff7610e8f565b905061100284611975565b600181015484350361101d576110188484611a60565b611027565b6110278484611be4565b50600190555050565b5f8051602061472c83398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015611084573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a89190613be9565b60028301549091508184111561111a5760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b6064820152608401610686565b80841161118f5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e006064820152608401610686565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500805460011461120a5760405162461bcd60e51b815260040161068690613c27565b600281555f611217610e8f565b905061122284611daf565b600181015484350361123e576112388484611fe9565b50611248565b61123884846121f8565b600190555050565b336112827f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108895760405163118cdaa760e01b8152336004820152602401610686565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f815f0361132a57505f610604565b306001600160a01b0384160361135857611346335b3084610ec5565b611351333084610f22565b5080610604565b610643833384612494565b5f8061136d6125f7565b60408401516020015190915015611412576040830151516001600160a01b03166113ef5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b6064820152608401610686565b604083015160208101519051611412916001600160a01b039091169083906126e7565b604051630624488560e41b81526001600160a01b0382169063624488509061143e908690600401613c6b565b6020604051808303815f875af115801561145a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106439190613be9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016114c257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6114d1610e8f565b9050806001015484146115385760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20696e76616c696420736f7572636520626c6f636044820152681ad8da185a5b88125160ba1b6064820152608401610686565b60028101546001600160a01b038481169116146115aa5760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a20696e76616c6964206f726967696e2073656e646044820152696572206164647265737360b01b6064820152608401610686565b5f828060200190518101906115bf9190613d64565b6006830154909150610100900460ff1615806115e05750600682015460ff16155b156115f75760068201805461ffff19166101011790555b60018151600481111561160c5761160c613b93565b03611643575f816020015180602001905181019061162a9190613dec565b905061163d815f0151826020015161276e565b506116d8565b60028151600481111561165857611658613b93565b03611686575f81602001518060200190518101906116769190613e24565b905061163d8182608001516127bb565b60405162461bcd60e51b815260206004820152602160248201527f546f6b656e52656d6f74653a20696e76616c6964206d657373616765207479706044820152606560f81b6064820152608401610686565b5050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b611711612914565b61171b838361295d565b611726845f8361296f565b7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf62622300805460ff191660ff8316179055610ca1565b5f8051602061470c8339815191526001600160a01b0385166117905760405163e602df0560e01b81525f6004820152602401610686565b6001600160a01b0384166117b957604051634a1406b160e11b81525f6004820152602401610686565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156116d857836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161182d91815260200190565b60405180910390a35050505050565b5f8051602061470c8339815191526001600160a01b0384166118765781816002015f82825461186b9190613c14565b909155506118e69050565b6001600160a01b0384165f90815260208290526040902054828110156118c85760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401610686565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611904576002810180548390039055611922565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161196791815260200190565b60405180910390a350505050565b5f611986606083016040840161378a565b6001600160a01b0316036119e85760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e74206164647260448201526265737360e81b6064820152608401610686565b5f8160c0013511611a0b5760405162461bcd60e51b815260040161068690613eee565b8035611a295760405162461bcd60e51b815260040161068690613f32565b5f611a3a604083016020840161378a565b6001600160a01b03160361086b5760405162461bcd60e51b815260040161068690613f7d565b5f611a69610e8f565b9050611a99611a7e604085016020860161378a565b60a0850135611a94610100870160e0880161378a565b6129a0565b5f611abd83611aae608087016060880161378a565b86608001358760a00135612a9d565b6040805180820190915291945091505f9080600181526020016040518060400160405280886040016020810190611af4919061378a565b6001600160a01b0316815260200187815250604051602001611b169190613fda565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92611b969282019080611b6e60808c0160608d0161378a565b6001600160a01b03168152602090810188905290825260c08a0135908201526040015f610a6e565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb528888604051611bd4929190613ffa565b60405180910390a3505050505050565b5f611bed610e8f565b9050611c1a8335611c04604086016020870161378a565b611c15610100870160e0880161378a565b612b60565b5f611c2f83611aae608087016060880161378a565b60408051808201825260038152815160e081018352883581529396509193505f9260208084019282820191611c68918b01908b0161378a565b6001600160a01b03168152602001611c8660608a0160408b0161378a565b6001600160a01b031681526020810188905260a0890135604082015260c08901356060820152608001611cc06101008a0160e08b0161378a565b6001600160a01b03169052604051611d309190602001815181526020808301516001600160a01b0390811691830191909152604080840151821690830152606080840151908301526080808401519083015260a0808401519083015260c092830151169181019190915260e00190565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92611b969282019080611d8860808c0160608d0161378a565b6001600160a01b03168152602090810188905290825262053020908201526040015f610a6e565b8035611dcd5760405162461bcd60e51b815260040161068690613f32565b5f611dde604083016020840161378a565b6001600160a01b031603611e045760405162461bcd60e51b815260040161068690613f7d565b5f611e15606083016040840161378a565b6001600160a01b031603611e805760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420636f6e7460448201526b72616374206164647265737360a01b6064820152608401610686565b5f816080013511611ea35760405162461bcd60e51b815260040161068690613eee565b5f8160a0013511611f045760405162461bcd60e51b815260206004820152602560248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420676173206044820152641b1a5b5a5d60da1b6064820152608401610686565b80608001358160a0013510611f6c5760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a20696e76616c696420726563697069656e742067604482015267185cc81b1a5b5a5d60c21b6064820152608401610686565b5f611f7e610100830160e0840161378a565b6001600160a01b03160361086b5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f2066616c6c6261636b20726563697060448201526b69656e74206164647265737360a01b6064820152608401610686565b5f611ff2610e8f565b905061201d612007604085016020860161378a565b610140850135611a9460e0870160c0880161378a565b5f612045836120346101208701610100880161378a565b866101200135876101400135612a9d565b6040805180820190915291945091505f908060028152602001604051806101000160405280865f01548152602001306001600160a01b031681526020016120893390565b6001600160a01b031681526020016120a760608a0160408b0161378a565b6001600160a01b03168152602081018890526040016120c960608a018a614099565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a0890135602082015260400161211d6101008a0160e08b0161378a565b6001600160a01b0316905260405161213891906020016140db565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f926121ba92820190806121926101208c016101008d0161378a565b6001600160a01b03168152602090810188905290825260808a0135908201526040015f610a6e565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168888604051611bd49291906141e2565b5f612201610e8f565b90506122288335612218604086016020870161378a565b611c1560e0870160c0880161378a565b5f61223f836120346101208701610100880161378a565b6040805180820190915291945091505f90806004815260200160405180610160016040528061226b3390565b6001600160a01b03168152602001885f01358152602001886020016020810190612295919061378a565b6001600160a01b031681526020016122b360608a0160408b0161378a565b6001600160a01b03168152602081018890526040016122d560608a018a614099565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a089013560208201526040016123296101008a0160e08b0161378a565b6001600160a01b031681526080890135602082015260400161235160e08a0160c08b0161378a565b6001600160a01b031681526101408901356020918201526040516123769291016142f0565b60408051601f19818403018152919052905290505f6105dc6123a561239e6060890189614099565b9050610e79565b6123af91906143cd565b6123bc9062055730613c14565b6040805160c0810182526001870154815260028701546001600160a01b03166020820152815180830183529293505f9261244592820190806124066101208d016101008e0161378a565b6001600160a01b031681526020908101899052908252818101869052604080515f815280830182528184015251606090920191610aae91889101613ba7565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b1689896040516124839291906141e2565b60405180910390a350505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa1580156124da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fe9190613be9565b90506125156001600160a01b038616853086612bfe565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612559573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061257d9190613be9565b90508181116125e35760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610686565b6125ed82826143e4565b9695505050505050565b5f8051602061472c83398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612651573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267591906143f7565b90506126818282610f87565b156106045760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b6064820152608401610686565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612734573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127589190613be9565b9050610ca184846127698585613c14565b612c65565b816001600160a01b03167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040516127a991815260200190565b60405180910390a26108568282612cf4565b6127c53082612cf4565b6127d430836060015183610eb3565b5f825f01518360200151846040015130858760a001516040516024016127ff96959493929190614412565b60408051601f198184030181529190526020810180516001600160e01b03166394395edd60e01b17905260c084015160608501519192505f91612843919084612d28565b90505f612854308660600151610dce565b90506128653086606001515f610eb3565b81156128b75784606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff4856040516128aa91815260200190565b60405180910390a26128ff565b84606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb0856040516128f691815260200190565b60405180910390a25b80156116d8576116d8308660e0015183610f22565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661088957604051631afcd79f60e31b815260040160405180910390fd5b612965612914565b6108568282612d3d565b612977612914565b61298d835f015184602001518560400151612d8d565b612995612da8565b610ec0838383612db8565b5f6129a9610e8f565b60028101549091506001600160a01b038581169116146129db5760405162461bcd60e51b815260040161068690614452565b8215612a355760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f207365636f6e646172792060448201526266656560e81b6064820152608401610686565b6001600160a01b03821615610ca15760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f206d756c74692d686f702060448201526766616c6c6261636b60c01b6064820152608401610686565b5f805f612aa8610e8f565b9050612ab3876130dc565b9650612abf868661131b565b60038201546004830154919650612ad99160ff16866130f4565b60038201546004830154612af1919060ff168a6130f4565b11612b535760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a20696e73756666696369656e7420746f6b656e7360448201526b103a37903a3930b739b332b960a11b6064820152608401610686565b5094959294509192505050565b5f612b69610e8f565b80549091508403612b9c57306001600160a01b03841603612b9c5760405162461bcd60e51b815260040161068690614452565b6001600160a01b038216610ca15760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f206d756c74692d686f702066616c6c6044820152636261636b60e01b6064820152608401610686565b6040516001600160a01b038481166024830152838116604483015260648201839052610ca19186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613101565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612cb68482613162565b610ca1576040516001600160a01b0384811660248301525f6044830152612cea91869182169063095ea7b390606401612c33565b610ca18482613101565b6001600160a01b038216612d1d5760405163ec442f0560e01b81525f6004820152602401610686565b6108565f838361183c565b5f612d35845f8585613203565b949350505050565b612d45612914565b5f8051602061470c8339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03612d7e84826144f3565b5060048101610ca183826144f3565b612d95612914565b612d9f83826132d3565b610ec0826132f5565b612db0612914565b610889613306565b612dc0612914565b5f612dc9610e8f565b90506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e329190613be9565b81556060840151612e985760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b6064820152608401610686565b8054606085015103612f125760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d6500000000006064820152608401610686565b60808401516001600160a01b0316612f785760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b6064820152608401610686565b60128460a0015160ff161115612fe25760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b6064820152608401610686565b60128260ff1611156130425760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b6064820152608401610686565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b918616919091021790556130be908361332d565b60048301805460ff1916911515919091179055600390910155505050565b5f6130e63361133f565b6130f03383613377565b5090565b5f612d358484845f6133ab565b5f6131156001600160a01b038416836133d2565b905080515f1415801561313957508080602001905181019061313791906145ae565b155b15610ec057604051635274afe760e01b81526001600160a01b0384166004820152602401610686565b5f805f846001600160a01b03168460405161317d91906145cd565b5f604051808303815f865af19150503d805f81146131b6576040519150601f19603f3d011682016040523d82523d5f602084013e6131bb565b606091505b50915091508180156131e55750805115806131e55750808060200190518101906131e591906145ae565b80156131fa57505f856001600160a01b03163b115b95945050505050565b5f845a10156132545760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e742067617300000000006044820152606401610686565b834710156132a45760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c75650000006044820152606401610686565b826001600160a01b03163b5f036132bc57505f612d35565b5f805f84516020860188888bf19695505050505050565b6132db612914565b6132e36133df565b6132eb6133ef565b61085682826133f7565b6132fd612914565b61086b8161357b565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500611702565b5f8060ff8085169084161181816133505761334885876145e8565b60ff1661335e565b61335a86866145e8565b60ff165b61336990600a6146e1565b9350909150505b9250929050565b6001600160a01b0382166133a057604051634b637e8f60e11b81525f6004820152602401610686565b610856825f8361183c565b5f811515841515036133c8576133c185846143cd565b9050612d35565b6131fa85846146ec565b606061064383835f613583565b6133e7612914565b610889613612565b610889612914565b6133ff612914565b6001600160a01b03821661347b5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f7274657220726567697374727920616464726573730000000000000000006064820152608401610686565b5f5f8051602061472c83398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134f19190613be9565b116135595760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b6064820152608401610686565b81546001600160a01b0319166001600160a01b038216178255610ca183611030565b610e47612914565b6060814710156135a85760405163cd78605960e01b8152306004820152602401610686565b5f80856001600160a01b031684866040516135c391906145cd565b5f6040518083038185875af1925050503d805f81146135fd576040519150601f19603f3d011682016040523d82523d5f602084013e613602565b606091505b50915091506125ed86838361361a565b6116df612914565b60608261362f5761362a82613676565b610643565b815115801561364657506001600160a01b0384163b155b1561366f57604051639996b31560e01b81526001600160a01b0385166004820152602401610686565b5080610643565b8051156136865780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f5b838110156136b95781810151838201526020016136a1565b50505f910152565b5f81518084526136d881602086016020860161369f565b601f01601f19169290920160200192915050565b602081525f61064360208301846136c1565b6001600160a01b038116811461086b575f80fd5b803561371d816136fe565b919050565b5f8060408385031215613733575f80fd5b823561373e816136fe565b946020939093013593505050565b5f805f6060848603121561375e575f80fd5b8335613769816136fe565b92506020840135613779816136fe565b929592945050506040919091013590565b5f6020828403121561379a575f80fd5b8135610643816136fe565b5f808284036101208112156137b8575f80fd5b610100808212156137c7575f80fd5b9395938601359450505050565b5f602082840312156137e4575f80fd5b5035919050565b5f80604083850312156137fc575f80fd5b82356001600160401b03811115613811575f80fd5b8301610160818603121561373e575f80fd5b5f60408284031215613833575f80fd5b50919050565b5f805f806060858703121561384c575f80fd5b84359350602085013561385e816136fe565b925060408501356001600160401b0380821115613879575f80fd5b818701915087601f83011261388c575f80fd5b81358181111561389a575f80fd5b8860208285010111156138ab575f80fd5b95989497505060200194505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b03811182821017156138f0576138f06138ba565b60405290565b604080519081016001600160401b03811182821017156138f0576138f06138ba565b60405161010081016001600160401b03811182821017156138f0576138f06138ba565b604051601f8201601f191681016001600160401b0381118282101715613963576139636138ba565b604052919050565b803560ff8116811461371d575f80fd5b5f6001600160401b03821115613993576139936138ba565b50601f01601f191660200190565b5f82601f8301126139b0575f80fd5b81356139c36139be8261397b565b61393b565b8181528460208386010111156139d7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80848603610120811215613a08575f80fd5b60c0811215613a15575f80fd5b50613a1e6138ce565b8535613a29816136fe565b81526020860135613a39816136fe565b8060208301525060408601356040820152606086013560608201526080860135613a62816136fe565b6080820152613a7360a0870161396b565b60a0820152935060c08501356001600160401b0380821115613a93575f80fd5b613a9f888389016139a1565b945060e0870135915080821115613ab4575f80fd5b50613ac1878288016139a1565b925050613ad1610100860161396b565b905092959194509250565b5f8060408385031215613aed575f80fd5b8235613af8816136fe565b91506020830135613b08816136fe565b809150509250929050565b600181811c90821680613b2757607f821691505b60208210810361383357634e487b7160e01b5f52602260045260245ffd5b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b602081525f825160058110613bca57634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612d3560608401826136c1565b5f60208284031215613bf9575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561060457610604613c00565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b80841015613cf857845183168252938501936001939093019290850190613cd6565b5060a0880151878203601f190160e08901529450613d1681866136c1565b98975050505050505050565b5f82601f830112613d31575f80fd5b8151613d3f6139be8261397b565b818152846020838601011115613d53575f80fd5b612d3582602083016020870161369f565b5f60208284031215613d74575f80fd5b81516001600160401b0380821115613d8a575f80fd5b9083019060408286031215613d9d575f80fd5b613da56138f6565b825160058110613db3575f80fd5b8152602083015182811115613dc6575f80fd5b613dd287828601613d22565b60208301525095945050505050565b805161371d816136fe565b5f60408284031215613dfc575f80fd5b613e046138f6565b8251613e0f816136fe565b81526020928301519281019290925250919050565b5f60208284031215613e34575f80fd5b81516001600160401b0380821115613e4a575f80fd5b908301906101008286031215613e5e575f80fd5b613e66613918565b82518152613e7660208401613de1565b6020820152613e8760408401613de1565b6040820152613e9860608401613de1565b60608201526080830151608082015260a083015182811115613eb8575f80fd5b613ec487828601613d22565b60a08301525060c083015160c0820152613ee060e08401613de1565b60e082015295945050505050565b60208082526024908201527f546f6b656e52656d6f74653a207a65726f20726571756972656420676173206c6040820152631a5b5a5d60e21b606082015260800190565b6020808252602b908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20626c60408201526a1bd8dad8da185a5b88125160aa1b606082015260800190565b60208082526037908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20746f60408201527f6b656e207472616e736665727265722061646472657373000000000000000000606082015260800190565b81516001600160a01b031681526020808301519082015260408101610604565b8235815261012081016020840135614011816136fe565b6001600160a01b039081166020840152604085013590614030826136fe565b16604083015261404260608501613712565b6001600160a01b0381166060840152506080840135608083015260a084013560a083015260c084013560c083015261407c60e08501613712565b6001600160a01b031660e083015261010090910191909152919050565b5f808335601e198436030181126140ae575f80fd5b8301803591506001600160401b038211156140c7575f80fd5b602001915036819003821315613370575f80fd5b60208152815160208201525f602083015160018060a01b0380821660408501528060408601511660608501525050606083015161412360808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c085015261414a6101208501836136c1565b915060c085015160e085015260e085015161416f828601826001600160a01b03169052565b5090949350505050565b5f808335601e1984360301811261418e575f80fd5b83016020810192503590506001600160401b038111156141ac575f80fd5b803603821315613370575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60408152823560408201525f6141fa60208501613712565b6001600160a01b0316606083015261421460408501613712565b6001600160a01b0316608083015261422f6060850185614179565b6101608060a08601526142476101a0860183856141ba565b9250608087013560c086015260a087013560e086015261426960c08801613712565b9150610100614282818701846001600160a01b03169052565b61428e60e08901613712565b92506101206142a7818801856001600160a01b03169052565b6142b2828a01613712565b935061014091506142cd828801856001600160a01b03169052565b880135918601919091529095013561018084015260209092019290925292915050565b6020815261430a6020820183516001600160a01b03169052565b602082015160408201525f604083015161432f60608401826001600160a01b03169052565b5060608301516001600160a01b038116608084015250608083015160a083015260a08301516101608060c085015261436b6101808501836136c1565b915060c085015160e085015260e0850151610100614393818701836001600160a01b03169052565b8601516101208681019190915286015190506101406143bc818701836001600160a01b03169052565b959095015193019290925250919050565b808202811582820484141761060457610604613c00565b8181038181111561060457610604613c00565b5f60208284031215614407575f80fd5b8151610643816136fe565b8681526001600160a01b0386811660208301528581166040830152841660608201526080810183905260c060a082018190525f90613d16908301846136c1565b6020808252603a908201527f546f6b656e52656d6f74653a20696e76616c69642064657374696e6174696f6e60408201527f20746f6b656e207472616e736665727265722061646472657373000000000000606082015260800190565b601f821115610ec057805f5260205f20601f840160051c810160208510156144d45750805b601f840160051c820191505b818110156116d8575f81556001016144e0565b81516001600160401b0381111561450c5761450c6138ba565b6145208161451a8454613b13565b846144af565b602080601f831160018114614553575f841561453c5750858301515b5f19600386901b1c1916600185901b178555610ac5565b5f85815260208120601f198616915b8281101561458157888601518255948401946001909101908401614562565b508582101561459e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156145be575f80fd5b81518015158114610643575f80fd5b5f82516145de81846020870161369f565b9190910192915050565b60ff828116828216039081111561060457610604613c00565b600181815b8085111561463b57815f190482111561462157614621613c00565b8085161561462e57918102915b93841c9390800290614606565b509250929050565b5f8261465157506001610604565b8161465d57505f610604565b8160018114614673576002811461467d57614699565b6001915050610604565b60ff84111561468e5761468e613c00565b50506001821b610604565b5060208310610133831016604e8410600b84101617156146bc575081810a610604565b6146c68383614601565b805f19048211156146d9576146d9613c00565b029392505050565b5f6106438383614643565b5f8261470657634e487b7160e01b5f52601260045260245ffd5b50049056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a264697066735822122075e5c3c72181a26547917c5ec35ed389afc6bfee55fcd464aa42390548718c8a64736f6c6343000819003354656c65706f7274657252656769737472794170703a20696e76616c69642054", + Bin: "0x608060405234801561000f575f80fd5b5060405161570338038061570383398101604081905261002e91610bf5565b61003a84848484610046565b50505050610f55565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f8115801561008f5750825b90505f826001600160401b031660011480156100aa5750303b155b9050811580156100b8575080155b156100d65760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561010457845460ff60401b1916680100000000000000001785555b61011089898989610161565b831561015657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6101696101b3565b6101738383610203565b61017e845f83610219565b7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf62622300805460ff191660ff83161790555b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff1661020157604051631afcd79f60e31b815260040160405180910390fd5b565b61020b6101b3565b6102158282610250565b5050565b6102216101b3565b8251602084015160408501516102389291906102b3565b6102406102ce565b61024b8383836102de565b505050565b6102586101b3565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036102a48482610d5a565b50600481016101ad8382610d5a565b6102bb6101b3565b6102c5838261062d565b61024b8261064f565b6102d66101b3565b610201610660565b6102e66101b3565b5f7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090507302000000000000000000000000000000000000056001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561035a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037e9190610e19565b815560608401516103e95760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b60648201526084015b60405180910390fd5b80546060850151036104635760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d65000000000060648201526084016103e0565b60808401516001600160a01b03166104c95760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b60648201526084016103e0565b60128460a0015160ff1611156105335760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b60648201526084016103e0565b60128260ff1611156105935760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b60648201526084016103e0565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b9186169190910217905561060f908361068a565b60048301805460ff1916911515919091179055600390910155505050565b6106356101b3565b61063d6106d2565b6106456106e2565b61021582826106ea565b6106576101b3565b6100438161086e565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75005b6001905550565b5f8060ff8085169084161181816106ad576106a58587610e44565b60ff166106bb565b6106b78686610e44565b60ff165b6106c690600a610f43565b96919550909350505050565b6106da6101b3565b6102016108a8565b6102016101b3565b6106f26101b3565b6001600160a01b03821661076e5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016103e0565b5f7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0090505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f79190610e19565b1161084c5760405162461bcd60e51b815260206004820152603260248201525f805160206156e3833981519152604482015271656c65706f7274657220726567697374727960701b60648201526084016103e0565b81546001600160a01b0319166001600160a01b0382161782556101ad836108d7565b6108766101b3565b6001600160a01b03811661089f57604051631e4fbdf760e01b81525f60048201526024016103e0565b61004381610a6f565b6108b06101b3565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00610683565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa15801561093e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109629190610e19565b6002830154909150818411156109c15760405162461bcd60e51b815260206004820152603160248201525f805160206156e383398151915260448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016103e0565b808411610a365760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016103e0565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b0381118282101715610b1557610b15610adf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610b4357610b43610adf565b604052919050565b80516001600160a01b0381168114610b61575f80fd5b919050565b805160ff81168114610b61575f80fd5b5f82601f830112610b85575f80fd5b81516001600160401b03811115610b9e57610b9e610adf565b6020610bb2601f8301601f19168201610b1b565b8281528582848701011115610bc5575f80fd5b5f5b83811015610be2578581018301518282018401528201610bc7565b505f928101909101919091529392505050565b5f805f80848603610120811215610c0a575f80fd5b60c0811215610c17575f80fd5b50610c20610af3565b610c2986610b4b565b8152610c3760208701610b4b565b60208201526040860151604082015260608601516060820152610c5c60808701610b4b565b6080820152610c6d60a08701610b66565b60a082015260c08601519094506001600160401b0380821115610c8e575f80fd5b610c9a88838901610b76565b945060e0870151915080821115610caf575f80fd5b50610cbc87828801610b76565b925050610ccc6101008601610b66565b905092959194509250565b600181811c90821680610ceb57607f821691505b602082108103610d0957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561024b57805f5260205f20601f840160051c81016020851015610d345750805b601f840160051c820191505b81811015610d53575f8155600101610d40565b5050505050565b81516001600160401b03811115610d7357610d73610adf565b610d8781610d818454610cd7565b84610d0f565b602080601f831160018114610dba575f8415610da35750858301515b5f19600386901b1c1916600185901b178555610e11565b5f85815260208120601f198616915b82811015610de857888601518255948401946001909101908401610dc9565b5085821015610e0557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215610e29575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b60ff8281168282160390811115610e5d57610e5d610e30565b92915050565b600181815b80851115610e9d57815f1904821115610e8357610e83610e30565b80851615610e9057918102915b93841c9390800290610e68565b509250929050565b5f82610eb357506001610e5d565b81610ebf57505f610e5d565b8160018114610ed55760028114610edf57610efb565b6001915050610e5d565b60ff841115610ef057610ef0610e30565b50506001821b610e5d565b5060208310610133831016604e8410600b8410161715610f1e575081810a610e5d565b610f288383610e63565b805f1904821115610f3b57610f3b610e30565b029392505050565b5f610f4e8383610ea5565b9392505050565b61478180610f625f395ff3fe608060405234801561000f575f80fd5b506004361061021e575f3560e01c806370a082311161012a578063b8a46d02116100b4578063dd62ed3e11610079578063dd62ed3e146104bd578063e0fd9cb8146104d0578063ef793e2a146104d8578063f2fde38b146104e0578063f3f981d8146104f3575f80fd5b8063b8a46d0214610474578063c3cd692714610487578063c868efaa1461048f578063c9fe4ddf146104a2578063d2cc7a70146104b5575f80fd5b80638da5cb5b116100fa5780638da5cb5b146103ee578063909a6ac01461043257806395d89b4114610446578063973142971461044e578063a9059cbb14610461575f80fd5b806370a08231146103a0578063715018a6146103d457806371717c18146103dc5780637ee3779a146103e6575f80fd5b8063313ce567116101ab5780635507f3d11161017b5780635507f3d1146103365780635d16225d146103405780635eb995141461035357806362431a6514610366578063656900381461038d575f80fd5b8063313ce567146102c057806335cac159146102f45780634213cf781461031b5780634511243e14610323575f80fd5b806315beb59f116101f157806315beb59f1461027d57806318160ddd1461028657806323b872dd1461028e578063254ac160146102a15780632b0d8f18146102ab575f80fd5b806302a30c7d1461022257806306fdde031461023f5780630733c8c814610254578063095ea7b31461026a575b5f80fd5b61022a610506565b60405190151581526020015b60405180910390f35b61024761051d565b60405161023691906136ec565b61025c6105dd565b604051908152602001610236565b61022a610278366004613722565b6105f1565b61025c6105dc81565b61025c61060a565b61022a61029c36600461374c565b610625565b61025c6201fbd081565b6102be6102b936600461378a565b61064a565b005b7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf626223005460405160ff9091168152602001610236565b61025c7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0081565b61025c61074c565b6102be61033136600461378a565b61075d565b61025c6205302081565b6102be61034e3660046137a5565b61084c565b6102be6103613660046137d4565b61085a565b61025c7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf6262230081565b6102be61039b3660046137eb565b61086e565b61025c6103ae36600461378a565b6001600160a01b03165f9081525f8051602061470c833981519152602052604090205490565b6102be610878565b61025c6205573081565b61022a61088b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610236565b61025c5f8051602061472c83398151915281565b6102476108a2565b61022a61045c36600461378a565b6108e0565b61022a61046f366004613722565b6108f9565b6102be610482366004613823565b610906565b61041a610acd565b6102be61049d366004613839565b610aea565b6102be6104b03660046139f3565b610ca7565b61025c610db9565b61025c6104cb366004613adc565b610dce565b61025c610e17565b61025c610e2b565b6102be6104ee36600461378a565b610e3f565b61025c6105013660046137d4565b610e79565b5f80610510610e8f565b6006015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f8051602061470c8339815191529161055b90613b13565b80601f016020809104026020016040519081016040528092919081815260200182805461058790613b13565b80156105d25780601f106105a9576101008083540402835291602001916105d2565b820191905f5260205f20905b8154815290600101906020018083116105b557829003601f168201915b505050505091505090565b5f806105e7610e8f565b6003015492915050565b5f336105fe818585610eb3565b60019150505b92915050565b5f805f8051602061470c8339815191525b6002015492915050565b5f33610632858285610ec5565b61063d858585610f22565b60019150505b9392505050565b5f8051602061472c833981519152610660610f7f565b6001600160a01b03821661068f5760405162461bcd60e51b815260040161068690613b45565b60405180910390fd5b6106998183610f87565b156106fc5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b6064820152608401610686565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b5f80610756610e8f565b5492915050565b5f8051602061472c833981519152610773610f7f565b6001600160a01b0382166107995760405162461bcd60e51b815260040161068690613b45565b6107a38183610f87565b6108015760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b6064820152608401610686565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b6108568282610fa8565b5050565b610862610f7f565b61086b81611030565b50565b61085682826111c8565b610880611250565b6108895f6112ab565b565b5f80610895610e8f565b6004015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f8051602061470c8339815191529161055b90613b13565b5f5f8051602061472c8339815191526106438184610f87565b5f336105fe818585610f22565b5f61090f610e8f565b6006810154909150610100900460ff161561096c5760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e52656d6f74653a20616c72656164792072656769737465726564006044820152606401610686565b604080516060808201835260058401548252600284015460ff600160a01b820481166020808601918252600160a81b9093048216858701908152865180880188525f808252885188518188015293518516848a01529151909316828601528651808303909501855260809091019095528082019290925291929091610a01906109f79087018761378a565b866020013561131b565b6040805160c0810182526001870154815260028701546001600160a01b031660208083019190915282518084018452939450610ac5939192830191908190610a4b908b018b61378a565b6001600160a01b0316815260209081018690529082526201fbd0908201526040015f5b604051908082528060200260200182016040528015610a97578160200160208202803683370190505b50815260200184604051602001610aae9190613ba7565b604051602081830303815290604052815250611363565b505050505050565b5f80610ad7610e8f565b600201546001600160a01b031692915050565b610af261147e565b5f5f8051602061472c83398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610b5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b819190613be9565b1015610be85760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b6064820152608401610686565b610bf28133610f87565b15610c585760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b6064820152608401610686565b610c98858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506114c892505050565b50610ca16116df565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ceb5750825b90505f826001600160401b03166001148015610d065750303b155b905081158015610d14575080155b15610d325760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610d5c57845460ff60401b1916600160401b1785555b610d6889898989611709565b8315610dae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b5f805f8051602061472c83398151915261061b565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f80610e21610e8f565b6001015492915050565b5f80610e35610e8f565b6005015492915050565b610e47611250565b6001600160a01b038116610e7057604051631e4fbdf760e01b81525f6004820152602401610686565b61086b816112ab565b5f6005610e8783601f613c14565b901c92915050565b7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090565b610ec08383836001611759565b505050565b5f610ed08484610dce565b90505f198114610ca15781811015610f1457604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610686565b610ca184848484035f611759565b6001600160a01b038316610f4b57604051634b637e8f60e11b81525f6004820152602401610686565b6001600160a01b038216610f745760405163ec442f0560e01b81525f6004820152602401610686565b610ec083838361183c565b610889611250565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75008054600114610fea5760405162461bcd60e51b815260040161068690613c27565b600281555f610ff7610e8f565b905061100284611975565b600181015484350361101d576110188484611a60565b611027565b6110278484611be4565b50600190555050565b5f8051602061472c83398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015611084573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a89190613be9565b60028301549091508184111561111a5760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b6064820152608401610686565b80841161118f5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e006064820152608401610686565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500805460011461120a5760405162461bcd60e51b815260040161068690613c27565b600281555f611217610e8f565b905061122284611daf565b600181015484350361123e576112388484611fe9565b50611248565b61123884846121f8565b600190555050565b336112827f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108895760405163118cdaa760e01b8152336004820152602401610686565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f815f0361132a57505f610604565b306001600160a01b0384160361135857611346335b3084610ec5565b611351333084610f22565b5080610604565b610643833384612494565b5f8061136d6125f7565b60408401516020015190915015611412576040830151516001600160a01b03166113ef5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b6064820152608401610686565b604083015160208101519051611412916001600160a01b039091169083906126e7565b604051630624488560e41b81526001600160a01b0382169063624488509061143e908690600401613c6b565b6020604051808303815f875af115801561145a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106439190613be9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016114c257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6114d1610e8f565b9050806001015484146115385760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20696e76616c696420736f7572636520626c6f636044820152681ad8da185a5b88125160ba1b6064820152608401610686565b60028101546001600160a01b038481169116146115aa5760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a20696e76616c6964206f726967696e2073656e646044820152696572206164647265737360b01b6064820152608401610686565b5f828060200190518101906115bf9190613d64565b6006830154909150610100900460ff1615806115e05750600682015460ff16155b156115f75760068201805461ffff19166101011790555b60018151600481111561160c5761160c613b93565b03611643575f816020015180602001905181019061162a9190613dec565b905061163d815f0151826020015161276e565b506116d8565b60028151600481111561165857611658613b93565b03611686575f81602001518060200190518101906116769190613e24565b905061163d8182608001516127bb565b60405162461bcd60e51b815260206004820152602160248201527f546f6b656e52656d6f74653a20696e76616c6964206d657373616765207479706044820152606560f81b6064820152608401610686565b5050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b611711612914565b61171b838361295d565b611726845f8361296f565b7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf62622300805460ff191660ff8316179055610ca1565b5f8051602061470c8339815191526001600160a01b0385166117905760405163e602df0560e01b81525f6004820152602401610686565b6001600160a01b0384166117b957604051634a1406b160e11b81525f6004820152602401610686565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156116d857836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161182d91815260200190565b60405180910390a35050505050565b5f8051602061470c8339815191526001600160a01b0384166118765781816002015f82825461186b9190613c14565b909155506118e69050565b6001600160a01b0384165f90815260208290526040902054828110156118c85760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401610686565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611904576002810180548390039055611922565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161196791815260200190565b60405180910390a350505050565b5f611986606083016040840161378a565b6001600160a01b0316036119e85760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e74206164647260448201526265737360e81b6064820152608401610686565b5f8160c0013511611a0b5760405162461bcd60e51b815260040161068690613eee565b8035611a295760405162461bcd60e51b815260040161068690613f32565b5f611a3a604083016020840161378a565b6001600160a01b03160361086b5760405162461bcd60e51b815260040161068690613f7d565b5f611a69610e8f565b9050611a99611a7e604085016020860161378a565b60a0850135611a94610100870160e0880161378a565b6129a0565b5f611abd83611aae608087016060880161378a565b86608001358760a00135612a9d565b6040805180820190915291945091505f9080600181526020016040518060400160405280886040016020810190611af4919061378a565b6001600160a01b0316815260200187815250604051602001611b169190613fda565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92611b969282019080611b6e60808c0160608d0161378a565b6001600160a01b03168152602090810188905290825260c08a0135908201526040015f610a6e565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb528888604051611bd4929190613ffa565b60405180910390a3505050505050565b5f611bed610e8f565b9050611c1a8335611c04604086016020870161378a565b611c15610100870160e0880161378a565b612b60565b5f611c2f83611aae608087016060880161378a565b60408051808201825260038152815160e081018352883581529396509193505f9260208084019282820191611c68918b01908b0161378a565b6001600160a01b03168152602001611c8660608a0160408b0161378a565b6001600160a01b031681526020810188905260a0890135604082015260c08901356060820152608001611cc06101008a0160e08b0161378a565b6001600160a01b03169052604051611d309190602001815181526020808301516001600160a01b0390811691830191909152604080840151821690830152606080840151908301526080808401519083015260a0808401519083015260c092830151169181019190915260e00190565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92611b969282019080611d8860808c0160608d0161378a565b6001600160a01b03168152602090810188905290825262053020908201526040015f610a6e565b8035611dcd5760405162461bcd60e51b815260040161068690613f32565b5f611dde604083016020840161378a565b6001600160a01b031603611e045760405162461bcd60e51b815260040161068690613f7d565b5f611e15606083016040840161378a565b6001600160a01b031603611e805760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420636f6e7460448201526b72616374206164647265737360a01b6064820152608401610686565b5f816080013511611ea35760405162461bcd60e51b815260040161068690613eee565b5f8160a0013511611f045760405162461bcd60e51b815260206004820152602560248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420676173206044820152641b1a5b5a5d60da1b6064820152608401610686565b80608001358160a0013510611f6c5760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a20696e76616c696420726563697069656e742067604482015267185cc81b1a5b5a5d60c21b6064820152608401610686565b5f611f7e610100830160e0840161378a565b6001600160a01b03160361086b5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f2066616c6c6261636b20726563697060448201526b69656e74206164647265737360a01b6064820152608401610686565b5f611ff2610e8f565b905061201d612007604085016020860161378a565b610140850135611a9460e0870160c0880161378a565b5f612045836120346101208701610100880161378a565b866101200135876101400135612a9d565b6040805180820190915291945091505f908060028152602001604051806101000160405280865f01548152602001306001600160a01b031681526020016120893390565b6001600160a01b031681526020016120a760608a0160408b0161378a565b6001600160a01b03168152602081018890526040016120c960608a018a614099565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a0890135602082015260400161211d6101008a0160e08b0161378a565b6001600160a01b0316905260405161213891906020016140db565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f926121ba92820190806121926101208c016101008d0161378a565b6001600160a01b03168152602090810188905290825260808a0135908201526040015f610a6e565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168888604051611bd49291906141e2565b5f612201610e8f565b90506122288335612218604086016020870161378a565b611c1560e0870160c0880161378a565b5f61223f836120346101208701610100880161378a565b6040805180820190915291945091505f90806004815260200160405180610160016040528061226b3390565b6001600160a01b03168152602001885f01358152602001886020016020810190612295919061378a565b6001600160a01b031681526020016122b360608a0160408b0161378a565b6001600160a01b03168152602081018890526040016122d560608a018a614099565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a089013560208201526040016123296101008a0160e08b0161378a565b6001600160a01b031681526080890135602082015260400161235160e08a0160c08b0161378a565b6001600160a01b031681526101408901356020918201526040516123769291016142f0565b60408051601f19818403018152919052905290505f6105dc6123a561239e6060890189614099565b9050610e79565b6123af91906143cd565b6123bc9062055730613c14565b6040805160c0810182526001870154815260028701546001600160a01b03166020820152815180830183529293505f9261244592820190806124066101208d016101008e0161378a565b6001600160a01b031681526020908101899052908252818101869052604080515f815280830182528184015251606090920191610aae91889101613ba7565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b1689896040516124839291906141e2565b60405180910390a350505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa1580156124da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fe9190613be9565b90506125156001600160a01b038616853086612bfe565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612559573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061257d9190613be9565b90508181116125e35760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610686565b6125ed82826143e4565b9695505050505050565b5f8051602061472c83398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612651573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267591906143f7565b90506126818282610f87565b156106045760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b6064820152608401610686565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612734573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127589190613be9565b9050610ca184846127698585613c14565b612c65565b816001600160a01b03167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040516127a991815260200190565b60405180910390a26108568282612cf4565b6127c53082612cf4565b6127d430836060015183610eb3565b5f825f01518360200151846040015130858760a001516040516024016127ff96959493929190614412565b60408051601f198184030181529190526020810180516001600160e01b03166394395edd60e01b17905260c084015160608501519192505f91612843919084612d28565b90505f612854308660600151610dce565b90506128653086606001515f610eb3565b81156128b75784606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff4856040516128aa91815260200190565b60405180910390a26128ff565b84606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb0856040516128f691815260200190565b60405180910390a25b80156116d8576116d8308660e0015183610f22565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661088957604051631afcd79f60e31b815260040160405180910390fd5b612965612914565b6108568282612d3d565b612977612914565b61298d835f015184602001518560400151612d8d565b612995612da8565b610ec0838383612db8565b5f6129a9610e8f565b60028101549091506001600160a01b038581169116146129db5760405162461bcd60e51b815260040161068690614452565b8215612a355760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f207365636f6e646172792060448201526266656560e81b6064820152608401610686565b6001600160a01b03821615610ca15760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f206d756c74692d686f702060448201526766616c6c6261636b60c01b6064820152608401610686565b5f805f612aa8610e8f565b9050612ab3876130dc565b9650612abf868661131b565b60038201546004830154919650612ad99160ff16866130f4565b60038201546004830154612af1919060ff168a6130f4565b11612b535760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a20696e73756666696369656e7420746f6b656e7360448201526b103a37903a3930b739b332b960a11b6064820152608401610686565b5094959294509192505050565b5f612b69610e8f565b80549091508403612b9c57306001600160a01b03841603612b9c5760405162461bcd60e51b815260040161068690614452565b6001600160a01b038216610ca15760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f206d756c74692d686f702066616c6c6044820152636261636b60e01b6064820152608401610686565b6040516001600160a01b038481166024830152838116604483015260648201839052610ca19186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613101565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612cb68482613162565b610ca1576040516001600160a01b0384811660248301525f6044830152612cea91869182169063095ea7b390606401612c33565b610ca18482613101565b6001600160a01b038216612d1d5760405163ec442f0560e01b81525f6004820152602401610686565b6108565f838361183c565b5f612d35845f8585613203565b949350505050565b612d45612914565b5f8051602061470c8339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03612d7e84826144f3565b5060048101610ca183826144f3565b612d95612914565b612d9f83826132d3565b610ec0826132f5565b612db0612914565b610889613306565b612dc0612914565b5f612dc9610e8f565b90506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e329190613be9565b81556060840151612e985760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b6064820152608401610686565b8054606085015103612f125760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d6500000000006064820152608401610686565b60808401516001600160a01b0316612f785760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b6064820152608401610686565b60128460a0015160ff161115612fe25760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b6064820152608401610686565b60128260ff1611156130425760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b6064820152608401610686565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b918616919091021790556130be908361332d565b60048301805460ff1916911515919091179055600390910155505050565b5f6130e63361133f565b6130f03383613377565b5090565b5f612d358484845f6133ab565b5f6131156001600160a01b038416836133d2565b905080515f1415801561313957508080602001905181019061313791906145ae565b155b15610ec057604051635274afe760e01b81526001600160a01b0384166004820152602401610686565b5f805f846001600160a01b03168460405161317d91906145cd565b5f604051808303815f865af19150503d805f81146131b6576040519150601f19603f3d011682016040523d82523d5f602084013e6131bb565b606091505b50915091508180156131e55750805115806131e55750808060200190518101906131e591906145ae565b80156131fa57505f856001600160a01b03163b115b95945050505050565b5f845a10156132545760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e742067617300000000006044820152606401610686565b834710156132a45760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c75650000006044820152606401610686565b826001600160a01b03163b5f036132bc57505f612d35565b5f805f84516020860188888bf19695505050505050565b6132db612914565b6132e36133df565b6132eb6133ef565b61085682826133f7565b6132fd612914565b61086b8161357b565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500611702565b5f8060ff8085169084161181816133505761334885876145e8565b60ff1661335e565b61335a86866145e8565b60ff165b61336990600a6146e1565b9350909150505b9250929050565b6001600160a01b0382166133a057604051634b637e8f60e11b81525f6004820152602401610686565b610856825f8361183c565b5f811515841515036133c8576133c185846143cd565b9050612d35565b6131fa85846146ec565b606061064383835f613583565b6133e7612914565b610889613612565b610889612914565b6133ff612914565b6001600160a01b03821661347b5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f7274657220726567697374727920616464726573730000000000000000006064820152608401610686565b5f5f8051602061472c83398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134f19190613be9565b116135595760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b6064820152608401610686565b81546001600160a01b0319166001600160a01b038216178255610ca183611030565b610e47612914565b6060814710156135a85760405163cd78605960e01b8152306004820152602401610686565b5f80856001600160a01b031684866040516135c391906145cd565b5f6040518083038185875af1925050503d805f81146135fd576040519150601f19603f3d011682016040523d82523d5f602084013e613602565b606091505b50915091506125ed86838361361a565b6116df612914565b60608261362f5761362a82613676565b610643565b815115801561364657506001600160a01b0384163b155b1561366f57604051639996b31560e01b81526001600160a01b0385166004820152602401610686565b5080610643565b8051156136865780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f5b838110156136b95781810151838201526020016136a1565b50505f910152565b5f81518084526136d881602086016020860161369f565b601f01601f19169290920160200192915050565b602081525f61064360208301846136c1565b6001600160a01b038116811461086b575f80fd5b803561371d816136fe565b919050565b5f8060408385031215613733575f80fd5b823561373e816136fe565b946020939093013593505050565b5f805f6060848603121561375e575f80fd5b8335613769816136fe565b92506020840135613779816136fe565b929592945050506040919091013590565b5f6020828403121561379a575f80fd5b8135610643816136fe565b5f808284036101208112156137b8575f80fd5b610100808212156137c7575f80fd5b9395938601359450505050565b5f602082840312156137e4575f80fd5b5035919050565b5f80604083850312156137fc575f80fd5b82356001600160401b03811115613811575f80fd5b8301610160818603121561373e575f80fd5b5f60408284031215613833575f80fd5b50919050565b5f805f806060858703121561384c575f80fd5b84359350602085013561385e816136fe565b925060408501356001600160401b0380821115613879575f80fd5b818701915087601f83011261388c575f80fd5b81358181111561389a575f80fd5b8860208285010111156138ab575f80fd5b95989497505060200194505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b03811182821017156138f0576138f06138ba565b60405290565b604080519081016001600160401b03811182821017156138f0576138f06138ba565b60405161010081016001600160401b03811182821017156138f0576138f06138ba565b604051601f8201601f191681016001600160401b0381118282101715613963576139636138ba565b604052919050565b803560ff8116811461371d575f80fd5b5f6001600160401b03821115613993576139936138ba565b50601f01601f191660200190565b5f82601f8301126139b0575f80fd5b81356139c36139be8261397b565b61393b565b8181528460208386010111156139d7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80848603610120811215613a08575f80fd5b60c0811215613a15575f80fd5b50613a1e6138ce565b8535613a29816136fe565b81526020860135613a39816136fe565b8060208301525060408601356040820152606086013560608201526080860135613a62816136fe565b6080820152613a7360a0870161396b565b60a0820152935060c08501356001600160401b0380821115613a93575f80fd5b613a9f888389016139a1565b945060e0870135915080821115613ab4575f80fd5b50613ac1878288016139a1565b925050613ad1610100860161396b565b905092959194509250565b5f8060408385031215613aed575f80fd5b8235613af8816136fe565b91506020830135613b08816136fe565b809150509250929050565b600181811c90821680613b2757607f821691505b60208210810361383357634e487b7160e01b5f52602260045260245ffd5b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b602081525f825160058110613bca57634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612d3560608401826136c1565b5f60208284031215613bf9575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561060457610604613c00565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b80841015613cf857845183168252938501936001939093019290850190613cd6565b5060a0880151878203601f190160e08901529450613d1681866136c1565b98975050505050505050565b5f82601f830112613d31575f80fd5b8151613d3f6139be8261397b565b818152846020838601011115613d53575f80fd5b612d3582602083016020870161369f565b5f60208284031215613d74575f80fd5b81516001600160401b0380821115613d8a575f80fd5b9083019060408286031215613d9d575f80fd5b613da56138f6565b825160058110613db3575f80fd5b8152602083015182811115613dc6575f80fd5b613dd287828601613d22565b60208301525095945050505050565b805161371d816136fe565b5f60408284031215613dfc575f80fd5b613e046138f6565b8251613e0f816136fe565b81526020928301519281019290925250919050565b5f60208284031215613e34575f80fd5b81516001600160401b0380821115613e4a575f80fd5b908301906101008286031215613e5e575f80fd5b613e66613918565b82518152613e7660208401613de1565b6020820152613e8760408401613de1565b6040820152613e9860608401613de1565b60608201526080830151608082015260a083015182811115613eb8575f80fd5b613ec487828601613d22565b60a08301525060c083015160c0820152613ee060e08401613de1565b60e082015295945050505050565b60208082526024908201527f546f6b656e52656d6f74653a207a65726f20726571756972656420676173206c6040820152631a5b5a5d60e21b606082015260800190565b6020808252602b908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20626c60408201526a1bd8dad8da185a5b88125160aa1b606082015260800190565b60208082526037908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20746f60408201527f6b656e207472616e736665727265722061646472657373000000000000000000606082015260800190565b81516001600160a01b031681526020808301519082015260408101610604565b8235815261012081016020840135614011816136fe565b6001600160a01b039081166020840152604085013590614030826136fe565b16604083015261404260608501613712565b6001600160a01b0381166060840152506080840135608083015260a084013560a083015260c084013560c083015261407c60e08501613712565b6001600160a01b031660e083015261010090910191909152919050565b5f808335601e198436030181126140ae575f80fd5b8301803591506001600160401b038211156140c7575f80fd5b602001915036819003821315613370575f80fd5b60208152815160208201525f602083015160018060a01b0380821660408501528060408601511660608501525050606083015161412360808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c085015261414a6101208501836136c1565b915060c085015160e085015260e085015161416f828601826001600160a01b03169052565b5090949350505050565b5f808335601e1984360301811261418e575f80fd5b83016020810192503590506001600160401b038111156141ac575f80fd5b803603821315613370575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60408152823560408201525f6141fa60208501613712565b6001600160a01b0316606083015261421460408501613712565b6001600160a01b0316608083015261422f6060850185614179565b6101608060a08601526142476101a0860183856141ba565b9250608087013560c086015260a087013560e086015261426960c08801613712565b9150610100614282818701846001600160a01b03169052565b61428e60e08901613712565b92506101206142a7818801856001600160a01b03169052565b6142b2828a01613712565b935061014091506142cd828801856001600160a01b03169052565b880135918601919091529095013561018084015260209092019290925292915050565b6020815261430a6020820183516001600160a01b03169052565b602082015160408201525f604083015161432f60608401826001600160a01b03169052565b5060608301516001600160a01b038116608084015250608083015160a083015260a08301516101608060c085015261436b6101808501836136c1565b915060c085015160e085015260e0850151610100614393818701836001600160a01b03169052565b8601516101208681019190915286015190506101406143bc818701836001600160a01b03169052565b959095015193019290925250919050565b808202811582820484141761060457610604613c00565b8181038181111561060457610604613c00565b5f60208284031215614407575f80fd5b8151610643816136fe565b8681526001600160a01b0386811660208301528581166040830152841660608201526080810183905260c060a082018190525f90613d16908301846136c1565b6020808252603a908201527f546f6b656e52656d6f74653a20696e76616c69642064657374696e6174696f6e60408201527f20746f6b656e207472616e736665727265722061646472657373000000000000606082015260800190565b601f821115610ec057805f5260205f20601f840160051c810160208510156144d45750805b601f840160051c820191505b818110156116d8575f81556001016144e0565b81516001600160401b0381111561450c5761450c6138ba565b6145208161451a8454613b13565b846144af565b602080601f831160018114614553575f841561453c5750858301515b5f19600386901b1c1916600185901b178555610ac5565b5f85815260208120601f198616915b8281101561458157888601518255948401946001909101908401614562565b508582101561459e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156145be575f80fd5b81518015158114610643575f80fd5b5f82516145de81846020870161369f565b9190910192915050565b60ff828116828216039081111561060457610604613c00565b600181815b8085111561463b57815f190482111561462157614621613c00565b8085161561462e57918102915b93841c9390800290614606565b509250929050565b5f8261465157506001610604565b8161465d57505f610604565b8160018114614673576002811461467d57614699565b6001915050610604565b60ff84111561468e5761468e613c00565b50506001821b610604565b5060208310610133831016604e8410600b84101617156146bc575081810a610604565b6146c68383614601565b805f19048211156146d9576146d9613c00565b029392505050565b5f6106438383614643565b5f8261470657634e487b7160e01b5f52601260045260245ffd5b50049056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a26469706673582212203e07cacfe544a2fb7ffac5193a22a4820c367256cb66e9c54eb05cea73d6d1ea64736f6c6343000819003354656c65706f7274657252656769737472794170703a20696e76616c69642054", } // ERC20TokenRemoteABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/ictt/TokenRemote/ERC20TokenRemoteUpgradeable/ERC20TokenRemoteUpgradeable.go b/abi-bindings/go/ictt/TokenRemote/ERC20TokenRemoteUpgradeable/ERC20TokenRemoteUpgradeable.go index 920baf74d..eac62da88 100644 --- a/abi-bindings/go/ictt/TokenRemote/ERC20TokenRemoteUpgradeable/ERC20TokenRemoteUpgradeable.go +++ b/abi-bindings/go/ictt/TokenRemote/ERC20TokenRemoteUpgradeable/ERC20TokenRemoteUpgradeable.go @@ -75,7 +75,7 @@ type TokenRemoteSettings struct { // ERC20TokenRemoteUpgradeableMetaData contains all meta data concerning the ERC20TokenRemoteUpgradeable contract. var ERC20TokenRemoteUpgradeableMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldMinTeleporterVersion\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newMinTeleporterVersion\",\"type\":\"uint256\"}],\"name\":\"MinTeleporterVersionUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressUnpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensAndCallSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ERC20_TOKEN_REMOTE_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MULTI_HOP_CALL_GAS_PER_WORD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MULTI_HOP_CALL_REQUIRED_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MULTI_HOP_SEND_REQUIRED_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REGISTER_REMOTE_REQUIRED_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TELEPORTER_REGISTRY_APP_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_REMOTE_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"payloadSize\",\"type\":\"uint256\"}],\"name\":\"calculateNumWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getInitialReserveImbalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getIsCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinTeleporterVersion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMultiplyOnRemote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenHomeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenHomeBlockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenMultiplier\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"teleporterRegistryAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"teleporterManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minTeleporterVersion\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"tokenHomeBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"tokenHomeAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenHomeDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structTokenRemoteSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"isTeleporterAddressPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"pauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"originSenderAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"receiveTeleporterMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structTeleporterFeeInfo\",\"name\":\"feeInfo\",\"type\":\"tuple\"}],\"name\":\"registerWithHome\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"send\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sendAndCall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"unpauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"updateMinTeleporterVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506040516148ce3803806148ce83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147818061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061021e575f3560e01c806370a082311161012a578063b8a46d02116100b4578063dd62ed3e11610079578063dd62ed3e146104bd578063e0fd9cb8146104d0578063ef793e2a146104d8578063f2fde38b146104e0578063f3f981d8146104f3575f80fd5b8063b8a46d0214610474578063c3cd692714610487578063c868efaa1461048f578063c9fe4ddf146104a2578063d2cc7a70146104b5575f80fd5b80638da5cb5b116100fa5780638da5cb5b146103ee578063909a6ac01461043257806395d89b4114610446578063973142971461044e578063a9059cbb14610461575f80fd5b806370a08231146103a0578063715018a6146103d457806371717c18146103dc5780637ee3779a146103e6575f80fd5b8063313ce567116101ab5780635507f3d11161017b5780635507f3d1146103365780635d16225d146103405780635eb995141461035357806362431a6514610366578063656900381461038d575f80fd5b8063313ce567146102c057806335cac159146102f45780634213cf781461031b5780634511243e14610323575f80fd5b806315beb59f116101f157806315beb59f1461027d57806318160ddd1461028657806323b872dd1461028e578063254ac160146102a15780632b0d8f18146102ab575f80fd5b806302a30c7d1461022257806306fdde031461023f5780630733c8c814610254578063095ea7b31461026a575b5f80fd5b61022a610506565b60405190151581526020015b60405180910390f35b61024761051d565b60405161023691906136ec565b61025c6105dd565b604051908152602001610236565b61022a610278366004613722565b6105f1565b61025c6105dc81565b61025c61060a565b61022a61029c36600461374c565b610625565b61025c6201fbd081565b6102be6102b936600461378a565b61064a565b005b7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf626223005460405160ff9091168152602001610236565b61025c7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0081565b61025c61074c565b6102be61033136600461378a565b61075d565b61025c6205302081565b6102be61034e3660046137a5565b61084c565b6102be6103613660046137d4565b61085a565b61025c7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf6262230081565b6102be61039b3660046137eb565b61086e565b61025c6103ae36600461378a565b6001600160a01b03165f9081525f8051602061470c833981519152602052604090205490565b6102be610878565b61025c6205573081565b61022a61088b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610236565b61025c5f8051602061472c83398151915281565b6102476108a2565b61022a61045c36600461378a565b6108e0565b61022a61046f366004613722565b6108f9565b6102be610482366004613823565b610906565b61041a610acd565b6102be61049d366004613839565b610aea565b6102be6104b03660046139f3565b610ca7565b61025c610db9565b61025c6104cb366004613adc565b610dce565b61025c610e17565b61025c610e2b565b6102be6104ee36600461378a565b610e3f565b61025c6105013660046137d4565b610e79565b5f80610510610e8f565b6006015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f8051602061470c8339815191529161055b90613b13565b80601f016020809104026020016040519081016040528092919081815260200182805461058790613b13565b80156105d25780601f106105a9576101008083540402835291602001916105d2565b820191905f5260205f20905b8154815290600101906020018083116105b557829003601f168201915b505050505091505090565b5f806105e7610e8f565b6003015492915050565b5f336105fe818585610eb3565b60019150505b92915050565b5f805f8051602061470c8339815191525b6002015492915050565b5f33610632858285610ec5565b61063d858585610f22565b60019150505b9392505050565b5f8051602061472c833981519152610660610f7f565b6001600160a01b03821661068f5760405162461bcd60e51b815260040161068690613b45565b60405180910390fd5b6106998183610f87565b156106fc5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b6064820152608401610686565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b5f80610756610e8f565b5492915050565b5f8051602061472c833981519152610773610f7f565b6001600160a01b0382166107995760405162461bcd60e51b815260040161068690613b45565b6107a38183610f87565b6108015760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b6064820152608401610686565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b6108568282610fa8565b5050565b610862610f7f565b61086b81611030565b50565b61085682826111c8565b610880611250565b6108895f6112ab565b565b5f80610895610e8f565b6004015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f8051602061470c8339815191529161055b90613b13565b5f5f8051602061472c8339815191526106438184610f87565b5f336105fe818585610f22565b5f61090f610e8f565b6006810154909150610100900460ff161561096c5760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e52656d6f74653a20616c72656164792072656769737465726564006044820152606401610686565b604080516060808201835260058401548252600284015460ff600160a01b820481166020808601918252600160a81b9093048216858701908152865180880188525f808252885188518188015293518516848a01529151909316828601528651808303909501855260809091019095528082019290925291929091610a01906109f79087018761378a565b866020013561131b565b6040805160c0810182526001870154815260028701546001600160a01b031660208083019190915282518084018452939450610ac5939192830191908190610a4b908b018b61378a565b6001600160a01b0316815260209081018690529082526201fbd0908201526040015f5b604051908082528060200260200182016040528015610a97578160200160208202803683370190505b50815260200184604051602001610aae9190613ba7565b604051602081830303815290604052815250611363565b505050505050565b5f80610ad7610e8f565b600201546001600160a01b031692915050565b610af261147e565b5f5f8051602061472c83398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610b5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b819190613be9565b1015610be85760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b6064820152608401610686565b610bf28133610f87565b15610c585760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b6064820152608401610686565b610c98858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506114c892505050565b50610ca16116df565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ceb5750825b90505f826001600160401b03166001148015610d065750303b155b905081158015610d14575080155b15610d325760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610d5c57845460ff60401b1916600160401b1785555b610d6889898989611709565b8315610dae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b5f805f8051602061472c83398151915261061b565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f80610e21610e8f565b6001015492915050565b5f80610e35610e8f565b6005015492915050565b610e47611250565b6001600160a01b038116610e7057604051631e4fbdf760e01b81525f6004820152602401610686565b61086b816112ab565b5f6005610e8783601f613c14565b901c92915050565b7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090565b610ec08383836001611759565b505050565b5f610ed08484610dce565b90505f198114610ca15781811015610f1457604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610686565b610ca184848484035f611759565b6001600160a01b038316610f4b57604051634b637e8f60e11b81525f6004820152602401610686565b6001600160a01b038216610f745760405163ec442f0560e01b81525f6004820152602401610686565b610ec083838361183c565b610889611250565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75008054600114610fea5760405162461bcd60e51b815260040161068690613c27565b600281555f610ff7610e8f565b905061100284611975565b600181015484350361101d576110188484611a60565b611027565b6110278484611be4565b50600190555050565b5f8051602061472c83398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015611084573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a89190613be9565b60028301549091508184111561111a5760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b6064820152608401610686565b80841161118f5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e006064820152608401610686565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500805460011461120a5760405162461bcd60e51b815260040161068690613c27565b600281555f611217610e8f565b905061122284611daf565b600181015484350361123e576112388484611fe9565b50611248565b61123884846121f8565b600190555050565b336112827f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108895760405163118cdaa760e01b8152336004820152602401610686565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f815f0361132a57505f610604565b306001600160a01b0384160361135857611346335b3084610ec5565b611351333084610f22565b5080610604565b610643833384612494565b5f8061136d6125f7565b60408401516020015190915015611412576040830151516001600160a01b03166113ef5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b6064820152608401610686565b604083015160208101519051611412916001600160a01b039091169083906126e7565b604051630624488560e41b81526001600160a01b0382169063624488509061143e908690600401613c6b565b6020604051808303815f875af115801561145a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106439190613be9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016114c257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6114d1610e8f565b9050806001015484146115385760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20696e76616c696420736f7572636520626c6f636044820152681ad8da185a5b88125160ba1b6064820152608401610686565b60028101546001600160a01b038481169116146115aa5760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a20696e76616c6964206f726967696e2073656e646044820152696572206164647265737360b01b6064820152608401610686565b5f828060200190518101906115bf9190613d64565b6006830154909150610100900460ff1615806115e05750600682015460ff16155b156115f75760068201805461ffff19166101011790555b60018151600481111561160c5761160c613b93565b03611643575f816020015180602001905181019061162a9190613dec565b905061163d815f0151826020015161276e565b506116d8565b60028151600481111561165857611658613b93565b03611686575f81602001518060200190518101906116769190613e24565b905061163d8182608001516127bb565b60405162461bcd60e51b815260206004820152602160248201527f546f6b656e52656d6f74653a20696e76616c6964206d657373616765207479706044820152606560f81b6064820152608401610686565b5050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b611711612914565b61171b838361295d565b611726845f8361296f565b7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf62622300805460ff191660ff8316179055610ca1565b5f8051602061470c8339815191526001600160a01b0385166117905760405163e602df0560e01b81525f6004820152602401610686565b6001600160a01b0384166117b957604051634a1406b160e11b81525f6004820152602401610686565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156116d857836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161182d91815260200190565b60405180910390a35050505050565b5f8051602061470c8339815191526001600160a01b0384166118765781816002015f82825461186b9190613c14565b909155506118e69050565b6001600160a01b0384165f90815260208290526040902054828110156118c85760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401610686565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611904576002810180548390039055611922565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161196791815260200190565b60405180910390a350505050565b5f611986606083016040840161378a565b6001600160a01b0316036119e85760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e74206164647260448201526265737360e81b6064820152608401610686565b5f8160c0013511611a0b5760405162461bcd60e51b815260040161068690613eee565b8035611a295760405162461bcd60e51b815260040161068690613f32565b5f611a3a604083016020840161378a565b6001600160a01b03160361086b5760405162461bcd60e51b815260040161068690613f7d565b5f611a69610e8f565b9050611a99611a7e604085016020860161378a565b60a0850135611a94610100870160e0880161378a565b6129a0565b5f611abd83611aae608087016060880161378a565b86608001358760a00135612a9d565b6040805180820190915291945091505f9080600181526020016040518060400160405280886040016020810190611af4919061378a565b6001600160a01b0316815260200187815250604051602001611b169190613fda565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92611b969282019080611b6e60808c0160608d0161378a565b6001600160a01b03168152602090810188905290825260c08a0135908201526040015f610a6e565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb528888604051611bd4929190613ffa565b60405180910390a3505050505050565b5f611bed610e8f565b9050611c1a8335611c04604086016020870161378a565b611c15610100870160e0880161378a565b612b60565b5f611c2f83611aae608087016060880161378a565b60408051808201825260038152815160e081018352883581529396509193505f9260208084019282820191611c68918b01908b0161378a565b6001600160a01b03168152602001611c8660608a0160408b0161378a565b6001600160a01b031681526020810188905260a0890135604082015260c08901356060820152608001611cc06101008a0160e08b0161378a565b6001600160a01b03169052604051611d309190602001815181526020808301516001600160a01b0390811691830191909152604080840151821690830152606080840151908301526080808401519083015260a0808401519083015260c092830151169181019190915260e00190565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92611b969282019080611d8860808c0160608d0161378a565b6001600160a01b03168152602090810188905290825262053020908201526040015f610a6e565b8035611dcd5760405162461bcd60e51b815260040161068690613f32565b5f611dde604083016020840161378a565b6001600160a01b031603611e045760405162461bcd60e51b815260040161068690613f7d565b5f611e15606083016040840161378a565b6001600160a01b031603611e805760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420636f6e7460448201526b72616374206164647265737360a01b6064820152608401610686565b5f816080013511611ea35760405162461bcd60e51b815260040161068690613eee565b5f8160a0013511611f045760405162461bcd60e51b815260206004820152602560248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420676173206044820152641b1a5b5a5d60da1b6064820152608401610686565b80608001358160a0013510611f6c5760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a20696e76616c696420726563697069656e742067604482015267185cc81b1a5b5a5d60c21b6064820152608401610686565b5f611f7e610100830160e0840161378a565b6001600160a01b03160361086b5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f2066616c6c6261636b20726563697060448201526b69656e74206164647265737360a01b6064820152608401610686565b5f611ff2610e8f565b905061201d612007604085016020860161378a565b610140850135611a9460e0870160c0880161378a565b5f612045836120346101208701610100880161378a565b866101200135876101400135612a9d565b6040805180820190915291945091505f908060028152602001604051806101000160405280865f01548152602001306001600160a01b031681526020016120893390565b6001600160a01b031681526020016120a760608a0160408b0161378a565b6001600160a01b03168152602081018890526040016120c960608a018a614099565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a0890135602082015260400161211d6101008a0160e08b0161378a565b6001600160a01b0316905260405161213891906020016140db565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f926121ba92820190806121926101208c016101008d0161378a565b6001600160a01b03168152602090810188905290825260808a0135908201526040015f610a6e565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168888604051611bd49291906141e2565b5f612201610e8f565b90506122288335612218604086016020870161378a565b611c1560e0870160c0880161378a565b5f61223f836120346101208701610100880161378a565b6040805180820190915291945091505f90806004815260200160405180610160016040528061226b3390565b6001600160a01b03168152602001885f01358152602001886020016020810190612295919061378a565b6001600160a01b031681526020016122b360608a0160408b0161378a565b6001600160a01b03168152602081018890526040016122d560608a018a614099565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a089013560208201526040016123296101008a0160e08b0161378a565b6001600160a01b031681526080890135602082015260400161235160e08a0160c08b0161378a565b6001600160a01b031681526101408901356020918201526040516123769291016142f0565b60408051601f19818403018152919052905290505f6105dc6123a561239e6060890189614099565b9050610e79565b6123af91906143cd565b6123bc9062055730613c14565b6040805160c0810182526001870154815260028701546001600160a01b03166020820152815180830183529293505f9261244592820190806124066101208d016101008e0161378a565b6001600160a01b031681526020908101899052908252818101869052604080515f815280830182528184015251606090920191610aae91889101613ba7565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b1689896040516124839291906141e2565b60405180910390a350505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa1580156124da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fe9190613be9565b90506125156001600160a01b038616853086612bfe565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612559573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061257d9190613be9565b90508181116125e35760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610686565b6125ed82826143e4565b9695505050505050565b5f8051602061472c83398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612651573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267591906143f7565b90506126818282610f87565b156106045760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b6064820152608401610686565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612734573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127589190613be9565b9050610ca184846127698585613c14565b612c65565b816001600160a01b03167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040516127a991815260200190565b60405180910390a26108568282612cf4565b6127c53082612cf4565b6127d430836060015183610eb3565b5f825f01518360200151846040015130858760a001516040516024016127ff96959493929190614412565b60408051601f198184030181529190526020810180516001600160e01b03166394395edd60e01b17905260c084015160608501519192505f91612843919084612d28565b90505f612854308660600151610dce565b90506128653086606001515f610eb3565b81156128b75784606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff4856040516128aa91815260200190565b60405180910390a26128ff565b84606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb0856040516128f691815260200190565b60405180910390a25b80156116d8576116d8308660e0015183610f22565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661088957604051631afcd79f60e31b815260040160405180910390fd5b612965612914565b6108568282612d3d565b612977612914565b61298d835f015184602001518560400151612d8d565b612995612da8565b610ec0838383612db8565b5f6129a9610e8f565b60028101549091506001600160a01b038581169116146129db5760405162461bcd60e51b815260040161068690614452565b8215612a355760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f207365636f6e646172792060448201526266656560e81b6064820152608401610686565b6001600160a01b03821615610ca15760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f206d756c74692d686f702060448201526766616c6c6261636b60c01b6064820152608401610686565b5f805f612aa8610e8f565b9050612ab3876130dc565b9650612abf868661131b565b60038201546004830154919650612ad99160ff16866130f4565b60038201546004830154612af1919060ff168a6130f4565b11612b535760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a20696e73756666696369656e7420746f6b656e7360448201526b103a37903a3930b739b332b960a11b6064820152608401610686565b5094959294509192505050565b5f612b69610e8f565b80549091508403612b9c57306001600160a01b03841603612b9c5760405162461bcd60e51b815260040161068690614452565b6001600160a01b038216610ca15760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f206d756c74692d686f702066616c6c6044820152636261636b60e01b6064820152608401610686565b6040516001600160a01b038481166024830152838116604483015260648201839052610ca19186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613101565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612cb68482613162565b610ca1576040516001600160a01b0384811660248301525f6044830152612cea91869182169063095ea7b390606401612c33565b610ca18482613101565b6001600160a01b038216612d1d5760405163ec442f0560e01b81525f6004820152602401610686565b6108565f838361183c565b5f612d35845f8585613203565b949350505050565b612d45612914565b5f8051602061470c8339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03612d7e84826144f3565b5060048101610ca183826144f3565b612d95612914565b612d9f83826132d3565b610ec0826132f5565b612db0612914565b610889613306565b612dc0612914565b5f612dc9610e8f565b90506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e329190613be9565b81556060840151612e985760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b6064820152608401610686565b8054606085015103612f125760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d6500000000006064820152608401610686565b60808401516001600160a01b0316612f785760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b6064820152608401610686565b60128460a0015160ff161115612fe25760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b6064820152608401610686565b60128260ff1611156130425760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b6064820152608401610686565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b918616919091021790556130be908361332d565b60048301805460ff1916911515919091179055600390910155505050565b5f6130e63361133f565b6130f03383613377565b5090565b5f612d358484845f6133ab565b5f6131156001600160a01b038416836133d2565b905080515f1415801561313957508080602001905181019061313791906145ae565b155b15610ec057604051635274afe760e01b81526001600160a01b0384166004820152602401610686565b5f805f846001600160a01b03168460405161317d91906145cd565b5f604051808303815f865af19150503d805f81146131b6576040519150601f19603f3d011682016040523d82523d5f602084013e6131bb565b606091505b50915091508180156131e55750805115806131e55750808060200190518101906131e591906145ae565b80156131fa57505f856001600160a01b03163b115b95945050505050565b5f845a10156132545760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e742067617300000000006044820152606401610686565b834710156132a45760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c75650000006044820152606401610686565b826001600160a01b03163b5f036132bc57505f612d35565b5f805f84516020860188888bf19695505050505050565b6132db612914565b6132e36133df565b6132eb6133ef565b61085682826133f7565b6132fd612914565b61086b8161357b565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500611702565b5f8060ff8085169084161181816133505761334885876145e8565b60ff1661335e565b61335a86866145e8565b60ff165b61336990600a6146e1565b9350909150505b9250929050565b6001600160a01b0382166133a057604051634b637e8f60e11b81525f6004820152602401610686565b610856825f8361183c565b5f811515841515036133c8576133c185846143cd565b9050612d35565b6131fa85846146ec565b606061064383835f613583565b6133e7612914565b610889613612565b610889612914565b6133ff612914565b6001600160a01b03821661347b5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f7274657220726567697374727920616464726573730000000000000000006064820152608401610686565b5f5f8051602061472c83398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134f19190613be9565b116135595760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b6064820152608401610686565b81546001600160a01b0319166001600160a01b038216178255610ca183611030565b610e47612914565b6060814710156135a85760405163cd78605960e01b8152306004820152602401610686565b5f80856001600160a01b031684866040516135c391906145cd565b5f6040518083038185875af1925050503d805f81146135fd576040519150601f19603f3d011682016040523d82523d5f602084013e613602565b606091505b50915091506125ed86838361361a565b6116df612914565b60608261362f5761362a82613676565b610643565b815115801561364657506001600160a01b0384163b155b1561366f57604051639996b31560e01b81526001600160a01b0385166004820152602401610686565b5080610643565b8051156136865780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f5b838110156136b95781810151838201526020016136a1565b50505f910152565b5f81518084526136d881602086016020860161369f565b601f01601f19169290920160200192915050565b602081525f61064360208301846136c1565b6001600160a01b038116811461086b575f80fd5b803561371d816136fe565b919050565b5f8060408385031215613733575f80fd5b823561373e816136fe565b946020939093013593505050565b5f805f6060848603121561375e575f80fd5b8335613769816136fe565b92506020840135613779816136fe565b929592945050506040919091013590565b5f6020828403121561379a575f80fd5b8135610643816136fe565b5f808284036101208112156137b8575f80fd5b610100808212156137c7575f80fd5b9395938601359450505050565b5f602082840312156137e4575f80fd5b5035919050565b5f80604083850312156137fc575f80fd5b82356001600160401b03811115613811575f80fd5b8301610160818603121561373e575f80fd5b5f60408284031215613833575f80fd5b50919050565b5f805f806060858703121561384c575f80fd5b84359350602085013561385e816136fe565b925060408501356001600160401b0380821115613879575f80fd5b818701915087601f83011261388c575f80fd5b81358181111561389a575f80fd5b8860208285010111156138ab575f80fd5b95989497505060200194505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b03811182821017156138f0576138f06138ba565b60405290565b604080519081016001600160401b03811182821017156138f0576138f06138ba565b60405161010081016001600160401b03811182821017156138f0576138f06138ba565b604051601f8201601f191681016001600160401b0381118282101715613963576139636138ba565b604052919050565b803560ff8116811461371d575f80fd5b5f6001600160401b03821115613993576139936138ba565b50601f01601f191660200190565b5f82601f8301126139b0575f80fd5b81356139c36139be8261397b565b61393b565b8181528460208386010111156139d7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80848603610120811215613a08575f80fd5b60c0811215613a15575f80fd5b50613a1e6138ce565b8535613a29816136fe565b81526020860135613a39816136fe565b8060208301525060408601356040820152606086013560608201526080860135613a62816136fe565b6080820152613a7360a0870161396b565b60a0820152935060c08501356001600160401b0380821115613a93575f80fd5b613a9f888389016139a1565b945060e0870135915080821115613ab4575f80fd5b50613ac1878288016139a1565b925050613ad1610100860161396b565b905092959194509250565b5f8060408385031215613aed575f80fd5b8235613af8816136fe565b91506020830135613b08816136fe565b809150509250929050565b600181811c90821680613b2757607f821691505b60208210810361383357634e487b7160e01b5f52602260045260245ffd5b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b602081525f825160058110613bca57634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612d3560608401826136c1565b5f60208284031215613bf9575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561060457610604613c00565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b80841015613cf857845183168252938501936001939093019290850190613cd6565b5060a0880151878203601f190160e08901529450613d1681866136c1565b98975050505050505050565b5f82601f830112613d31575f80fd5b8151613d3f6139be8261397b565b818152846020838601011115613d53575f80fd5b612d3582602083016020870161369f565b5f60208284031215613d74575f80fd5b81516001600160401b0380821115613d8a575f80fd5b9083019060408286031215613d9d575f80fd5b613da56138f6565b825160058110613db3575f80fd5b8152602083015182811115613dc6575f80fd5b613dd287828601613d22565b60208301525095945050505050565b805161371d816136fe565b5f60408284031215613dfc575f80fd5b613e046138f6565b8251613e0f816136fe565b81526020928301519281019290925250919050565b5f60208284031215613e34575f80fd5b81516001600160401b0380821115613e4a575f80fd5b908301906101008286031215613e5e575f80fd5b613e66613918565b82518152613e7660208401613de1565b6020820152613e8760408401613de1565b6040820152613e9860608401613de1565b60608201526080830151608082015260a083015182811115613eb8575f80fd5b613ec487828601613d22565b60a08301525060c083015160c0820152613ee060e08401613de1565b60e082015295945050505050565b60208082526024908201527f546f6b656e52656d6f74653a207a65726f20726571756972656420676173206c6040820152631a5b5a5d60e21b606082015260800190565b6020808252602b908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20626c60408201526a1bd8dad8da185a5b88125160aa1b606082015260800190565b60208082526037908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20746f60408201527f6b656e207472616e736665727265722061646472657373000000000000000000606082015260800190565b81516001600160a01b031681526020808301519082015260408101610604565b8235815261012081016020840135614011816136fe565b6001600160a01b039081166020840152604085013590614030826136fe565b16604083015261404260608501613712565b6001600160a01b0381166060840152506080840135608083015260a084013560a083015260c084013560c083015261407c60e08501613712565b6001600160a01b031660e083015261010090910191909152919050565b5f808335601e198436030181126140ae575f80fd5b8301803591506001600160401b038211156140c7575f80fd5b602001915036819003821315613370575f80fd5b60208152815160208201525f602083015160018060a01b0380821660408501528060408601511660608501525050606083015161412360808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c085015261414a6101208501836136c1565b915060c085015160e085015260e085015161416f828601826001600160a01b03169052565b5090949350505050565b5f808335601e1984360301811261418e575f80fd5b83016020810192503590506001600160401b038111156141ac575f80fd5b803603821315613370575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60408152823560408201525f6141fa60208501613712565b6001600160a01b0316606083015261421460408501613712565b6001600160a01b0316608083015261422f6060850185614179565b6101608060a08601526142476101a0860183856141ba565b9250608087013560c086015260a087013560e086015261426960c08801613712565b9150610100614282818701846001600160a01b03169052565b61428e60e08901613712565b92506101206142a7818801856001600160a01b03169052565b6142b2828a01613712565b935061014091506142cd828801856001600160a01b03169052565b880135918601919091529095013561018084015260209092019290925292915050565b6020815261430a6020820183516001600160a01b03169052565b602082015160408201525f604083015161432f60608401826001600160a01b03169052565b5060608301516001600160a01b038116608084015250608083015160a083015260a08301516101608060c085015261436b6101808501836136c1565b915060c085015160e085015260e0850151610100614393818701836001600160a01b03169052565b8601516101208681019190915286015190506101406143bc818701836001600160a01b03169052565b959095015193019290925250919050565b808202811582820484141761060457610604613c00565b8181038181111561060457610604613c00565b5f60208284031215614407575f80fd5b8151610643816136fe565b8681526001600160a01b0386811660208301528581166040830152841660608201526080810183905260c060a082018190525f90613d16908301846136c1565b6020808252603a908201527f546f6b656e52656d6f74653a20696e76616c69642064657374696e6174696f6e60408201527f20746f6b656e207472616e736665727265722061646472657373000000000000606082015260800190565b601f821115610ec057805f5260205f20601f840160051c810160208510156144d45750805b601f840160051c820191505b818110156116d8575f81556001016144e0565b81516001600160401b0381111561450c5761450c6138ba565b6145208161451a8454613b13565b846144af565b602080601f831160018114614553575f841561453c5750858301515b5f19600386901b1c1916600185901b178555610ac5565b5f85815260208120601f198616915b8281101561458157888601518255948401946001909101908401614562565b508582101561459e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156145be575f80fd5b81518015158114610643575f80fd5b5f82516145de81846020870161369f565b9190910192915050565b60ff828116828216039081111561060457610604613c00565b600181815b8085111561463b57815f190482111561462157614621613c00565b8085161561462e57918102915b93841c9390800290614606565b509250929050565b5f8261465157506001610604565b8161465d57505f610604565b8160018114614673576002811461467d57614699565b6001915050610604565b60ff84111561468e5761468e613c00565b50506001821b610604565b5060208310610133831016604e8410600b84101617156146bc575081810a610604565b6146c68383614601565b805f19048211156146d9576146d9613c00565b029392505050565b5f6106438383614643565b5f8261470657634e487b7160e01b5f52601260045260245ffd5b50049056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a26469706673582212202b6216f43f3d42931e6ecf56a1c1eed99a85b67393e179aa3664885042bc87d364736f6c63430008190033", + Bin: "0x608060405234801561000f575f80fd5b506040516148ce3803806148ce83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147818061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061021e575f3560e01c806370a082311161012a578063b8a46d02116100b4578063dd62ed3e11610079578063dd62ed3e146104bd578063e0fd9cb8146104d0578063ef793e2a146104d8578063f2fde38b146104e0578063f3f981d8146104f3575f80fd5b8063b8a46d0214610474578063c3cd692714610487578063c868efaa1461048f578063c9fe4ddf146104a2578063d2cc7a70146104b5575f80fd5b80638da5cb5b116100fa5780638da5cb5b146103ee578063909a6ac01461043257806395d89b4114610446578063973142971461044e578063a9059cbb14610461575f80fd5b806370a08231146103a0578063715018a6146103d457806371717c18146103dc5780637ee3779a146103e6575f80fd5b8063313ce567116101ab5780635507f3d11161017b5780635507f3d1146103365780635d16225d146103405780635eb995141461035357806362431a6514610366578063656900381461038d575f80fd5b8063313ce567146102c057806335cac159146102f45780634213cf781461031b5780634511243e14610323575f80fd5b806315beb59f116101f157806315beb59f1461027d57806318160ddd1461028657806323b872dd1461028e578063254ac160146102a15780632b0d8f18146102ab575f80fd5b806302a30c7d1461022257806306fdde031461023f5780630733c8c814610254578063095ea7b31461026a575b5f80fd5b61022a610506565b60405190151581526020015b60405180910390f35b61024761051d565b60405161023691906136ec565b61025c6105dd565b604051908152602001610236565b61022a610278366004613722565b6105f1565b61025c6105dc81565b61025c61060a565b61022a61029c36600461374c565b610625565b61025c6201fbd081565b6102be6102b936600461378a565b61064a565b005b7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf626223005460405160ff9091168152602001610236565b61025c7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0081565b61025c61074c565b6102be61033136600461378a565b61075d565b61025c6205302081565b6102be61034e3660046137a5565b61084c565b6102be6103613660046137d4565b61085a565b61025c7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf6262230081565b6102be61039b3660046137eb565b61086e565b61025c6103ae36600461378a565b6001600160a01b03165f9081525f8051602061470c833981519152602052604090205490565b6102be610878565b61025c6205573081565b61022a61088b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610236565b61025c5f8051602061472c83398151915281565b6102476108a2565b61022a61045c36600461378a565b6108e0565b61022a61046f366004613722565b6108f9565b6102be610482366004613823565b610906565b61041a610acd565b6102be61049d366004613839565b610aea565b6102be6104b03660046139f3565b610ca7565b61025c610db9565b61025c6104cb366004613adc565b610dce565b61025c610e17565b61025c610e2b565b6102be6104ee36600461378a565b610e3f565b61025c6105013660046137d4565b610e79565b5f80610510610e8f565b6006015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f8051602061470c8339815191529161055b90613b13565b80601f016020809104026020016040519081016040528092919081815260200182805461058790613b13565b80156105d25780601f106105a9576101008083540402835291602001916105d2565b820191905f5260205f20905b8154815290600101906020018083116105b557829003601f168201915b505050505091505090565b5f806105e7610e8f565b6003015492915050565b5f336105fe818585610eb3565b60019150505b92915050565b5f805f8051602061470c8339815191525b6002015492915050565b5f33610632858285610ec5565b61063d858585610f22565b60019150505b9392505050565b5f8051602061472c833981519152610660610f7f565b6001600160a01b03821661068f5760405162461bcd60e51b815260040161068690613b45565b60405180910390fd5b6106998183610f87565b156106fc5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b6064820152608401610686565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b5f80610756610e8f565b5492915050565b5f8051602061472c833981519152610773610f7f565b6001600160a01b0382166107995760405162461bcd60e51b815260040161068690613b45565b6107a38183610f87565b6108015760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b6064820152608401610686565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b6108568282610fa8565b5050565b610862610f7f565b61086b81611030565b50565b61085682826111c8565b610880611250565b6108895f6112ab565b565b5f80610895610e8f565b6004015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f8051602061470c8339815191529161055b90613b13565b5f5f8051602061472c8339815191526106438184610f87565b5f336105fe818585610f22565b5f61090f610e8f565b6006810154909150610100900460ff161561096c5760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e52656d6f74653a20616c72656164792072656769737465726564006044820152606401610686565b604080516060808201835260058401548252600284015460ff600160a01b820481166020808601918252600160a81b9093048216858701908152865180880188525f808252885188518188015293518516848a01529151909316828601528651808303909501855260809091019095528082019290925291929091610a01906109f79087018761378a565b866020013561131b565b6040805160c0810182526001870154815260028701546001600160a01b031660208083019190915282518084018452939450610ac5939192830191908190610a4b908b018b61378a565b6001600160a01b0316815260209081018690529082526201fbd0908201526040015f5b604051908082528060200260200182016040528015610a97578160200160208202803683370190505b50815260200184604051602001610aae9190613ba7565b604051602081830303815290604052815250611363565b505050505050565b5f80610ad7610e8f565b600201546001600160a01b031692915050565b610af261147e565b5f5f8051602061472c83398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610b5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b819190613be9565b1015610be85760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b6064820152608401610686565b610bf28133610f87565b15610c585760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b6064820152608401610686565b610c98858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506114c892505050565b50610ca16116df565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ceb5750825b90505f826001600160401b03166001148015610d065750303b155b905081158015610d14575080155b15610d325760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610d5c57845460ff60401b1916600160401b1785555b610d6889898989611709565b8315610dae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b5f805f8051602061472c83398151915261061b565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f80610e21610e8f565b6001015492915050565b5f80610e35610e8f565b6005015492915050565b610e47611250565b6001600160a01b038116610e7057604051631e4fbdf760e01b81525f6004820152602401610686565b61086b816112ab565b5f6005610e8783601f613c14565b901c92915050565b7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090565b610ec08383836001611759565b505050565b5f610ed08484610dce565b90505f198114610ca15781811015610f1457604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610686565b610ca184848484035f611759565b6001600160a01b038316610f4b57604051634b637e8f60e11b81525f6004820152602401610686565b6001600160a01b038216610f745760405163ec442f0560e01b81525f6004820152602401610686565b610ec083838361183c565b610889611250565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75008054600114610fea5760405162461bcd60e51b815260040161068690613c27565b600281555f610ff7610e8f565b905061100284611975565b600181015484350361101d576110188484611a60565b611027565b6110278484611be4565b50600190555050565b5f8051602061472c83398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015611084573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a89190613be9565b60028301549091508184111561111a5760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b6064820152608401610686565b80841161118f5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e006064820152608401610686565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500805460011461120a5760405162461bcd60e51b815260040161068690613c27565b600281555f611217610e8f565b905061122284611daf565b600181015484350361123e576112388484611fe9565b50611248565b61123884846121f8565b600190555050565b336112827f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108895760405163118cdaa760e01b8152336004820152602401610686565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f815f0361132a57505f610604565b306001600160a01b0384160361135857611346335b3084610ec5565b611351333084610f22565b5080610604565b610643833384612494565b5f8061136d6125f7565b60408401516020015190915015611412576040830151516001600160a01b03166113ef5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b6064820152608401610686565b604083015160208101519051611412916001600160a01b039091169083906126e7565b604051630624488560e41b81526001600160a01b0382169063624488509061143e908690600401613c6b565b6020604051808303815f875af115801561145a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106439190613be9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016114c257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6114d1610e8f565b9050806001015484146115385760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20696e76616c696420736f7572636520626c6f636044820152681ad8da185a5b88125160ba1b6064820152608401610686565b60028101546001600160a01b038481169116146115aa5760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a20696e76616c6964206f726967696e2073656e646044820152696572206164647265737360b01b6064820152608401610686565b5f828060200190518101906115bf9190613d64565b6006830154909150610100900460ff1615806115e05750600682015460ff16155b156115f75760068201805461ffff19166101011790555b60018151600481111561160c5761160c613b93565b03611643575f816020015180602001905181019061162a9190613dec565b905061163d815f0151826020015161276e565b506116d8565b60028151600481111561165857611658613b93565b03611686575f81602001518060200190518101906116769190613e24565b905061163d8182608001516127bb565b60405162461bcd60e51b815260206004820152602160248201527f546f6b656e52656d6f74653a20696e76616c6964206d657373616765207479706044820152606560f81b6064820152608401610686565b5050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b611711612914565b61171b838361295d565b611726845f8361296f565b7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf62622300805460ff191660ff8316179055610ca1565b5f8051602061470c8339815191526001600160a01b0385166117905760405163e602df0560e01b81525f6004820152602401610686565b6001600160a01b0384166117b957604051634a1406b160e11b81525f6004820152602401610686565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156116d857836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161182d91815260200190565b60405180910390a35050505050565b5f8051602061470c8339815191526001600160a01b0384166118765781816002015f82825461186b9190613c14565b909155506118e69050565b6001600160a01b0384165f90815260208290526040902054828110156118c85760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401610686565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611904576002810180548390039055611922565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161196791815260200190565b60405180910390a350505050565b5f611986606083016040840161378a565b6001600160a01b0316036119e85760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e74206164647260448201526265737360e81b6064820152608401610686565b5f8160c0013511611a0b5760405162461bcd60e51b815260040161068690613eee565b8035611a295760405162461bcd60e51b815260040161068690613f32565b5f611a3a604083016020840161378a565b6001600160a01b03160361086b5760405162461bcd60e51b815260040161068690613f7d565b5f611a69610e8f565b9050611a99611a7e604085016020860161378a565b60a0850135611a94610100870160e0880161378a565b6129a0565b5f611abd83611aae608087016060880161378a565b86608001358760a00135612a9d565b6040805180820190915291945091505f9080600181526020016040518060400160405280886040016020810190611af4919061378a565b6001600160a01b0316815260200187815250604051602001611b169190613fda565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92611b969282019080611b6e60808c0160608d0161378a565b6001600160a01b03168152602090810188905290825260c08a0135908201526040015f610a6e565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb528888604051611bd4929190613ffa565b60405180910390a3505050505050565b5f611bed610e8f565b9050611c1a8335611c04604086016020870161378a565b611c15610100870160e0880161378a565b612b60565b5f611c2f83611aae608087016060880161378a565b60408051808201825260038152815160e081018352883581529396509193505f9260208084019282820191611c68918b01908b0161378a565b6001600160a01b03168152602001611c8660608a0160408b0161378a565b6001600160a01b031681526020810188905260a0890135604082015260c08901356060820152608001611cc06101008a0160e08b0161378a565b6001600160a01b03169052604051611d309190602001815181526020808301516001600160a01b0390811691830191909152604080840151821690830152606080840151908301526080808401519083015260a0808401519083015260c092830151169181019190915260e00190565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92611b969282019080611d8860808c0160608d0161378a565b6001600160a01b03168152602090810188905290825262053020908201526040015f610a6e565b8035611dcd5760405162461bcd60e51b815260040161068690613f32565b5f611dde604083016020840161378a565b6001600160a01b031603611e045760405162461bcd60e51b815260040161068690613f7d565b5f611e15606083016040840161378a565b6001600160a01b031603611e805760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420636f6e7460448201526b72616374206164647265737360a01b6064820152608401610686565b5f816080013511611ea35760405162461bcd60e51b815260040161068690613eee565b5f8160a0013511611f045760405162461bcd60e51b815260206004820152602560248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420676173206044820152641b1a5b5a5d60da1b6064820152608401610686565b80608001358160a0013510611f6c5760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a20696e76616c696420726563697069656e742067604482015267185cc81b1a5b5a5d60c21b6064820152608401610686565b5f611f7e610100830160e0840161378a565b6001600160a01b03160361086b5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f2066616c6c6261636b20726563697060448201526b69656e74206164647265737360a01b6064820152608401610686565b5f611ff2610e8f565b905061201d612007604085016020860161378a565b610140850135611a9460e0870160c0880161378a565b5f612045836120346101208701610100880161378a565b866101200135876101400135612a9d565b6040805180820190915291945091505f908060028152602001604051806101000160405280865f01548152602001306001600160a01b031681526020016120893390565b6001600160a01b031681526020016120a760608a0160408b0161378a565b6001600160a01b03168152602081018890526040016120c960608a018a614099565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a0890135602082015260400161211d6101008a0160e08b0161378a565b6001600160a01b0316905260405161213891906020016140db565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f926121ba92820190806121926101208c016101008d0161378a565b6001600160a01b03168152602090810188905290825260808a0135908201526040015f610a6e565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168888604051611bd49291906141e2565b5f612201610e8f565b90506122288335612218604086016020870161378a565b611c1560e0870160c0880161378a565b5f61223f836120346101208701610100880161378a565b6040805180820190915291945091505f90806004815260200160405180610160016040528061226b3390565b6001600160a01b03168152602001885f01358152602001886020016020810190612295919061378a565b6001600160a01b031681526020016122b360608a0160408b0161378a565b6001600160a01b03168152602081018890526040016122d560608a018a614099565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a089013560208201526040016123296101008a0160e08b0161378a565b6001600160a01b031681526080890135602082015260400161235160e08a0160c08b0161378a565b6001600160a01b031681526101408901356020918201526040516123769291016142f0565b60408051601f19818403018152919052905290505f6105dc6123a561239e6060890189614099565b9050610e79565b6123af91906143cd565b6123bc9062055730613c14565b6040805160c0810182526001870154815260028701546001600160a01b03166020820152815180830183529293505f9261244592820190806124066101208d016101008e0161378a565b6001600160a01b031681526020908101899052908252818101869052604080515f815280830182528184015251606090920191610aae91889101613ba7565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b1689896040516124839291906141e2565b60405180910390a350505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa1580156124da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fe9190613be9565b90506125156001600160a01b038616853086612bfe565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612559573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061257d9190613be9565b90508181116125e35760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610686565b6125ed82826143e4565b9695505050505050565b5f8051602061472c83398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612651573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267591906143f7565b90506126818282610f87565b156106045760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b6064820152608401610686565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612734573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127589190613be9565b9050610ca184846127698585613c14565b612c65565b816001600160a01b03167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040516127a991815260200190565b60405180910390a26108568282612cf4565b6127c53082612cf4565b6127d430836060015183610eb3565b5f825f01518360200151846040015130858760a001516040516024016127ff96959493929190614412565b60408051601f198184030181529190526020810180516001600160e01b03166394395edd60e01b17905260c084015160608501519192505f91612843919084612d28565b90505f612854308660600151610dce565b90506128653086606001515f610eb3565b81156128b75784606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff4856040516128aa91815260200190565b60405180910390a26128ff565b84606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb0856040516128f691815260200190565b60405180910390a25b80156116d8576116d8308660e0015183610f22565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661088957604051631afcd79f60e31b815260040160405180910390fd5b612965612914565b6108568282612d3d565b612977612914565b61298d835f015184602001518560400151612d8d565b612995612da8565b610ec0838383612db8565b5f6129a9610e8f565b60028101549091506001600160a01b038581169116146129db5760405162461bcd60e51b815260040161068690614452565b8215612a355760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f207365636f6e646172792060448201526266656560e81b6064820152608401610686565b6001600160a01b03821615610ca15760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f206d756c74692d686f702060448201526766616c6c6261636b60c01b6064820152608401610686565b5f805f612aa8610e8f565b9050612ab3876130dc565b9650612abf868661131b565b60038201546004830154919650612ad99160ff16866130f4565b60038201546004830154612af1919060ff168a6130f4565b11612b535760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a20696e73756666696369656e7420746f6b656e7360448201526b103a37903a3930b739b332b960a11b6064820152608401610686565b5094959294509192505050565b5f612b69610e8f565b80549091508403612b9c57306001600160a01b03841603612b9c5760405162461bcd60e51b815260040161068690614452565b6001600160a01b038216610ca15760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f206d756c74692d686f702066616c6c6044820152636261636b60e01b6064820152608401610686565b6040516001600160a01b038481166024830152838116604483015260648201839052610ca19186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613101565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612cb68482613162565b610ca1576040516001600160a01b0384811660248301525f6044830152612cea91869182169063095ea7b390606401612c33565b610ca18482613101565b6001600160a01b038216612d1d5760405163ec442f0560e01b81525f6004820152602401610686565b6108565f838361183c565b5f612d35845f8585613203565b949350505050565b612d45612914565b5f8051602061470c8339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03612d7e84826144f3565b5060048101610ca183826144f3565b612d95612914565b612d9f83826132d3565b610ec0826132f5565b612db0612914565b610889613306565b612dc0612914565b5f612dc9610e8f565b90506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e329190613be9565b81556060840151612e985760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b6064820152608401610686565b8054606085015103612f125760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d6500000000006064820152608401610686565b60808401516001600160a01b0316612f785760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b6064820152608401610686565b60128460a0015160ff161115612fe25760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b6064820152608401610686565b60128260ff1611156130425760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b6064820152608401610686565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b918616919091021790556130be908361332d565b60048301805460ff1916911515919091179055600390910155505050565b5f6130e63361133f565b6130f03383613377565b5090565b5f612d358484845f6133ab565b5f6131156001600160a01b038416836133d2565b905080515f1415801561313957508080602001905181019061313791906145ae565b155b15610ec057604051635274afe760e01b81526001600160a01b0384166004820152602401610686565b5f805f846001600160a01b03168460405161317d91906145cd565b5f604051808303815f865af19150503d805f81146131b6576040519150601f19603f3d011682016040523d82523d5f602084013e6131bb565b606091505b50915091508180156131e55750805115806131e55750808060200190518101906131e591906145ae565b80156131fa57505f856001600160a01b03163b115b95945050505050565b5f845a10156132545760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e742067617300000000006044820152606401610686565b834710156132a45760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c75650000006044820152606401610686565b826001600160a01b03163b5f036132bc57505f612d35565b5f805f84516020860188888bf19695505050505050565b6132db612914565b6132e36133df565b6132eb6133ef565b61085682826133f7565b6132fd612914565b61086b8161357b565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500611702565b5f8060ff8085169084161181816133505761334885876145e8565b60ff1661335e565b61335a86866145e8565b60ff165b61336990600a6146e1565b9350909150505b9250929050565b6001600160a01b0382166133a057604051634b637e8f60e11b81525f6004820152602401610686565b610856825f8361183c565b5f811515841515036133c8576133c185846143cd565b9050612d35565b6131fa85846146ec565b606061064383835f613583565b6133e7612914565b610889613612565b610889612914565b6133ff612914565b6001600160a01b03821661347b5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f7274657220726567697374727920616464726573730000000000000000006064820152608401610686565b5f5f8051602061472c83398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134f19190613be9565b116135595760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b6064820152608401610686565b81546001600160a01b0319166001600160a01b038216178255610ca183611030565b610e47612914565b6060814710156135a85760405163cd78605960e01b8152306004820152602401610686565b5f80856001600160a01b031684866040516135c391906145cd565b5f6040518083038185875af1925050503d805f81146135fd576040519150601f19603f3d011682016040523d82523d5f602084013e613602565b606091505b50915091506125ed86838361361a565b6116df612914565b60608261362f5761362a82613676565b610643565b815115801561364657506001600160a01b0384163b155b1561366f57604051639996b31560e01b81526001600160a01b0385166004820152602401610686565b5080610643565b8051156136865780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f5b838110156136b95781810151838201526020016136a1565b50505f910152565b5f81518084526136d881602086016020860161369f565b601f01601f19169290920160200192915050565b602081525f61064360208301846136c1565b6001600160a01b038116811461086b575f80fd5b803561371d816136fe565b919050565b5f8060408385031215613733575f80fd5b823561373e816136fe565b946020939093013593505050565b5f805f6060848603121561375e575f80fd5b8335613769816136fe565b92506020840135613779816136fe565b929592945050506040919091013590565b5f6020828403121561379a575f80fd5b8135610643816136fe565b5f808284036101208112156137b8575f80fd5b610100808212156137c7575f80fd5b9395938601359450505050565b5f602082840312156137e4575f80fd5b5035919050565b5f80604083850312156137fc575f80fd5b82356001600160401b03811115613811575f80fd5b8301610160818603121561373e575f80fd5b5f60408284031215613833575f80fd5b50919050565b5f805f806060858703121561384c575f80fd5b84359350602085013561385e816136fe565b925060408501356001600160401b0380821115613879575f80fd5b818701915087601f83011261388c575f80fd5b81358181111561389a575f80fd5b8860208285010111156138ab575f80fd5b95989497505060200194505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b03811182821017156138f0576138f06138ba565b60405290565b604080519081016001600160401b03811182821017156138f0576138f06138ba565b60405161010081016001600160401b03811182821017156138f0576138f06138ba565b604051601f8201601f191681016001600160401b0381118282101715613963576139636138ba565b604052919050565b803560ff8116811461371d575f80fd5b5f6001600160401b03821115613993576139936138ba565b50601f01601f191660200190565b5f82601f8301126139b0575f80fd5b81356139c36139be8261397b565b61393b565b8181528460208386010111156139d7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80848603610120811215613a08575f80fd5b60c0811215613a15575f80fd5b50613a1e6138ce565b8535613a29816136fe565b81526020860135613a39816136fe565b8060208301525060408601356040820152606086013560608201526080860135613a62816136fe565b6080820152613a7360a0870161396b565b60a0820152935060c08501356001600160401b0380821115613a93575f80fd5b613a9f888389016139a1565b945060e0870135915080821115613ab4575f80fd5b50613ac1878288016139a1565b925050613ad1610100860161396b565b905092959194509250565b5f8060408385031215613aed575f80fd5b8235613af8816136fe565b91506020830135613b08816136fe565b809150509250929050565b600181811c90821680613b2757607f821691505b60208210810361383357634e487b7160e01b5f52602260045260245ffd5b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b602081525f825160058110613bca57634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612d3560608401826136c1565b5f60208284031215613bf9575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561060457610604613c00565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b80841015613cf857845183168252938501936001939093019290850190613cd6565b5060a0880151878203601f190160e08901529450613d1681866136c1565b98975050505050505050565b5f82601f830112613d31575f80fd5b8151613d3f6139be8261397b565b818152846020838601011115613d53575f80fd5b612d3582602083016020870161369f565b5f60208284031215613d74575f80fd5b81516001600160401b0380821115613d8a575f80fd5b9083019060408286031215613d9d575f80fd5b613da56138f6565b825160058110613db3575f80fd5b8152602083015182811115613dc6575f80fd5b613dd287828601613d22565b60208301525095945050505050565b805161371d816136fe565b5f60408284031215613dfc575f80fd5b613e046138f6565b8251613e0f816136fe565b81526020928301519281019290925250919050565b5f60208284031215613e34575f80fd5b81516001600160401b0380821115613e4a575f80fd5b908301906101008286031215613e5e575f80fd5b613e66613918565b82518152613e7660208401613de1565b6020820152613e8760408401613de1565b6040820152613e9860608401613de1565b60608201526080830151608082015260a083015182811115613eb8575f80fd5b613ec487828601613d22565b60a08301525060c083015160c0820152613ee060e08401613de1565b60e082015295945050505050565b60208082526024908201527f546f6b656e52656d6f74653a207a65726f20726571756972656420676173206c6040820152631a5b5a5d60e21b606082015260800190565b6020808252602b908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20626c60408201526a1bd8dad8da185a5b88125160aa1b606082015260800190565b60208082526037908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20746f60408201527f6b656e207472616e736665727265722061646472657373000000000000000000606082015260800190565b81516001600160a01b031681526020808301519082015260408101610604565b8235815261012081016020840135614011816136fe565b6001600160a01b039081166020840152604085013590614030826136fe565b16604083015261404260608501613712565b6001600160a01b0381166060840152506080840135608083015260a084013560a083015260c084013560c083015261407c60e08501613712565b6001600160a01b031660e083015261010090910191909152919050565b5f808335601e198436030181126140ae575f80fd5b8301803591506001600160401b038211156140c7575f80fd5b602001915036819003821315613370575f80fd5b60208152815160208201525f602083015160018060a01b0380821660408501528060408601511660608501525050606083015161412360808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c085015261414a6101208501836136c1565b915060c085015160e085015260e085015161416f828601826001600160a01b03169052565b5090949350505050565b5f808335601e1984360301811261418e575f80fd5b83016020810192503590506001600160401b038111156141ac575f80fd5b803603821315613370575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60408152823560408201525f6141fa60208501613712565b6001600160a01b0316606083015261421460408501613712565b6001600160a01b0316608083015261422f6060850185614179565b6101608060a08601526142476101a0860183856141ba565b9250608087013560c086015260a087013560e086015261426960c08801613712565b9150610100614282818701846001600160a01b03169052565b61428e60e08901613712565b92506101206142a7818801856001600160a01b03169052565b6142b2828a01613712565b935061014091506142cd828801856001600160a01b03169052565b880135918601919091529095013561018084015260209092019290925292915050565b6020815261430a6020820183516001600160a01b03169052565b602082015160408201525f604083015161432f60608401826001600160a01b03169052565b5060608301516001600160a01b038116608084015250608083015160a083015260a08301516101608060c085015261436b6101808501836136c1565b915060c085015160e085015260e0850151610100614393818701836001600160a01b03169052565b8601516101208681019190915286015190506101406143bc818701836001600160a01b03169052565b959095015193019290925250919050565b808202811582820484141761060457610604613c00565b8181038181111561060457610604613c00565b5f60208284031215614407575f80fd5b8151610643816136fe565b8681526001600160a01b0386811660208301528581166040830152841660608201526080810183905260c060a082018190525f90613d16908301846136c1565b6020808252603a908201527f546f6b656e52656d6f74653a20696e76616c69642064657374696e6174696f6e60408201527f20746f6b656e207472616e736665727265722061646472657373000000000000606082015260800190565b601f821115610ec057805f5260205f20601f840160051c810160208510156144d45750805b601f840160051c820191505b818110156116d8575f81556001016144e0565b81516001600160401b0381111561450c5761450c6138ba565b6145208161451a8454613b13565b846144af565b602080601f831160018114614553575f841561453c5750858301515b5f19600386901b1c1916600185901b178555610ac5565b5f85815260208120601f198616915b8281101561458157888601518255948401946001909101908401614562565b508582101561459e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156145be575f80fd5b81518015158114610643575f80fd5b5f82516145de81846020870161369f565b9190910192915050565b60ff828116828216039081111561060457610604613c00565b600181815b8085111561463b57815f190482111561462157614621613c00565b8085161561462e57918102915b93841c9390800290614606565b509250929050565b5f8261465157506001610604565b8161465d57505f610604565b8160018114614673576002811461467d57614699565b6001915050610604565b60ff84111561468e5761468e613c00565b50506001821b610604565b5060208310610133831016604e8410600b84101617156146bc575081810a610604565b6146c68383614601565b805f19048211156146d9576146d9613c00565b029392505050565b5f6106438383614643565b5f8261470657634e487b7160e01b5f52601260045260245ffd5b50049056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a2646970667358221220595791fb093caacdd8dfcce8b1727fac1802b58bf29745b5353baafc4959e62464736f6c63430008190033", } // ERC20TokenRemoteUpgradeableABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/ictt/TokenRemote/NativeTokenRemote/NativeTokenRemote.go b/abi-bindings/go/ictt/TokenRemote/NativeTokenRemote/NativeTokenRemote.go index 06d3d9e27..5de5b9a20 100644 --- a/abi-bindings/go/ictt/TokenRemote/NativeTokenRemote/NativeTokenRemote.go +++ b/abi-bindings/go/ictt/TokenRemote/NativeTokenRemote/NativeTokenRemote.go @@ -75,7 +75,7 @@ type TokenRemoteSettings struct { // NativeTokenRemoteMetaData contains all meta data concerning the NativeTokenRemote contract. var NativeTokenRemoteMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"teleporterRegistryAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"teleporterManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minTeleporterVersion\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"tokenHomeBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"tokenHomeAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenHomeDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structTokenRemoteSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"nativeAssetSymbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"initialReserveImbalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"burnedFeesReportingRewardPercentage\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldMinTeleporterVersion\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newMinTeleporterVersion\",\"type\":\"uint256\"}],\"name\":\"MinTeleporterVersionUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feesBurned\",\"type\":\"uint256\"}],\"name\":\"ReportBurnedTxFees\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressUnpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensAndCallSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"BURNED_FOR_TRANSFER_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BURNED_TX_FEES_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOME_CHAIN_BURN_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MULTI_HOP_CALL_GAS_PER_WORD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MULTI_HOP_CALL_REQUIRED_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MULTI_HOP_SEND_REQUIRED_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_MINTER\",\"outputs\":[{\"internalType\":\"contractINativeMinter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_REMOTE_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REGISTER_REMOTE_REQUIRED_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TELEPORTER_REGISTRY_APP_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_REMOTE_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"payloadSize\",\"type\":\"uint256\"}],\"name\":\"calculateNumWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getInitialReserveImbalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getIsCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinTeleporterVersion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMultiplyOnRemote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenHomeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenHomeBlockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenMultiplier\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalMinted\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"teleporterRegistryAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"teleporterManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minTeleporterVersion\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"tokenHomeBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"tokenHomeAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenHomeDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structTokenRemoteSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"nativeAssetSymbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"initialReserveImbalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"burnedFeesReportingRewardPercentage\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"isTeleporterAddressPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"pauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"originSenderAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"receiveTeleporterMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structTeleporterFeeInfo\",\"name\":\"feeInfo\",\"type\":\"tuple\"}],\"name\":\"registerWithHome\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"}],\"name\":\"reportBurnedTxFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"}],\"name\":\"send\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"}],\"name\":\"sendAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalNativeAssetSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"unpauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"updateMinTeleporterVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615fee380380615fee83398101604081905261002e91610cb3565b61003a84848484610046565b50505050610ff4565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f8115801561008f5750825b90505f826001600160401b031660011480156100aa5750303b155b9050811580156100b8575080155b156100d65760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561010457845460ff60401b1916680100000000000000001785555b61011089898989610161565b831561015657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6101696101fc565b815f036101d75760405162461bcd60e51b815260206004820152603160248201527f4e6174697665546f6b656e52656d6f74653a207a65726f20696e697469616c206044820152707265736572766520696d62616c616e636560781b60648201526084015b60405180910390fd5b6101e1838061024c565b6101ed84836012610262565b6101f681610299565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff1661024a57604051631afcd79f60e31b815260040160405180910390fd5b565b6102546101fc565b61025e8282610323565b5050565b61026a6101fc565b825160208401516040850151610281929190610386565b6102896103a1565b6102948383836103b1565b505050565b6102a16101fc565b606481106102ff5760405162461bcd60e51b815260206004820152602560248201527f4e6174697665546f6b656e52656d6f74653a20696e76616c69642070657263656044820152646e7461676560d81b60648201526084016101ce565b7f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf50055565b61032b6101fc565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036103778482610df9565b50600481016101f68382610df9565b61038e6101fc565b61039883826106fb565b6102948261071d565b6103a96101fc565b61024a61072e565b6103b96101fc565b5f7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090507302000000000000000000000000000000000000056001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561042d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104519190610eb8565b815560608401516104b75760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b60648201526084016101ce565b80546060850151036105315760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d65000000000060648201526084016101ce565b60808401516001600160a01b03166105975760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b60648201526084016101ce565b60128460a0015160ff1611156106015760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b60648201526084016101ce565b60128260ff1611156106615760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b60648201526084016101ce565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b918616919091021790556106dd9083610758565b60048301805460ff1916911515919091179055600390910155505050565b6107036101fc565b61070b6107a0565b6107136107b0565b61025e82826107b8565b6107256101fc565b6100438161093c565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75005b6001905550565b5f8060ff80851690841611818161077b576107738587610ee3565b60ff16610789565b6107858686610ee3565b60ff165b61079490600a610fe2565b96919550909350505050565b6107a86101fc565b61024a610976565b61024a6101fc565b6107c06101fc565b6001600160a01b03821661083c5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016101ce565b5f7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0090505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c59190610eb8565b1161091a5760405162461bcd60e51b815260206004820152603260248201525f80516020615fce833981519152604482015271656c65706f7274657220726567697374727960701b60648201526084016101ce565b81546001600160a01b0319166001600160a01b0382161782556101f6836109a5565b6109446101fc565b6001600160a01b03811661096d57604051631e4fbdf760e01b81525f60048201526024016101ce565b61004381610b3d565b61097e6101fc565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00610751565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015610a0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a309190610eb8565b600283015490915081841115610a8f5760405162461bcd60e51b815260206004820152603160248201525f80516020615fce83398151915260448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016101ce565b808411610b045760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016101ce565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b0381118282101715610be357610be3610bad565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610c1157610c11610bad565b604052919050565b80516001600160a01b0381168114610c2f575f80fd5b919050565b5f82601f830112610c43575f80fd5b81516001600160401b03811115610c5c57610c5c610bad565b6020610c70601f8301601f19168201610be9565b8281528582848701011115610c83575f80fd5b5f5b83811015610ca0578581018301518282018401528201610c85565b505f928101909101919091529392505050565b5f805f80848603610120811215610cc8575f80fd5b60c0811215610cd5575f80fd5b50610cde610bc1565b610ce786610c19565b8152610cf560208701610c19565b60208201526040860151604082015260608601516060820152610d1a60808701610c19565b608082015260a086015160ff81168114610d32575f80fd5b60a082015260c08601519094506001600160401b03811115610d52575f80fd5b610d5e87828801610c34565b60e08701516101009097015195989097509350505050565b600181811c90821680610d8a57607f821691505b602082108103610da857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561029457805f5260205f20601f840160051c81016020851015610dd35750805b601f840160051c820191505b81811015610df2575f8155600101610ddf565b5050505050565b81516001600160401b03811115610e1257610e12610bad565b610e2681610e208454610d76565b84610dae565b602080601f831160018114610e59575f8415610e425750858301515b5f19600386901b1c1916600185901b178555610eb0565b5f85815260208120601f198616915b82811015610e8757888601518255948401946001909101908401610e68565b5085821015610ea457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215610ec8575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b60ff8281168282160390811115610efc57610efc610ecf565b92915050565b600181815b80851115610f3c57815f1904821115610f2257610f22610ecf565b80851615610f2f57918102915b93841c9390800290610f07565b509250929050565b5f82610f5257506001610efc565b81610f5e57505f610efc565b8160018114610f745760028114610f7e57610f9a565b6001915050610efc565b60ff841115610f8f57610f8f610ecf565b50506001821b610efc565b5060208310610133831016604e8410600b8410161715610fbd575081810a610efc565b610fc78383610f02565b805f1904821115610fda57610fda610ecf565b029392505050565b5f610fed8383610f44565b9392505050565b614fcd806110015f395ff3fe608060405260043610610280575f3560e01c8063715018a61161014e578063b8a46d02116100c0578063dd62ed3e11610079578063dd62ed3e14610736578063e0fd9cb814610755578063ed0ae4b014610452578063ef793e2a14610769578063f2fde38b1461077d578063f3f981d81461079c5761028f565b8063b8a46d02146106b9578063c3cd6927146106d8578063c452165e146106ec578063c868efaa14610703578063d0e30db01461028f578063d2cc7a70146107225761028f565b80638f6cec88116101125780638f6cec8814610608578063909a6ac01461062757806395d89b4114610647578063973142971461065b578063a5717bc01461067a578063a9059cbb1461069a5761028f565b8063715018a61461057b57806371717c181461058f5780637ee3779a146105a55780638bf2fa94146105b95780638da5cb5b146105cc5761028f565b80632e1a7d4d116101f25780634511243e116101ab5780634511243e146104b55780635507f3d1146104d457806355538c8b146104ea5780635eb99514146105095780636e6eef8d1461052857806370a082311461053b5761028f565b80632e1a7d4d146103e6578063313ce56714610405578063329c3e1214610420578063347212c41461045257806335cac1591461046e5780634213cf78146104a15761028f565b806315beb59f1161024457806315beb59f1461035557806318160ddd1461036a5780631906529c1461037e57806323b872dd14610392578063254ac160146103b15780632b0d8f18146103c75761028f565b806302a30c7d1461029757806306fdde03146102c05780630733c8c8146102e1578063095ea7b3146103035780630ca1c5c9146103225761028f565b3661028f5761028d6107bb565b005b61028d6107bb565b3480156102a2575f80fd5b506102ab6107fc565b60405190151581526020015b60405180910390f35b3480156102cb575f80fd5b506102d4610813565b6040516102b79190613f06565b3480156102ec575f80fd5b506102f56108d3565b6040519081526020016102b7565b34801561030e575f80fd5b506102ab61031d366004613f3c565b6108e7565b34801561032d575f80fd5b507f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf501546102f5565b348015610360575f80fd5b506102f56105dc81565b348015610375575f80fd5b506102f5610900565b348015610389575f80fd5b506102f561091b565b34801561039d575f80fd5b506102ab6103ac366004613f66565b610972565b3480156103bc575f80fd5b506102f56201fbd081565b3480156103d2575f80fd5b5061028d6103e1366004613fa4565b610997565b3480156103f1575f80fd5b5061028d610400366004613fbf565b610a99565b348015610410575f80fd5b50604051601281526020016102b7565b34801561042b575f80fd5b5061043a6001600160991b0181565b6040516001600160a01b0390911681526020016102b7565b34801561045d575f80fd5b5061043a62010203600160981b0181565b348015610479575f80fd5b506102f57f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0081565b3480156104ac575f80fd5b506102f5610ae5565b3480156104c0575f80fd5b5061028d6104cf366004613fa4565b610af6565b3480156104df575f80fd5b506102f56205302081565b3480156104f5575f80fd5b5061028d610504366004613fbf565b610be5565b348015610514575f80fd5b5061028d610523366004613fbf565b610ef7565b61028d610536366004613fd6565b610f08565b348015610546575f80fd5b506102f5610555366004613fa4565b6001600160a01b03165f9081525f80516020614f18833981519152602052604090205490565b348015610586575f80fd5b5061028d610f36565b34801561059a575f80fd5b506102f56205573081565b3480156105b0575f80fd5b506102ab610f47565b61028d6105c736600461400d565b610f5e565b3480156105d7575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031661043a565b348015610613575f80fd5b5061028d61062236600461414d565b610f8c565b348015610632575f80fd5b506102f55f80516020614f7883398151915281565b348015610652575f80fd5b506102d461109e565b348015610666575f80fd5b506102ab610675366004613fa4565b6110dc565b348015610685575f80fd5b506102f55f80516020614f5883398151915281565b3480156106a5575f80fd5b506102ab6106b4366004613f3c565b6110f5565b3480156106c4575f80fd5b5061028d6106d3366004614217565b611102565b3480156106e3575f80fd5b5061043a611276565b3480156106f7575f80fd5b5061043a600160981b81565b34801561070e575f80fd5b5061028d61071d366004614227565b611293565b34801561072d575f80fd5b506102f5611450565b348015610741575f80fd5b506102f56107503660046142a8565b611465565b348015610760575f80fd5b506102f56114ae565b348015610774575f80fd5b506102f56114c2565b348015610788575f80fd5b5061028d610797366004613fa4565b6114d6565b3480156107a7575f80fd5b506102f56107b6366004613fbf565b611510565b60405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a26107fa3334611526565b565b5f8061080661155e565b6006015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f80516020614f1883398151915291610851906142df565b80601f016020809104026020016040519081016040528092919081815260200182805461087d906142df565b80156108c85780601f1061089f576101008083540402835291602001916108c8565b820191905f5260205f20905b8154815290600101906020018083116108ab57829003601f168201915b505050505091505090565b5f806108dd61155e565b6003015492915050565b5f336108f4818585611582565b60019150505b92915050565b5f805f80516020614f188339815191525b6002015492915050565b5f5f80516020614f588339815191528161094462010203600160981b0131600160981b31614325565b90505f61094f6114c2565b836001015461095e9190614325565b905061096a8282614338565b935050505090565b5f3361097f858285611594565b61098a8585856115f1565b60019150505b9392505050565b5f80516020614f788339815191526109ad61164e565b6001600160a01b0382166109dc5760405162461bcd60e51b81526004016109d39061434b565b60405180910390fd5b6109e68183611656565b15610a495760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b60648201526084016109d3565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b60405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a2610ad83382611677565b610ae233826116ab565b50565b5f80610aef61155e565b5492915050565b5f80516020614f78833981519152610b0c61164e565b6001600160a01b038216610b325760405162461bcd60e51b81526004016109d39061434b565b610b3c8183611656565b610b9a5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b60648201526084016109d3565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b5f80516020614f388339815191528054600114610c145760405162461bcd60e51b81526004016109d390614399565b600281557f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf502545f80516020614f5883398151915290600160981b31908111610cd25760405162461bcd60e51b8152602060048201526044602482018190527f4e6174697665546f6b656e52656d6f74653a206275726e206164647265737320908201527f62616c616e6365206e6f742067726561746572207468616e206c6173742072656064820152631c1bdc9d60e21b608482015260a4016109d3565b5f826002015482610ce39190614338565b90505f6064845f015483610cf791906143dd565b610d0191906143f4565b90505f610d0e8284614338565b6002860185905590508115610d3157610d27308361173e565b610d313083611526565b5f610d4b610d3d6108d3565b610d45610f47565b846117eb565b11610db55760405162461bcd60e51b815260206004820152603460248201527f4e6174697665546f6b656e52656d6f74653a207a65726f207363616c6564206160448201527336b7bab73a103a37903932b837b93a10313ab93760611b60648201526084016109d3565b604080518082018252600181528151808301835262010203600160981b018152602080820185905292515f9380840192610df192909101614427565b60405160208183030381529060405281525090505f610eac6040518060c00160405280610e1c6114ae565b8152602001610e29611276565b6001600160a01b0316815260408051808201825230815260208181018a905283015281018c90526060015f5b604051908082528060200260200182016040528015610e7e578160200160208202803683370190505b50815260200184604051602001610e959190614447565b604051602081830303815290604052815250611800565b9050807f0832c643b65d6d3724ed14ac3a655fbc7cae54fb010918b2c2f70ef6b1bb94a584604051610ee091815260200190565b60405180910390a250506001909555505050505050565b610eff61164e565b610ae28161191b565b610f106107fc565b610f2c5760405162461bcd60e51b81526004016109d390614489565b610ae28134611ab3565b610f3e611b2a565b6107fa5f611b85565b5f80610f5161155e565b6004015460ff1692915050565b610f666107fc565b610f825760405162461bcd60e51b81526004016109d390614489565b610ae28134611bf5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610fd05750825b90505f826001600160401b03166001148015610feb5750303b155b905081158015610ff9575080155b156110175760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561104157845460ff60401b1916600160401b1785555b61104d89898989611c61565b831561109357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f80516020614f1883398151915291610851906142df565b5f5f80516020614f788339815191526109908184611656565b5f336108f48185856115f1565b5f61110b61155e565b6006810154909150610100900460ff16156111685760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e52656d6f74653a20616c726561647920726567697374657265640060448201526064016109d3565b604080516060808201835260058401548252600284015460ff600160a01b820481166020808601918252600160a81b9093048216858701908152865180880188525f808252885188518188015293518516848a015291519093168286015286518083039095018552608090910190955280820192909252919290916111fd906111f390870187613fa4565b8660200135611cf1565b6040805160c0810182526001870154815260028701546001600160a01b03166020808301919091528251808401845293945061126e939192830191908190611247908b018b613fa4565b6001600160a01b0316815260209081018690529082526201fbd0908201526040015f610e55565b505050505050565b5f8061128061155e565b600201546001600160a01b031692915050565b61129b611d38565b5f5f80516020614f7883398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611306573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132a91906144d8565b10156113915760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b60648201526084016109d3565b61139b8133611656565b156114015760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b60648201526084016109d3565b611441858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611d8292505050565b5061144a611f99565b50505050565b5f805f80516020614f78833981519152610911565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f806114b861155e565b6001015492915050565b5f806114cc61155e565b6005015492915050565b6114de611b2a565b6001600160a01b03811661150757604051631e4fbdf760e01b81525f60048201526024016109d3565b610ae281611b85565b5f600561151e83601f614325565b901c92915050565b6001600160a01b03821661154f5760405163ec442f0560e01b81525f60048201526024016109d3565b61155a5f8383611fc3565b5050565b7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090565b61158f83838360016120fc565b505050565b5f61159f8484611465565b90505f19811461144a57818110156115e357604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016109d3565b61144a84848484035f6120fc565b6001600160a01b03831661161a57604051634b637e8f60e11b81525f60048201526024016109d3565b6001600160a01b0382166116435760405163ec442f0560e01b81525f60048201526024016109d3565b61158f838383611fc3565b6107fa611b2a565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b6001600160a01b0382166116a057604051634b637e8f60e11b81525f60048201526024016109d3565b61155a825f83611fc3565b804710156116ce5760405163cd78605960e01b81523060048201526024016109d3565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611717576040519150601f19603f3d011682016040523d82523d5f602084013e61171c565b606091505b505090508061158f57604051630a12f52160e11b815260040160405180910390fd5b7f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf50180545f80516020614f588339815191529183915f9061177f908490614325565b90915550506040516327ad555d60e11b81526001600160a01b0384166004820152602481018390526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156117d0575f80fd5b505af11580156117e2573d5f803e3d5ffd5b50505050505050565b5f6117f88484845f6121df565b949350505050565b5f8061180a61220f565b604084015160200151909150156118af576040830151516001600160a01b031661188c5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b60648201526084016109d3565b6040830151602081015190516118af916001600160a01b039091169083906122ff565b604051630624488560e41b81526001600160a01b038216906362448850906118db9086906004016144ef565b6020604051808303815f875af11580156118f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099091906144d8565b5f80516020614f7883398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa15801561196f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061199391906144d8565b600283015490915081841115611a055760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016109d3565b808411611a7a5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016109d3565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b5f80516020614f388339815191528054600114611ae25760405162461bcd60e51b81526004016109d390614399565b600281555f611aef61155e565b9050611afa84612386565b6001810154843503611b1657611b1084846125c0565b50611b22565b611b1084846127e4565b505b600190555050565b33611b5c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107fa5760405163118cdaa760e01b81523360048201526024016109d3565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f80516020614f388339815191528054600114611c245760405162461bcd60e51b81526004016109d390614399565b600281555f611c3161155e565b9050611c3c84612a85565b6001810154843503611c5757611c528484612b70565b611b20565b611b208484612cdf565b611c69612ea5565b815f03611cd25760405162461bcd60e51b815260206004820152603160248201527f4e6174697665546f6b656e52656d6f74653a207a65726f20696e697469616c206044820152707265736572766520696d62616c616e636560781b60648201526084016109d3565b611cdc8384612eee565b611ce884836012612f00565b61144a81612f31565b5f815f03611d0057505f6108fa565b306001600160a01b03841603611d2d57611d1b333084611594565b611d263330846115f1565b50806108fa565b610990833384612fa8565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611d7c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f611d8b61155e565b905080600101548414611df25760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20696e76616c696420736f7572636520626c6f636044820152681ad8da185a5b88125160ba1b60648201526084016109d3565b60028101546001600160a01b03848116911614611e645760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a20696e76616c6964206f726967696e2073656e646044820152696572206164647265737360b01b60648201526084016109d3565b5f82806020019051810190611e7991906145e8565b6006830154909150610100900460ff161580611e9a5750600682015460ff16155b15611eb15760068201805461ffff19166101011790555b600181516004811115611ec657611ec6614413565b03611efd575f8160200151806020019051810190611ee49190614670565b9050611ef7815f0151826020015161310b565b50611f92565b600281516004811115611f1257611f12614413565b03611f40575f8160200151806020019051810190611f3091906146a8565b9050611ef7818260800151613158565b60405162461bcd60e51b815260206004820152602160248201527f546f6b656e52656d6f74653a20696e76616c6964206d657373616765207479706044820152606560f81b60648201526084016109d3565b5050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b5f80516020614f188339815191526001600160a01b038416611ffd5781816002015f828254611ff29190614325565b9091555061206d9050565b6001600160a01b0384165f908152602082905260409020548281101561204f5760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016109d3565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b03831661208b5760028101805483900390556120a9565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120ee91815260200190565b60405180910390a350505050565b5f80516020614f188339815191526001600160a01b0385166121335760405163e602df0560e01b81525f60048201526024016109d3565b6001600160a01b03841661215c57604051634a1406b160e11b81525f60048201526024016109d3565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115611f9257836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516121d091815260200190565b60405180910390a35050505050565b5f811515841515036121fc576121f585846143dd565b90506117f8565b61220685846143f4565b95945050505050565b5f80516020614f7883398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612269573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228d9190614772565b90506122998282611656565b156108fa5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b60648201526084016109d3565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa15801561234c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061237091906144d8565b905061144a84846123818585614325565b613282565b80356123a45760405162461bcd60e51b81526004016109d39061478d565b5f6123b56040830160208401613fa4565b6001600160a01b0316036123db5760405162461bcd60e51b81526004016109d3906147d8565b5f6123ec6060830160408401613fa4565b6001600160a01b0316036124575760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420636f6e7460448201526b72616374206164647265737360a01b60648201526084016109d3565b5f81608001351161247a5760405162461bcd60e51b81526004016109d390614835565b5f8160a00135116124db5760405162461bcd60e51b815260206004820152602560248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420676173206044820152641b1a5b5a5d60da1b60648201526084016109d3565b80608001358160a00135106125435760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a20696e76616c696420726563697069656e742067604482015267185cc81b1a5b5a5d60c21b60648201526084016109d3565b5f612555610100830160e08401613fa4565b6001600160a01b031603610ae25760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f2066616c6c6261636b20726563697060448201526b69656e74206164647265737360a01b60648201526084016109d3565b5f6125c961155e565b90506125f96125de6040850160208601613fa4565b6101408501356125f460e0870160c08801613fa4565b61333f565b5f6126218361261061012087016101008801613fa4565b86610120013587610140013561343c565b6040805180820190915291945091505f908060028152602001604051806101000160405280865f01548152602001306001600160a01b031681526020016126653390565b6001600160a01b0316815260200161268360608a0160408b01613fa4565b6001600160a01b03168152602081018890526040016126a560608a018a614879565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a089013560208201526040016126f96101008a0160e08b01613fa4565b6001600160a01b0316905260405161271491906020016148bb565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92612796928201908061276e6101208c016101008d01613fa4565b6001600160a01b03168152602090810188905290825260808a0135908201526040015f610e55565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b1688886040516127d49291906149c2565b60405180910390a3505050505050565b5f6127ed61155e565b905061281983356128046040860160208701613fa4565b61281460e0870160c08801613fa4565b6134ff565b5f6128308361261061012087016101008801613fa4565b6040805180820190915291945091505f90806004815260200160405180610160016040528061285c3390565b6001600160a01b03168152602001885f013581526020018860200160208101906128869190613fa4565b6001600160a01b031681526020016128a460608a0160408b01613fa4565b6001600160a01b03168152602081018890526040016128c660608a018a614879565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a0890135602082015260400161291a6101008a0160e08b01613fa4565b6001600160a01b031681526080890135602082015260400161294260e08a0160c08b01613fa4565b6001600160a01b03168152610140890135602091820152604051612967929101614ad0565b60408051601f19818403018152919052905290505f6105dc61299661298f6060890189614879565b9050611510565b6129a091906143dd565b6129ad9062055730614325565b6040805160c0810182526001870154815260028701546001600160a01b03166020820152815180830183529293505f92612a3692820190806129f76101208d016101008e01613fa4565b6001600160a01b031681526020908101899052908252818101869052604080515f815280830182528184015251606090920191610e9591889101614447565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168989604051612a749291906149c2565b60405180910390a350505050505050565b5f612a966060830160408401613fa4565b6001600160a01b031603612af85760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e74206164647260448201526265737360e81b60648201526084016109d3565b5f8160c0013511612b1b5760405162461bcd60e51b81526004016109d390614835565b8035612b395760405162461bcd60e51b81526004016109d39061478d565b5f612b4a6040830160208401613fa4565b6001600160a01b031603610ae25760405162461bcd60e51b81526004016109d3906147d8565b5f612b7961155e565b9050612ba4612b8e6040850160208601613fa4565b60a08501356125f4610100870160e08801613fa4565b5f612bc883612bb96080870160608801613fa4565b86608001358760a0013561343c565b6040805180820190915291945091505f9080600181526020016040518060400160405280886040016020810190612bff9190613fa4565b6001600160a01b0316815260200187815250604051602001612c219190614427565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92612ca19282019080612c7960808c0160608d01613fa4565b6001600160a01b03168152602090810188905290825260c08a0135908201526040015f610e55565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb5288886040516127d4929190614bad565b5f612ce861155e565b9050612d108335612cff6040860160208701613fa4565b612814610100870160e08801613fa4565b5f612d2583612bb96080870160608801613fa4565b60408051808201825260038152815160e081018352883581529396509193505f9260208084019282820191612d5e918b01908b01613fa4565b6001600160a01b03168152602001612d7c60608a0160408b01613fa4565b6001600160a01b031681526020810188905260a0890135604082015260c08901356060820152608001612db66101008a0160e08b01613fa4565b6001600160a01b03169052604051612e269190602001815181526020808301516001600160a01b0390811691830191909152604080840151821690830152606080840151908301526080808401519083015260a0808401519083015260c092830151169181019190915260e00190565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92612ca19282019080612e7e60808c0160608d01613fa4565b6001600160a01b03168152602090810188905290825262053020908201526040015f610e55565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107fa57604051631afcd79f60e31b815260040160405180910390fd5b612ef6612ea5565b61155a828261359d565b612f08612ea5565b612f1e835f0151846020015185604001516135ed565b612f26613608565b61158f838383613618565b612f39612ea5565b60648110612f975760405162461bcd60e51b815260206004820152602560248201527f4e6174697665546f6b656e52656d6f74653a20696e76616c69642070657263656044820152646e7461676560d81b60648201526084016109d3565b5f80516020614f5883398151915255565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa158015612fee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061301291906144d8565b90506130296001600160a01b03861685308661393c565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa15801561306d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061309191906144d8565b90508181116130f75760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016109d3565b6131018282614338565b9695505050505050565b816001600160a01b03167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b8260405161314691815260200190565b60405180910390a261155a828261173e565b613162308261173e565b5f825f0151836020015184604001518560a001516040516024016131899493929190614c4c565b60408051601f198184030181529190526020810180516001600160e01b031663161b12ff60e11b17905260c084015160608501519192505f916131cf9190859085613975565b905080156132235783606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff48460405161321691815260200190565b60405180910390a261144a565b83606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb08460405161326291815260200190565b60405180910390a260e084015161144a906001600160a01b0316846116ab565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526132d38482613a45565b61144a576040516001600160a01b0384811660248301525f604483015261333591869182169063095ea7b3906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613ae2565b61144a8482613ae2565b5f61334861155e565b60028101549091506001600160a01b0385811691161461337a5760405162461bcd60e51b81526004016109d390614c7d565b82156133d45760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f207365636f6e646172792060448201526266656560e81b60648201526084016109d3565b6001600160a01b0382161561144a5760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f206d756c74692d686f702060448201526766616c6c6261636b60c01b60648201526084016109d3565b5f805f61344761155e565b905061345287613b43565b965061345e8686611cf1565b600382015460048301549196506134789160ff16866117eb565b60038201546004830154613490919060ff168a6117eb565b116134f25760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a20696e73756666696369656e7420746f6b656e7360448201526b103a37903a3930b739b332b960a11b60648201526084016109d3565b5094959294509192505050565b5f61350861155e565b8054909150840361353b57306001600160a01b0384160361353b5760405162461bcd60e51b81526004016109d390614c7d565b6001600160a01b03821661144a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f206d756c74692d686f702066616c6c6044820152636261636b60e01b60648201526084016109d3565b6135a5612ea5565b5f80516020614f188339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036135de8482614d1e565b506004810161144a8382614d1e565b6135f5612ea5565b6135ff8382613b5b565b61158f82613b7d565b613610612ea5565b6107fa613b8e565b613620612ea5565b5f61362961155e565b90506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561366e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061369291906144d8565b815560608401516136f85760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b60648201526084016109d3565b80546060850151036137725760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d65000000000060648201526084016109d3565b60808401516001600160a01b03166137d85760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b60648201526084016109d3565b60128460a0015160ff1611156138425760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b60648201526084016109d3565b60128260ff1611156138a25760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b60648201526084016109d3565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b9186169190910217905561391e9083613ba2565b60048301805460ff1916911515919091179055600390910155505050565b6040516001600160a01b03848116602483015283811660448301526064820183905261144a9186918216906323b872dd90608401613303565b5f845a10156139c65760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e7420676173000000000060448201526064016109d3565b83471015613a165760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c756500000060448201526064016109d3565b826001600160a01b03163b5f03613a2e57505f6117f8565b5f805f84516020860188888bf19695505050505050565b5f805f846001600160a01b031684604051613a609190614dd9565b5f604051808303815f865af19150503d805f8114613a99576040519150601f19603f3d011682016040523d82523d5f602084013e613a9e565b606091505b5091509150818015613ac8575080511580613ac8575080806020019051810190613ac89190614df4565b80156122065750505050506001600160a01b03163b151590565b5f613af66001600160a01b03841683613bec565b905080515f14158015613b1a575080806020019051810190613b189190614df4565b155b1561158f57604051635274afe760e01b81526001600160a01b03841660048201526024016109d3565b5f613b5762010203600160981b01836116ab565b5090565b613b63612ea5565b613b6b613bf9565b613b73613c09565b61155a8282613c11565b613b85612ea5565b610ae281613d95565b5f5f80516020614f38833981519152611fbc565b5f8060ff808516908416118181613bc557613bbd8587614e13565b60ff16613bd3565b613bcf8686614e13565b60ff165b613bde90600a614f0c565b9350909150505b9250929050565b606061099083835f613d9d565b613c01612ea5565b6107fa613e2c565b6107fa612ea5565b613c19612ea5565b6001600160a01b038216613c955760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016109d3565b5f5f80516020614f7883398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ce7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d0b91906144d8565b11613d735760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b60648201526084016109d3565b81546001600160a01b0319166001600160a01b03821617825561144a8361191b565b6114de612ea5565b606081471015613dc25760405163cd78605960e01b81523060048201526024016109d3565b5f80856001600160a01b03168486604051613ddd9190614dd9565b5f6040518083038185875af1925050503d805f8114613e17576040519150601f19603f3d011682016040523d82523d5f602084013e613e1c565b606091505b5091509150613101868383613e34565b611f99612ea5565b606082613e4957613e4482613e90565b610990565b8151158015613e6057506001600160a01b0384163b155b15613e8957604051639996b31560e01b81526001600160a01b03851660048201526024016109d3565b5080610990565b805115613ea05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f5b83811015613ed3578181015183820152602001613ebb565b50505f910152565b5f8151808452613ef2816020860160208601613eb9565b601f01601f19169290920160200192915050565b602081525f6109906020830184613edb565b6001600160a01b0381168114610ae2575f80fd5b8035613f3781613f18565b919050565b5f8060408385031215613f4d575f80fd5b8235613f5881613f18565b946020939093013593505050565b5f805f60608486031215613f78575f80fd5b8335613f8381613f18565b92506020840135613f9381613f18565b929592945050506040919091013590565b5f60208284031215613fb4575f80fd5b813561099081613f18565b5f60208284031215613fcf575f80fd5b5035919050565b5f60208284031215613fe6575f80fd5b81356001600160401b03811115613ffb575f80fd5b82016101608185031215610990575f80fd5b5f610100828403121561401e575f80fd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b038111828210171561405a5761405a614024565b60405290565b604080519081016001600160401b038111828210171561405a5761405a614024565b60405161010081016001600160401b038111828210171561405a5761405a614024565b604051601f8201601f191681016001600160401b03811182821017156140cd576140cd614024565b604052919050565b5f6001600160401b038211156140ed576140ed614024565b50601f01601f191660200190565b5f82601f83011261410a575f80fd5b813561411d614118826140d5565b6140a5565b818152846020838601011115614131575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80848603610120811215614162575f80fd5b60c081121561416f575f80fd5b50614178614038565b853561418381613f18565b8152602086013561419381613f18565b80602083015250604086013560408201526060860135606082015260808601356141bc81613f18565b608082015260a086013560ff811681146141d4575f80fd5b60a0820152935060c08501356001600160401b038111156141f3575f80fd5b6141ff878288016140fb565b949794965050505060e0830135926101000135919050565b5f6040828403121561401e575f80fd5b5f805f806060858703121561423a575f80fd5b84359350602085013561424c81613f18565b925060408501356001600160401b0380821115614267575f80fd5b818701915087601f83011261427a575f80fd5b813581811115614288575f80fd5b886020828501011115614299575f80fd5b95989497505060200194505050565b5f80604083850312156142b9575f80fd5b82356142c481613f18565b915060208301356142d481613f18565b809150509250929050565b600181811c908216806142f357607f821691505b60208210810361401e57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156108fa576108fa614311565b818103818111156108fa576108fa614311565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b80820281158282048414176108fa576108fa614311565b5f8261440e57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b81516001600160a01b0316815260208083015190820152604081016108fa565b602081525f82516005811061446a57634e487b7160e01b5f52602160045260245ffd5b8060208401525060208301516040808401526117f86060840182613edb565b6020808252602f908201527f4e6174697665546f6b656e52656d6f74653a20636f6e747261637420756e646560408201526e1c98dbdb1b185d195c985b1a5e9959608a1b606082015260800190565b5f602082840312156144e8575f80fd5b5051919050565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b8084101561457c5784518316825293850193600193909301929085019061455a565b5060a0880151878203601f190160e0890152945061459a8186613edb565b98975050505050505050565b5f82601f8301126145b5575f80fd5b81516145c3614118826140d5565b8181528460208386010111156145d7575f80fd5b6117f8826020830160208701613eb9565b5f602082840312156145f8575f80fd5b81516001600160401b038082111561460e575f80fd5b9083019060408286031215614621575f80fd5b614629614060565b825160058110614637575f80fd5b815260208301518281111561464a575f80fd5b614656878286016145a6565b60208301525095945050505050565b8051613f3781613f18565b5f60408284031215614680575f80fd5b614688614060565b825161469381613f18565b81526020928301519281019290925250919050565b5f602082840312156146b8575f80fd5b81516001600160401b03808211156146ce575f80fd5b9083019061010082860312156146e2575f80fd5b6146ea614082565b825181526146fa60208401614665565b602082015261470b60408401614665565b604082015261471c60608401614665565b60608201526080830151608082015260a08301518281111561473c575f80fd5b614748878286016145a6565b60a08301525060c083015160c082015261476460e08401614665565b60e082015295945050505050565b5f60208284031215614782575f80fd5b815161099081613f18565b6020808252602b908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20626c60408201526a1bd8dad8da185a5b88125160aa1b606082015260800190565b60208082526037908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20746f60408201527f6b656e207472616e736665727265722061646472657373000000000000000000606082015260800190565b60208082526024908201527f546f6b656e52656d6f74653a207a65726f20726571756972656420676173206c6040820152631a5b5a5d60e21b606082015260800190565b5f808335601e1984360301811261488e575f80fd5b8301803591506001600160401b038211156148a7575f80fd5b602001915036819003821315613be5575f80fd5b60208152815160208201525f602083015160018060a01b0380821660408501528060408601511660608501525050606083015161490360808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c085015261492a610120850183613edb565b915060c085015160e085015260e085015161494f828601826001600160a01b03169052565b5090949350505050565b5f808335601e1984360301811261496e575f80fd5b83016020810192503590506001600160401b0381111561498c575f80fd5b803603821315613be5575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60408152823560408201525f6149da60208501613f2c565b6001600160a01b031660608301526149f460408501613f2c565b6001600160a01b03166080830152614a0f6060850185614959565b6101608060a0860152614a276101a08601838561499a565b9250608087013560c086015260a087013560e0860152614a4960c08801613f2c565b9150610100614a62818701846001600160a01b03169052565b614a6e60e08901613f2c565b9250610120614a87818801856001600160a01b03169052565b614a92828a01613f2c565b93506101409150614aad828801856001600160a01b03169052565b880135918601919091529095013561018084015260209092019290925292915050565b60208152614aea6020820183516001600160a01b03169052565b602082015160408201525f6040830151614b0f60608401826001600160a01b03169052565b5060608301516001600160a01b038116608084015250608083015160a083015260a08301516101608060c0850152614b4b610180850183613edb565b915060c085015160e085015260e0850151610100614b73818701836001600160a01b03169052565b860151610120868101919091528601519050610140614b9c818701836001600160a01b03169052565b959095015193019290925250919050565b8235815261012081016020840135614bc481613f18565b6001600160a01b039081166020840152604085013590614be382613f18565b166040830152614bf560608501613f2c565b6001600160a01b0381166060840152506080840135608083015260a084013560a083015260c084013560c0830152614c2f60e08501613f2c565b6001600160a01b031660e083015261010090910191909152919050565b8481526001600160a01b038481166020830152831660408201526080606082018190525f9061310190830184613edb565b6020808252603a908201527f546f6b656e52656d6f74653a20696e76616c69642064657374696e6174696f6e60408201527f20746f6b656e207472616e736665727265722061646472657373000000000000606082015260800190565b601f82111561158f57805f5260205f20601f840160051c81016020851015614cff5750805b601f840160051c820191505b81811015611f92575f8155600101614d0b565b81516001600160401b03811115614d3757614d37614024565b614d4b81614d4584546142df565b84614cda565b602080601f831160018114614d7e575f8415614d675750858301515b5f19600386901b1c1916600185901b17855561126e565b5f85815260208120601f198616915b82811015614dac57888601518255948401946001909101908401614d8d565b5085821015614dc957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614dea818460208701613eb9565b9190910192915050565b5f60208284031215614e04575f80fd5b81518015158114610990575f80fd5b60ff82811682821603908111156108fa576108fa614311565b600181815b80851115614e6657815f1904821115614e4c57614e4c614311565b80851615614e5957918102915b93841c9390800290614e31565b509250929050565b5f82614e7c575060016108fa565b81614e8857505f6108fa565b8160018114614e9e5760028114614ea857614ec4565b60019150506108fa565b60ff841115614eb957614eb9614311565b50506001821b6108fa565b5060208310610133831016604e8410600b8410161715614ee7575081810a6108fa565b614ef18383614e2c565b805f1904821115614f0457614f04614311565b029392505050565b5f6109908383614e6e56fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00d2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c750069a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf500de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a26469706673582212201b8ce1a3a17a5a05b783dcb054aa6995d382f3f04a539a1c6e898952e34d7a1b64736f6c6343000819003354656c65706f7274657252656769737472794170703a20696e76616c69642054", + Bin: "0x608060405234801561000f575f80fd5b50604051615fee380380615fee83398101604081905261002e91610cb3565b61003a84848484610046565b50505050610ff4565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f8115801561008f5750825b90505f826001600160401b031660011480156100aa5750303b155b9050811580156100b8575080155b156100d65760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561010457845460ff60401b1916680100000000000000001785555b61011089898989610161565b831561015657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6101696101fc565b815f036101d75760405162461bcd60e51b815260206004820152603160248201527f4e6174697665546f6b656e52656d6f74653a207a65726f20696e697469616c206044820152707265736572766520696d62616c616e636560781b60648201526084015b60405180910390fd5b6101e1838061024c565b6101ed84836012610262565b6101f681610299565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff1661024a57604051631afcd79f60e31b815260040160405180910390fd5b565b6102546101fc565b61025e8282610323565b5050565b61026a6101fc565b825160208401516040850151610281929190610386565b6102896103a1565b6102948383836103b1565b505050565b6102a16101fc565b606481106102ff5760405162461bcd60e51b815260206004820152602560248201527f4e6174697665546f6b656e52656d6f74653a20696e76616c69642070657263656044820152646e7461676560d81b60648201526084016101ce565b7f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf50055565b61032b6101fc565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036103778482610df9565b50600481016101f68382610df9565b61038e6101fc565b61039883826106fb565b6102948261071d565b6103a96101fc565b61024a61072e565b6103b96101fc565b5f7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090507302000000000000000000000000000000000000056001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561042d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104519190610eb8565b815560608401516104b75760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b60648201526084016101ce565b80546060850151036105315760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d65000000000060648201526084016101ce565b60808401516001600160a01b03166105975760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b60648201526084016101ce565b60128460a0015160ff1611156106015760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b60648201526084016101ce565b60128260ff1611156106615760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b60648201526084016101ce565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b918616919091021790556106dd9083610758565b60048301805460ff1916911515919091179055600390910155505050565b6107036101fc565b61070b6107a0565b6107136107b0565b61025e82826107b8565b6107256101fc565b6100438161093c565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75005b6001905550565b5f8060ff80851690841611818161077b576107738587610ee3565b60ff16610789565b6107858686610ee3565b60ff165b61079490600a610fe2565b96919550909350505050565b6107a86101fc565b61024a610976565b61024a6101fc565b6107c06101fc565b6001600160a01b03821661083c5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016101ce565b5f7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0090505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c59190610eb8565b1161091a5760405162461bcd60e51b815260206004820152603260248201525f80516020615fce833981519152604482015271656c65706f7274657220726567697374727960701b60648201526084016101ce565b81546001600160a01b0319166001600160a01b0382161782556101f6836109a5565b6109446101fc565b6001600160a01b03811661096d57604051631e4fbdf760e01b81525f60048201526024016101ce565b61004381610b3d565b61097e6101fc565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00610751565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015610a0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a309190610eb8565b600283015490915081841115610a8f5760405162461bcd60e51b815260206004820152603160248201525f80516020615fce83398151915260448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016101ce565b808411610b045760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016101ce565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b0381118282101715610be357610be3610bad565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610c1157610c11610bad565b604052919050565b80516001600160a01b0381168114610c2f575f80fd5b919050565b5f82601f830112610c43575f80fd5b81516001600160401b03811115610c5c57610c5c610bad565b6020610c70601f8301601f19168201610be9565b8281528582848701011115610c83575f80fd5b5f5b83811015610ca0578581018301518282018401528201610c85565b505f928101909101919091529392505050565b5f805f80848603610120811215610cc8575f80fd5b60c0811215610cd5575f80fd5b50610cde610bc1565b610ce786610c19565b8152610cf560208701610c19565b60208201526040860151604082015260608601516060820152610d1a60808701610c19565b608082015260a086015160ff81168114610d32575f80fd5b60a082015260c08601519094506001600160401b03811115610d52575f80fd5b610d5e87828801610c34565b60e08701516101009097015195989097509350505050565b600181811c90821680610d8a57607f821691505b602082108103610da857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561029457805f5260205f20601f840160051c81016020851015610dd35750805b601f840160051c820191505b81811015610df2575f8155600101610ddf565b5050505050565b81516001600160401b03811115610e1257610e12610bad565b610e2681610e208454610d76565b84610dae565b602080601f831160018114610e59575f8415610e425750858301515b5f19600386901b1c1916600185901b178555610eb0565b5f85815260208120601f198616915b82811015610e8757888601518255948401946001909101908401610e68565b5085821015610ea457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215610ec8575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b60ff8281168282160390811115610efc57610efc610ecf565b92915050565b600181815b80851115610f3c57815f1904821115610f2257610f22610ecf565b80851615610f2f57918102915b93841c9390800290610f07565b509250929050565b5f82610f5257506001610efc565b81610f5e57505f610efc565b8160018114610f745760028114610f7e57610f9a565b6001915050610efc565b60ff841115610f8f57610f8f610ecf565b50506001821b610efc565b5060208310610133831016604e8410600b8410161715610fbd575081810a610efc565b610fc78383610f02565b805f1904821115610fda57610fda610ecf565b029392505050565b5f610fed8383610f44565b9392505050565b614fcd806110015f395ff3fe608060405260043610610280575f3560e01c8063715018a61161014e578063b8a46d02116100c0578063dd62ed3e11610079578063dd62ed3e14610736578063e0fd9cb814610755578063ed0ae4b014610452578063ef793e2a14610769578063f2fde38b1461077d578063f3f981d81461079c5761028f565b8063b8a46d02146106b9578063c3cd6927146106d8578063c452165e146106ec578063c868efaa14610703578063d0e30db01461028f578063d2cc7a70146107225761028f565b80638f6cec88116101125780638f6cec8814610608578063909a6ac01461062757806395d89b4114610647578063973142971461065b578063a5717bc01461067a578063a9059cbb1461069a5761028f565b8063715018a61461057b57806371717c181461058f5780637ee3779a146105a55780638bf2fa94146105b95780638da5cb5b146105cc5761028f565b80632e1a7d4d116101f25780634511243e116101ab5780634511243e146104b55780635507f3d1146104d457806355538c8b146104ea5780635eb99514146105095780636e6eef8d1461052857806370a082311461053b5761028f565b80632e1a7d4d146103e6578063313ce56714610405578063329c3e1214610420578063347212c41461045257806335cac1591461046e5780634213cf78146104a15761028f565b806315beb59f1161024457806315beb59f1461035557806318160ddd1461036a5780631906529c1461037e57806323b872dd14610392578063254ac160146103b15780632b0d8f18146103c75761028f565b806302a30c7d1461029757806306fdde03146102c05780630733c8c8146102e1578063095ea7b3146103035780630ca1c5c9146103225761028f565b3661028f5761028d6107bb565b005b61028d6107bb565b3480156102a2575f80fd5b506102ab6107fc565b60405190151581526020015b60405180910390f35b3480156102cb575f80fd5b506102d4610813565b6040516102b79190613f06565b3480156102ec575f80fd5b506102f56108d3565b6040519081526020016102b7565b34801561030e575f80fd5b506102ab61031d366004613f3c565b6108e7565b34801561032d575f80fd5b507f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf501546102f5565b348015610360575f80fd5b506102f56105dc81565b348015610375575f80fd5b506102f5610900565b348015610389575f80fd5b506102f561091b565b34801561039d575f80fd5b506102ab6103ac366004613f66565b610972565b3480156103bc575f80fd5b506102f56201fbd081565b3480156103d2575f80fd5b5061028d6103e1366004613fa4565b610997565b3480156103f1575f80fd5b5061028d610400366004613fbf565b610a99565b348015610410575f80fd5b50604051601281526020016102b7565b34801561042b575f80fd5b5061043a6001600160991b0181565b6040516001600160a01b0390911681526020016102b7565b34801561045d575f80fd5b5061043a62010203600160981b0181565b348015610479575f80fd5b506102f57f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0081565b3480156104ac575f80fd5b506102f5610ae5565b3480156104c0575f80fd5b5061028d6104cf366004613fa4565b610af6565b3480156104df575f80fd5b506102f56205302081565b3480156104f5575f80fd5b5061028d610504366004613fbf565b610be5565b348015610514575f80fd5b5061028d610523366004613fbf565b610ef7565b61028d610536366004613fd6565b610f08565b348015610546575f80fd5b506102f5610555366004613fa4565b6001600160a01b03165f9081525f80516020614f18833981519152602052604090205490565b348015610586575f80fd5b5061028d610f36565b34801561059a575f80fd5b506102f56205573081565b3480156105b0575f80fd5b506102ab610f47565b61028d6105c736600461400d565b610f5e565b3480156105d7575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031661043a565b348015610613575f80fd5b5061028d61062236600461414d565b610f8c565b348015610632575f80fd5b506102f55f80516020614f7883398151915281565b348015610652575f80fd5b506102d461109e565b348015610666575f80fd5b506102ab610675366004613fa4565b6110dc565b348015610685575f80fd5b506102f55f80516020614f5883398151915281565b3480156106a5575f80fd5b506102ab6106b4366004613f3c565b6110f5565b3480156106c4575f80fd5b5061028d6106d3366004614217565b611102565b3480156106e3575f80fd5b5061043a611276565b3480156106f7575f80fd5b5061043a600160981b81565b34801561070e575f80fd5b5061028d61071d366004614227565b611293565b34801561072d575f80fd5b506102f5611450565b348015610741575f80fd5b506102f56107503660046142a8565b611465565b348015610760575f80fd5b506102f56114ae565b348015610774575f80fd5b506102f56114c2565b348015610788575f80fd5b5061028d610797366004613fa4565b6114d6565b3480156107a7575f80fd5b506102f56107b6366004613fbf565b611510565b60405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a26107fa3334611526565b565b5f8061080661155e565b6006015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f80516020614f1883398151915291610851906142df565b80601f016020809104026020016040519081016040528092919081815260200182805461087d906142df565b80156108c85780601f1061089f576101008083540402835291602001916108c8565b820191905f5260205f20905b8154815290600101906020018083116108ab57829003601f168201915b505050505091505090565b5f806108dd61155e565b6003015492915050565b5f336108f4818585611582565b60019150505b92915050565b5f805f80516020614f188339815191525b6002015492915050565b5f5f80516020614f588339815191528161094462010203600160981b0131600160981b31614325565b90505f61094f6114c2565b836001015461095e9190614325565b905061096a8282614338565b935050505090565b5f3361097f858285611594565b61098a8585856115f1565b60019150505b9392505050565b5f80516020614f788339815191526109ad61164e565b6001600160a01b0382166109dc5760405162461bcd60e51b81526004016109d39061434b565b60405180910390fd5b6109e68183611656565b15610a495760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b60648201526084016109d3565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b60405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a2610ad83382611677565b610ae233826116ab565b50565b5f80610aef61155e565b5492915050565b5f80516020614f78833981519152610b0c61164e565b6001600160a01b038216610b325760405162461bcd60e51b81526004016109d39061434b565b610b3c8183611656565b610b9a5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b60648201526084016109d3565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b5f80516020614f388339815191528054600114610c145760405162461bcd60e51b81526004016109d390614399565b600281557f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf502545f80516020614f5883398151915290600160981b31908111610cd25760405162461bcd60e51b8152602060048201526044602482018190527f4e6174697665546f6b656e52656d6f74653a206275726e206164647265737320908201527f62616c616e6365206e6f742067726561746572207468616e206c6173742072656064820152631c1bdc9d60e21b608482015260a4016109d3565b5f826002015482610ce39190614338565b90505f6064845f015483610cf791906143dd565b610d0191906143f4565b90505f610d0e8284614338565b6002860185905590508115610d3157610d27308361173e565b610d313083611526565b5f610d4b610d3d6108d3565b610d45610f47565b846117eb565b11610db55760405162461bcd60e51b815260206004820152603460248201527f4e6174697665546f6b656e52656d6f74653a207a65726f207363616c6564206160448201527336b7bab73a103a37903932b837b93a10313ab93760611b60648201526084016109d3565b604080518082018252600181528151808301835262010203600160981b018152602080820185905292515f9380840192610df192909101614427565b60405160208183030381529060405281525090505f610eac6040518060c00160405280610e1c6114ae565b8152602001610e29611276565b6001600160a01b0316815260408051808201825230815260208181018a905283015281018c90526060015f5b604051908082528060200260200182016040528015610e7e578160200160208202803683370190505b50815260200184604051602001610e959190614447565b604051602081830303815290604052815250611800565b9050807f0832c643b65d6d3724ed14ac3a655fbc7cae54fb010918b2c2f70ef6b1bb94a584604051610ee091815260200190565b60405180910390a250506001909555505050505050565b610eff61164e565b610ae28161191b565b610f106107fc565b610f2c5760405162461bcd60e51b81526004016109d390614489565b610ae28134611ab3565b610f3e611b2a565b6107fa5f611b85565b5f80610f5161155e565b6004015460ff1692915050565b610f666107fc565b610f825760405162461bcd60e51b81526004016109d390614489565b610ae28134611bf5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610fd05750825b90505f826001600160401b03166001148015610feb5750303b155b905081158015610ff9575080155b156110175760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561104157845460ff60401b1916600160401b1785555b61104d89898989611c61565b831561109357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f80516020614f1883398151915291610851906142df565b5f5f80516020614f788339815191526109908184611656565b5f336108f48185856115f1565b5f61110b61155e565b6006810154909150610100900460ff16156111685760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e52656d6f74653a20616c726561647920726567697374657265640060448201526064016109d3565b604080516060808201835260058401548252600284015460ff600160a01b820481166020808601918252600160a81b9093048216858701908152865180880188525f808252885188518188015293518516848a015291519093168286015286518083039095018552608090910190955280820192909252919290916111fd906111f390870187613fa4565b8660200135611cf1565b6040805160c0810182526001870154815260028701546001600160a01b03166020808301919091528251808401845293945061126e939192830191908190611247908b018b613fa4565b6001600160a01b0316815260209081018690529082526201fbd0908201526040015f610e55565b505050505050565b5f8061128061155e565b600201546001600160a01b031692915050565b61129b611d38565b5f5f80516020614f7883398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611306573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132a91906144d8565b10156113915760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b60648201526084016109d3565b61139b8133611656565b156114015760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b60648201526084016109d3565b611441858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611d8292505050565b5061144a611f99565b50505050565b5f805f80516020614f78833981519152610911565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f806114b861155e565b6001015492915050565b5f806114cc61155e565b6005015492915050565b6114de611b2a565b6001600160a01b03811661150757604051631e4fbdf760e01b81525f60048201526024016109d3565b610ae281611b85565b5f600561151e83601f614325565b901c92915050565b6001600160a01b03821661154f5760405163ec442f0560e01b81525f60048201526024016109d3565b61155a5f8383611fc3565b5050565b7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090565b61158f83838360016120fc565b505050565b5f61159f8484611465565b90505f19811461144a57818110156115e357604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016109d3565b61144a84848484035f6120fc565b6001600160a01b03831661161a57604051634b637e8f60e11b81525f60048201526024016109d3565b6001600160a01b0382166116435760405163ec442f0560e01b81525f60048201526024016109d3565b61158f838383611fc3565b6107fa611b2a565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b6001600160a01b0382166116a057604051634b637e8f60e11b81525f60048201526024016109d3565b61155a825f83611fc3565b804710156116ce5760405163cd78605960e01b81523060048201526024016109d3565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611717576040519150601f19603f3d011682016040523d82523d5f602084013e61171c565b606091505b505090508061158f57604051630a12f52160e11b815260040160405180910390fd5b7f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf50180545f80516020614f588339815191529183915f9061177f908490614325565b90915550506040516327ad555d60e11b81526001600160a01b0384166004820152602481018390526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156117d0575f80fd5b505af11580156117e2573d5f803e3d5ffd5b50505050505050565b5f6117f88484845f6121df565b949350505050565b5f8061180a61220f565b604084015160200151909150156118af576040830151516001600160a01b031661188c5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b60648201526084016109d3565b6040830151602081015190516118af916001600160a01b039091169083906122ff565b604051630624488560e41b81526001600160a01b038216906362448850906118db9086906004016144ef565b6020604051808303815f875af11580156118f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099091906144d8565b5f80516020614f7883398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa15801561196f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061199391906144d8565b600283015490915081841115611a055760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016109d3565b808411611a7a5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016109d3565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b5f80516020614f388339815191528054600114611ae25760405162461bcd60e51b81526004016109d390614399565b600281555f611aef61155e565b9050611afa84612386565b6001810154843503611b1657611b1084846125c0565b50611b22565b611b1084846127e4565b505b600190555050565b33611b5c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107fa5760405163118cdaa760e01b81523360048201526024016109d3565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f80516020614f388339815191528054600114611c245760405162461bcd60e51b81526004016109d390614399565b600281555f611c3161155e565b9050611c3c84612a85565b6001810154843503611c5757611c528484612b70565b611b20565b611b208484612cdf565b611c69612ea5565b815f03611cd25760405162461bcd60e51b815260206004820152603160248201527f4e6174697665546f6b656e52656d6f74653a207a65726f20696e697469616c206044820152707265736572766520696d62616c616e636560781b60648201526084016109d3565b611cdc8384612eee565b611ce884836012612f00565b61144a81612f31565b5f815f03611d0057505f6108fa565b306001600160a01b03841603611d2d57611d1b333084611594565b611d263330846115f1565b50806108fa565b610990833384612fa8565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611d7c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f611d8b61155e565b905080600101548414611df25760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20696e76616c696420736f7572636520626c6f636044820152681ad8da185a5b88125160ba1b60648201526084016109d3565b60028101546001600160a01b03848116911614611e645760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a20696e76616c6964206f726967696e2073656e646044820152696572206164647265737360b01b60648201526084016109d3565b5f82806020019051810190611e7991906145e8565b6006830154909150610100900460ff161580611e9a5750600682015460ff16155b15611eb15760068201805461ffff19166101011790555b600181516004811115611ec657611ec6614413565b03611efd575f8160200151806020019051810190611ee49190614670565b9050611ef7815f0151826020015161310b565b50611f92565b600281516004811115611f1257611f12614413565b03611f40575f8160200151806020019051810190611f3091906146a8565b9050611ef7818260800151613158565b60405162461bcd60e51b815260206004820152602160248201527f546f6b656e52656d6f74653a20696e76616c6964206d657373616765207479706044820152606560f81b60648201526084016109d3565b5050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b5f80516020614f188339815191526001600160a01b038416611ffd5781816002015f828254611ff29190614325565b9091555061206d9050565b6001600160a01b0384165f908152602082905260409020548281101561204f5760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016109d3565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b03831661208b5760028101805483900390556120a9565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120ee91815260200190565b60405180910390a350505050565b5f80516020614f188339815191526001600160a01b0385166121335760405163e602df0560e01b81525f60048201526024016109d3565b6001600160a01b03841661215c57604051634a1406b160e11b81525f60048201526024016109d3565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115611f9257836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516121d091815260200190565b60405180910390a35050505050565b5f811515841515036121fc576121f585846143dd565b90506117f8565b61220685846143f4565b95945050505050565b5f80516020614f7883398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612269573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228d9190614772565b90506122998282611656565b156108fa5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b60648201526084016109d3565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa15801561234c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061237091906144d8565b905061144a84846123818585614325565b613282565b80356123a45760405162461bcd60e51b81526004016109d39061478d565b5f6123b56040830160208401613fa4565b6001600160a01b0316036123db5760405162461bcd60e51b81526004016109d3906147d8565b5f6123ec6060830160408401613fa4565b6001600160a01b0316036124575760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420636f6e7460448201526b72616374206164647265737360a01b60648201526084016109d3565b5f81608001351161247a5760405162461bcd60e51b81526004016109d390614835565b5f8160a00135116124db5760405162461bcd60e51b815260206004820152602560248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420676173206044820152641b1a5b5a5d60da1b60648201526084016109d3565b80608001358160a00135106125435760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a20696e76616c696420726563697069656e742067604482015267185cc81b1a5b5a5d60c21b60648201526084016109d3565b5f612555610100830160e08401613fa4565b6001600160a01b031603610ae25760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f2066616c6c6261636b20726563697060448201526b69656e74206164647265737360a01b60648201526084016109d3565b5f6125c961155e565b90506125f96125de6040850160208601613fa4565b6101408501356125f460e0870160c08801613fa4565b61333f565b5f6126218361261061012087016101008801613fa4565b86610120013587610140013561343c565b6040805180820190915291945091505f908060028152602001604051806101000160405280865f01548152602001306001600160a01b031681526020016126653390565b6001600160a01b0316815260200161268360608a0160408b01613fa4565b6001600160a01b03168152602081018890526040016126a560608a018a614879565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a089013560208201526040016126f96101008a0160e08b01613fa4565b6001600160a01b0316905260405161271491906020016148bb565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92612796928201908061276e6101208c016101008d01613fa4565b6001600160a01b03168152602090810188905290825260808a0135908201526040015f610e55565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b1688886040516127d49291906149c2565b60405180910390a3505050505050565b5f6127ed61155e565b905061281983356128046040860160208701613fa4565b61281460e0870160c08801613fa4565b6134ff565b5f6128308361261061012087016101008801613fa4565b6040805180820190915291945091505f90806004815260200160405180610160016040528061285c3390565b6001600160a01b03168152602001885f013581526020018860200160208101906128869190613fa4565b6001600160a01b031681526020016128a460608a0160408b01613fa4565b6001600160a01b03168152602081018890526040016128c660608a018a614879565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a0890135602082015260400161291a6101008a0160e08b01613fa4565b6001600160a01b031681526080890135602082015260400161294260e08a0160c08b01613fa4565b6001600160a01b03168152610140890135602091820152604051612967929101614ad0565b60408051601f19818403018152919052905290505f6105dc61299661298f6060890189614879565b9050611510565b6129a091906143dd565b6129ad9062055730614325565b6040805160c0810182526001870154815260028701546001600160a01b03166020820152815180830183529293505f92612a3692820190806129f76101208d016101008e01613fa4565b6001600160a01b031681526020908101899052908252818101869052604080515f815280830182528184015251606090920191610e9591889101614447565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168989604051612a749291906149c2565b60405180910390a350505050505050565b5f612a966060830160408401613fa4565b6001600160a01b031603612af85760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e74206164647260448201526265737360e81b60648201526084016109d3565b5f8160c0013511612b1b5760405162461bcd60e51b81526004016109d390614835565b8035612b395760405162461bcd60e51b81526004016109d39061478d565b5f612b4a6040830160208401613fa4565b6001600160a01b031603610ae25760405162461bcd60e51b81526004016109d3906147d8565b5f612b7961155e565b9050612ba4612b8e6040850160208601613fa4565b60a08501356125f4610100870160e08801613fa4565b5f612bc883612bb96080870160608801613fa4565b86608001358760a0013561343c565b6040805180820190915291945091505f9080600181526020016040518060400160405280886040016020810190612bff9190613fa4565b6001600160a01b0316815260200187815250604051602001612c219190614427565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92612ca19282019080612c7960808c0160608d01613fa4565b6001600160a01b03168152602090810188905290825260c08a0135908201526040015f610e55565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb5288886040516127d4929190614bad565b5f612ce861155e565b9050612d108335612cff6040860160208701613fa4565b612814610100870160e08801613fa4565b5f612d2583612bb96080870160608801613fa4565b60408051808201825260038152815160e081018352883581529396509193505f9260208084019282820191612d5e918b01908b01613fa4565b6001600160a01b03168152602001612d7c60608a0160408b01613fa4565b6001600160a01b031681526020810188905260a0890135604082015260c08901356060820152608001612db66101008a0160e08b01613fa4565b6001600160a01b03169052604051612e269190602001815181526020808301516001600160a01b0390811691830191909152604080840151821690830152606080840151908301526080808401519083015260a0808401519083015260c092830151169181019190915260e00190565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92612ca19282019080612e7e60808c0160608d01613fa4565b6001600160a01b03168152602090810188905290825262053020908201526040015f610e55565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107fa57604051631afcd79f60e31b815260040160405180910390fd5b612ef6612ea5565b61155a828261359d565b612f08612ea5565b612f1e835f0151846020015185604001516135ed565b612f26613608565b61158f838383613618565b612f39612ea5565b60648110612f975760405162461bcd60e51b815260206004820152602560248201527f4e6174697665546f6b656e52656d6f74653a20696e76616c69642070657263656044820152646e7461676560d81b60648201526084016109d3565b5f80516020614f5883398151915255565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa158015612fee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061301291906144d8565b90506130296001600160a01b03861685308661393c565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa15801561306d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061309191906144d8565b90508181116130f75760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016109d3565b6131018282614338565b9695505050505050565b816001600160a01b03167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b8260405161314691815260200190565b60405180910390a261155a828261173e565b613162308261173e565b5f825f0151836020015184604001518560a001516040516024016131899493929190614c4c565b60408051601f198184030181529190526020810180516001600160e01b031663161b12ff60e11b17905260c084015160608501519192505f916131cf9190859085613975565b905080156132235783606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff48460405161321691815260200190565b60405180910390a261144a565b83606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb08460405161326291815260200190565b60405180910390a260e084015161144a906001600160a01b0316846116ab565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526132d38482613a45565b61144a576040516001600160a01b0384811660248301525f604483015261333591869182169063095ea7b3906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613ae2565b61144a8482613ae2565b5f61334861155e565b60028101549091506001600160a01b0385811691161461337a5760405162461bcd60e51b81526004016109d390614c7d565b82156133d45760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f207365636f6e646172792060448201526266656560e81b60648201526084016109d3565b6001600160a01b0382161561144a5760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f206d756c74692d686f702060448201526766616c6c6261636b60c01b60648201526084016109d3565b5f805f61344761155e565b905061345287613b43565b965061345e8686611cf1565b600382015460048301549196506134789160ff16866117eb565b60038201546004830154613490919060ff168a6117eb565b116134f25760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a20696e73756666696369656e7420746f6b656e7360448201526b103a37903a3930b739b332b960a11b60648201526084016109d3565b5094959294509192505050565b5f61350861155e565b8054909150840361353b57306001600160a01b0384160361353b5760405162461bcd60e51b81526004016109d390614c7d565b6001600160a01b03821661144a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f206d756c74692d686f702066616c6c6044820152636261636b60e01b60648201526084016109d3565b6135a5612ea5565b5f80516020614f188339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036135de8482614d1e565b506004810161144a8382614d1e565b6135f5612ea5565b6135ff8382613b5b565b61158f82613b7d565b613610612ea5565b6107fa613b8e565b613620612ea5565b5f61362961155e565b90506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561366e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061369291906144d8565b815560608401516136f85760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b60648201526084016109d3565b80546060850151036137725760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d65000000000060648201526084016109d3565b60808401516001600160a01b03166137d85760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b60648201526084016109d3565b60128460a0015160ff1611156138425760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b60648201526084016109d3565b60128260ff1611156138a25760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b60648201526084016109d3565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b9186169190910217905561391e9083613ba2565b60048301805460ff1916911515919091179055600390910155505050565b6040516001600160a01b03848116602483015283811660448301526064820183905261144a9186918216906323b872dd90608401613303565b5f845a10156139c65760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e7420676173000000000060448201526064016109d3565b83471015613a165760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c756500000060448201526064016109d3565b826001600160a01b03163b5f03613a2e57505f6117f8565b5f805f84516020860188888bf19695505050505050565b5f805f846001600160a01b031684604051613a609190614dd9565b5f604051808303815f865af19150503d805f8114613a99576040519150601f19603f3d011682016040523d82523d5f602084013e613a9e565b606091505b5091509150818015613ac8575080511580613ac8575080806020019051810190613ac89190614df4565b80156122065750505050506001600160a01b03163b151590565b5f613af66001600160a01b03841683613bec565b905080515f14158015613b1a575080806020019051810190613b189190614df4565b155b1561158f57604051635274afe760e01b81526001600160a01b03841660048201526024016109d3565b5f613b5762010203600160981b01836116ab565b5090565b613b63612ea5565b613b6b613bf9565b613b73613c09565b61155a8282613c11565b613b85612ea5565b610ae281613d95565b5f5f80516020614f38833981519152611fbc565b5f8060ff808516908416118181613bc557613bbd8587614e13565b60ff16613bd3565b613bcf8686614e13565b60ff165b613bde90600a614f0c565b9350909150505b9250929050565b606061099083835f613d9d565b613c01612ea5565b6107fa613e2c565b6107fa612ea5565b613c19612ea5565b6001600160a01b038216613c955760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016109d3565b5f5f80516020614f7883398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ce7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d0b91906144d8565b11613d735760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b60648201526084016109d3565b81546001600160a01b0319166001600160a01b03821617825561144a8361191b565b6114de612ea5565b606081471015613dc25760405163cd78605960e01b81523060048201526024016109d3565b5f80856001600160a01b03168486604051613ddd9190614dd9565b5f6040518083038185875af1925050503d805f8114613e17576040519150601f19603f3d011682016040523d82523d5f602084013e613e1c565b606091505b5091509150613101868383613e34565b611f99612ea5565b606082613e4957613e4482613e90565b610990565b8151158015613e6057506001600160a01b0384163b155b15613e8957604051639996b31560e01b81526001600160a01b03851660048201526024016109d3565b5080610990565b805115613ea05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f5b83811015613ed3578181015183820152602001613ebb565b50505f910152565b5f8151808452613ef2816020860160208601613eb9565b601f01601f19169290920160200192915050565b602081525f6109906020830184613edb565b6001600160a01b0381168114610ae2575f80fd5b8035613f3781613f18565b919050565b5f8060408385031215613f4d575f80fd5b8235613f5881613f18565b946020939093013593505050565b5f805f60608486031215613f78575f80fd5b8335613f8381613f18565b92506020840135613f9381613f18565b929592945050506040919091013590565b5f60208284031215613fb4575f80fd5b813561099081613f18565b5f60208284031215613fcf575f80fd5b5035919050565b5f60208284031215613fe6575f80fd5b81356001600160401b03811115613ffb575f80fd5b82016101608185031215610990575f80fd5b5f610100828403121561401e575f80fd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b038111828210171561405a5761405a614024565b60405290565b604080519081016001600160401b038111828210171561405a5761405a614024565b60405161010081016001600160401b038111828210171561405a5761405a614024565b604051601f8201601f191681016001600160401b03811182821017156140cd576140cd614024565b604052919050565b5f6001600160401b038211156140ed576140ed614024565b50601f01601f191660200190565b5f82601f83011261410a575f80fd5b813561411d614118826140d5565b6140a5565b818152846020838601011115614131575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80848603610120811215614162575f80fd5b60c081121561416f575f80fd5b50614178614038565b853561418381613f18565b8152602086013561419381613f18565b80602083015250604086013560408201526060860135606082015260808601356141bc81613f18565b608082015260a086013560ff811681146141d4575f80fd5b60a0820152935060c08501356001600160401b038111156141f3575f80fd5b6141ff878288016140fb565b949794965050505060e0830135926101000135919050565b5f6040828403121561401e575f80fd5b5f805f806060858703121561423a575f80fd5b84359350602085013561424c81613f18565b925060408501356001600160401b0380821115614267575f80fd5b818701915087601f83011261427a575f80fd5b813581811115614288575f80fd5b886020828501011115614299575f80fd5b95989497505060200194505050565b5f80604083850312156142b9575f80fd5b82356142c481613f18565b915060208301356142d481613f18565b809150509250929050565b600181811c908216806142f357607f821691505b60208210810361401e57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156108fa576108fa614311565b818103818111156108fa576108fa614311565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b80820281158282048414176108fa576108fa614311565b5f8261440e57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b81516001600160a01b0316815260208083015190820152604081016108fa565b602081525f82516005811061446a57634e487b7160e01b5f52602160045260245ffd5b8060208401525060208301516040808401526117f86060840182613edb565b6020808252602f908201527f4e6174697665546f6b656e52656d6f74653a20636f6e747261637420756e646560408201526e1c98dbdb1b185d195c985b1a5e9959608a1b606082015260800190565b5f602082840312156144e8575f80fd5b5051919050565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b8084101561457c5784518316825293850193600193909301929085019061455a565b5060a0880151878203601f190160e0890152945061459a8186613edb565b98975050505050505050565b5f82601f8301126145b5575f80fd5b81516145c3614118826140d5565b8181528460208386010111156145d7575f80fd5b6117f8826020830160208701613eb9565b5f602082840312156145f8575f80fd5b81516001600160401b038082111561460e575f80fd5b9083019060408286031215614621575f80fd5b614629614060565b825160058110614637575f80fd5b815260208301518281111561464a575f80fd5b614656878286016145a6565b60208301525095945050505050565b8051613f3781613f18565b5f60408284031215614680575f80fd5b614688614060565b825161469381613f18565b81526020928301519281019290925250919050565b5f602082840312156146b8575f80fd5b81516001600160401b03808211156146ce575f80fd5b9083019061010082860312156146e2575f80fd5b6146ea614082565b825181526146fa60208401614665565b602082015261470b60408401614665565b604082015261471c60608401614665565b60608201526080830151608082015260a08301518281111561473c575f80fd5b614748878286016145a6565b60a08301525060c083015160c082015261476460e08401614665565b60e082015295945050505050565b5f60208284031215614782575f80fd5b815161099081613f18565b6020808252602b908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20626c60408201526a1bd8dad8da185a5b88125160aa1b606082015260800190565b60208082526037908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20746f60408201527f6b656e207472616e736665727265722061646472657373000000000000000000606082015260800190565b60208082526024908201527f546f6b656e52656d6f74653a207a65726f20726571756972656420676173206c6040820152631a5b5a5d60e21b606082015260800190565b5f808335601e1984360301811261488e575f80fd5b8301803591506001600160401b038211156148a7575f80fd5b602001915036819003821315613be5575f80fd5b60208152815160208201525f602083015160018060a01b0380821660408501528060408601511660608501525050606083015161490360808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c085015261492a610120850183613edb565b915060c085015160e085015260e085015161494f828601826001600160a01b03169052565b5090949350505050565b5f808335601e1984360301811261496e575f80fd5b83016020810192503590506001600160401b0381111561498c575f80fd5b803603821315613be5575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60408152823560408201525f6149da60208501613f2c565b6001600160a01b031660608301526149f460408501613f2c565b6001600160a01b03166080830152614a0f6060850185614959565b6101608060a0860152614a276101a08601838561499a565b9250608087013560c086015260a087013560e0860152614a4960c08801613f2c565b9150610100614a62818701846001600160a01b03169052565b614a6e60e08901613f2c565b9250610120614a87818801856001600160a01b03169052565b614a92828a01613f2c565b93506101409150614aad828801856001600160a01b03169052565b880135918601919091529095013561018084015260209092019290925292915050565b60208152614aea6020820183516001600160a01b03169052565b602082015160408201525f6040830151614b0f60608401826001600160a01b03169052565b5060608301516001600160a01b038116608084015250608083015160a083015260a08301516101608060c0850152614b4b610180850183613edb565b915060c085015160e085015260e0850151610100614b73818701836001600160a01b03169052565b860151610120868101919091528601519050610140614b9c818701836001600160a01b03169052565b959095015193019290925250919050565b8235815261012081016020840135614bc481613f18565b6001600160a01b039081166020840152604085013590614be382613f18565b166040830152614bf560608501613f2c565b6001600160a01b0381166060840152506080840135608083015260a084013560a083015260c084013560c0830152614c2f60e08501613f2c565b6001600160a01b031660e083015261010090910191909152919050565b8481526001600160a01b038481166020830152831660408201526080606082018190525f9061310190830184613edb565b6020808252603a908201527f546f6b656e52656d6f74653a20696e76616c69642064657374696e6174696f6e60408201527f20746f6b656e207472616e736665727265722061646472657373000000000000606082015260800190565b601f82111561158f57805f5260205f20601f840160051c81016020851015614cff5750805b601f840160051c820191505b81811015611f92575f8155600101614d0b565b81516001600160401b03811115614d3757614d37614024565b614d4b81614d4584546142df565b84614cda565b602080601f831160018114614d7e575f8415614d675750858301515b5f19600386901b1c1916600185901b17855561126e565b5f85815260208120601f198616915b82811015614dac57888601518255948401946001909101908401614d8d565b5085821015614dc957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614dea818460208701613eb9565b9190910192915050565b5f60208284031215614e04575f80fd5b81518015158114610990575f80fd5b60ff82811682821603908111156108fa576108fa614311565b600181815b80851115614e6657815f1904821115614e4c57614e4c614311565b80851615614e5957918102915b93841c9390800290614e31565b509250929050565b5f82614e7c575060016108fa565b81614e8857505f6108fa565b8160018114614e9e5760028114614ea857614ec4565b60019150506108fa565b60ff841115614eb957614eb9614311565b50506001821b6108fa565b5060208310610133831016604e8410600b8410161715614ee7575081810a6108fa565b614ef18383614e2c565b805f1904821115614f0457614f04614311565b029392505050565b5f6109908383614e6e56fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00d2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c750069a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf500de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a2646970667358221220f37de7e1444fadd51a5f41dc5896c716180eb9ac0ae418a9819946f676b3ba3364736f6c6343000819003354656c65706f7274657252656769737472794170703a20696e76616c69642054", } // NativeTokenRemoteABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/ictt/TokenRemote/NativeTokenRemoteUpgradeable/NativeTokenRemoteUpgradeable.go b/abi-bindings/go/ictt/TokenRemote/NativeTokenRemoteUpgradeable/NativeTokenRemoteUpgradeable.go index e116c01c0..273c856a2 100644 --- a/abi-bindings/go/ictt/TokenRemote/NativeTokenRemoteUpgradeable/NativeTokenRemoteUpgradeable.go +++ b/abi-bindings/go/ictt/TokenRemote/NativeTokenRemoteUpgradeable/NativeTokenRemoteUpgradeable.go @@ -75,7 +75,7 @@ type TokenRemoteSettings struct { // NativeTokenRemoteUpgradeableMetaData contains all meta data concerning the NativeTokenRemoteUpgradeable contract. var NativeTokenRemoteUpgradeableMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CallSucceeded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldMinTeleporterVersion\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newMinTeleporterVersion\",\"type\":\"uint256\"}],\"name\":\"MinTeleporterVersionUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feesBurned\",\"type\":\"uint256\"}],\"name\":\"ReportBurnedTxFees\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"TeleporterAddressUnpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensAndCallSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"teleporterMessageID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"BURNED_FOR_TRANSFER_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BURNED_TX_FEES_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOME_CHAIN_BURN_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MULTI_HOP_CALL_GAS_PER_WORD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MULTI_HOP_CALL_REQUIRED_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MULTI_HOP_SEND_REQUIRED_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_MINTER\",\"outputs\":[{\"internalType\":\"contractINativeMinter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_REMOTE_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REGISTER_REMOTE_REQUIRED_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TELEPORTER_REGISTRY_APP_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_REMOTE_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"payloadSize\",\"type\":\"uint256\"}],\"name\":\"calculateNumWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getInitialReserveImbalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getIsCollateralized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinTeleporterVersion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMultiplyOnRemote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenHomeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenHomeBlockchainID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenMultiplier\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalMinted\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"teleporterRegistryAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"teleporterManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minTeleporterVersion\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"tokenHomeBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"tokenHomeAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenHomeDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structTokenRemoteSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"nativeAssetSymbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"initialReserveImbalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"burnedFeesReportingRewardPercentage\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"isTeleporterAddressPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"pauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"originSenderAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"receiveTeleporterMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structTeleporterFeeInfo\",\"name\":\"feeInfo\",\"type\":\"tuple\"}],\"name\":\"registerWithHome\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"}],\"name\":\"reportBurnedTxFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"}],\"internalType\":\"structSendTokensInput\",\"name\":\"input\",\"type\":\"tuple\"}],\"name\":\"send\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"destinationTokenTransferrerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipientContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"recipientPayload\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recipientGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"multiHopFallback\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackRecipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"primaryFeeTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"primaryFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"secondaryFee\",\"type\":\"uint256\"}],\"internalType\":\"structSendAndCallInput\",\"name\":\"input\",\"type\":\"tuple\"}],\"name\":\"sendAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalNativeAssetSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"teleporterAddress\",\"type\":\"address\"}],\"name\":\"unpauseTeleporterAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"updateMinTeleporterVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161511a38038061511a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614fcd8061014d5f395ff3fe608060405260043610610280575f3560e01c8063715018a61161014e578063b8a46d02116100c0578063dd62ed3e11610079578063dd62ed3e14610736578063e0fd9cb814610755578063ed0ae4b014610452578063ef793e2a14610769578063f2fde38b1461077d578063f3f981d81461079c5761028f565b8063b8a46d02146106b9578063c3cd6927146106d8578063c452165e146106ec578063c868efaa14610703578063d0e30db01461028f578063d2cc7a70146107225761028f565b80638f6cec88116101125780638f6cec8814610608578063909a6ac01461062757806395d89b4114610647578063973142971461065b578063a5717bc01461067a578063a9059cbb1461069a5761028f565b8063715018a61461057b57806371717c181461058f5780637ee3779a146105a55780638bf2fa94146105b95780638da5cb5b146105cc5761028f565b80632e1a7d4d116101f25780634511243e116101ab5780634511243e146104b55780635507f3d1146104d457806355538c8b146104ea5780635eb99514146105095780636e6eef8d1461052857806370a082311461053b5761028f565b80632e1a7d4d146103e6578063313ce56714610405578063329c3e1214610420578063347212c41461045257806335cac1591461046e5780634213cf78146104a15761028f565b806315beb59f1161024457806315beb59f1461035557806318160ddd1461036a5780631906529c1461037e57806323b872dd14610392578063254ac160146103b15780632b0d8f18146103c75761028f565b806302a30c7d1461029757806306fdde03146102c05780630733c8c8146102e1578063095ea7b3146103035780630ca1c5c9146103225761028f565b3661028f5761028d6107bb565b005b61028d6107bb565b3480156102a2575f80fd5b506102ab6107fc565b60405190151581526020015b60405180910390f35b3480156102cb575f80fd5b506102d4610813565b6040516102b79190613f06565b3480156102ec575f80fd5b506102f56108d3565b6040519081526020016102b7565b34801561030e575f80fd5b506102ab61031d366004613f3c565b6108e7565b34801561032d575f80fd5b507f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf501546102f5565b348015610360575f80fd5b506102f56105dc81565b348015610375575f80fd5b506102f5610900565b348015610389575f80fd5b506102f561091b565b34801561039d575f80fd5b506102ab6103ac366004613f66565b610972565b3480156103bc575f80fd5b506102f56201fbd081565b3480156103d2575f80fd5b5061028d6103e1366004613fa4565b610997565b3480156103f1575f80fd5b5061028d610400366004613fbf565b610a99565b348015610410575f80fd5b50604051601281526020016102b7565b34801561042b575f80fd5b5061043a6001600160991b0181565b6040516001600160a01b0390911681526020016102b7565b34801561045d575f80fd5b5061043a62010203600160981b0181565b348015610479575f80fd5b506102f57f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0081565b3480156104ac575f80fd5b506102f5610ae5565b3480156104c0575f80fd5b5061028d6104cf366004613fa4565b610af6565b3480156104df575f80fd5b506102f56205302081565b3480156104f5575f80fd5b5061028d610504366004613fbf565b610be5565b348015610514575f80fd5b5061028d610523366004613fbf565b610ef7565b61028d610536366004613fd6565b610f08565b348015610546575f80fd5b506102f5610555366004613fa4565b6001600160a01b03165f9081525f80516020614f18833981519152602052604090205490565b348015610586575f80fd5b5061028d610f36565b34801561059a575f80fd5b506102f56205573081565b3480156105b0575f80fd5b506102ab610f47565b61028d6105c736600461400d565b610f5e565b3480156105d7575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031661043a565b348015610613575f80fd5b5061028d61062236600461414d565b610f8c565b348015610632575f80fd5b506102f55f80516020614f7883398151915281565b348015610652575f80fd5b506102d461109e565b348015610666575f80fd5b506102ab610675366004613fa4565b6110dc565b348015610685575f80fd5b506102f55f80516020614f5883398151915281565b3480156106a5575f80fd5b506102ab6106b4366004613f3c565b6110f5565b3480156106c4575f80fd5b5061028d6106d3366004614217565b611102565b3480156106e3575f80fd5b5061043a611276565b3480156106f7575f80fd5b5061043a600160981b81565b34801561070e575f80fd5b5061028d61071d366004614227565b611293565b34801561072d575f80fd5b506102f5611450565b348015610741575f80fd5b506102f56107503660046142a8565b611465565b348015610760575f80fd5b506102f56114ae565b348015610774575f80fd5b506102f56114c2565b348015610788575f80fd5b5061028d610797366004613fa4565b6114d6565b3480156107a7575f80fd5b506102f56107b6366004613fbf565b611510565b60405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a26107fa3334611526565b565b5f8061080661155e565b6006015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f80516020614f1883398151915291610851906142df565b80601f016020809104026020016040519081016040528092919081815260200182805461087d906142df565b80156108c85780601f1061089f576101008083540402835291602001916108c8565b820191905f5260205f20905b8154815290600101906020018083116108ab57829003601f168201915b505050505091505090565b5f806108dd61155e565b6003015492915050565b5f336108f4818585611582565b60019150505b92915050565b5f805f80516020614f188339815191525b6002015492915050565b5f5f80516020614f588339815191528161094462010203600160981b0131600160981b31614325565b90505f61094f6114c2565b836001015461095e9190614325565b905061096a8282614338565b935050505090565b5f3361097f858285611594565b61098a8585856115f1565b60019150505b9392505050565b5f80516020614f788339815191526109ad61164e565b6001600160a01b0382166109dc5760405162461bcd60e51b81526004016109d39061434b565b60405180910390fd5b6109e68183611656565b15610a495760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b60648201526084016109d3565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b60405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a2610ad83382611677565b610ae233826116ab565b50565b5f80610aef61155e565b5492915050565b5f80516020614f78833981519152610b0c61164e565b6001600160a01b038216610b325760405162461bcd60e51b81526004016109d39061434b565b610b3c8183611656565b610b9a5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b60648201526084016109d3565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b5f80516020614f388339815191528054600114610c145760405162461bcd60e51b81526004016109d390614399565b600281557f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf502545f80516020614f5883398151915290600160981b31908111610cd25760405162461bcd60e51b8152602060048201526044602482018190527f4e6174697665546f6b656e52656d6f74653a206275726e206164647265737320908201527f62616c616e6365206e6f742067726561746572207468616e206c6173742072656064820152631c1bdc9d60e21b608482015260a4016109d3565b5f826002015482610ce39190614338565b90505f6064845f015483610cf791906143dd565b610d0191906143f4565b90505f610d0e8284614338565b6002860185905590508115610d3157610d27308361173e565b610d313083611526565b5f610d4b610d3d6108d3565b610d45610f47565b846117eb565b11610db55760405162461bcd60e51b815260206004820152603460248201527f4e6174697665546f6b656e52656d6f74653a207a65726f207363616c6564206160448201527336b7bab73a103a37903932b837b93a10313ab93760611b60648201526084016109d3565b604080518082018252600181528151808301835262010203600160981b018152602080820185905292515f9380840192610df192909101614427565b60405160208183030381529060405281525090505f610eac6040518060c00160405280610e1c6114ae565b8152602001610e29611276565b6001600160a01b0316815260408051808201825230815260208181018a905283015281018c90526060015f5b604051908082528060200260200182016040528015610e7e578160200160208202803683370190505b50815260200184604051602001610e959190614447565b604051602081830303815290604052815250611800565b9050807f0832c643b65d6d3724ed14ac3a655fbc7cae54fb010918b2c2f70ef6b1bb94a584604051610ee091815260200190565b60405180910390a250506001909555505050505050565b610eff61164e565b610ae28161191b565b610f106107fc565b610f2c5760405162461bcd60e51b81526004016109d390614489565b610ae28134611ab3565b610f3e611b2a565b6107fa5f611b85565b5f80610f5161155e565b6004015460ff1692915050565b610f666107fc565b610f825760405162461bcd60e51b81526004016109d390614489565b610ae28134611bf5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610fd05750825b90505f826001600160401b03166001148015610feb5750303b155b905081158015610ff9575080155b156110175760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561104157845460ff60401b1916600160401b1785555b61104d89898989611c61565b831561109357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f80516020614f1883398151915291610851906142df565b5f5f80516020614f788339815191526109908184611656565b5f336108f48185856115f1565b5f61110b61155e565b6006810154909150610100900460ff16156111685760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e52656d6f74653a20616c726561647920726567697374657265640060448201526064016109d3565b604080516060808201835260058401548252600284015460ff600160a01b820481166020808601918252600160a81b9093048216858701908152865180880188525f808252885188518188015293518516848a015291519093168286015286518083039095018552608090910190955280820192909252919290916111fd906111f390870187613fa4565b8660200135611cf1565b6040805160c0810182526001870154815260028701546001600160a01b03166020808301919091528251808401845293945061126e939192830191908190611247908b018b613fa4565b6001600160a01b0316815260209081018690529082526201fbd0908201526040015f610e55565b505050505050565b5f8061128061155e565b600201546001600160a01b031692915050565b61129b611d38565b5f5f80516020614f7883398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611306573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132a91906144d8565b10156113915760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b60648201526084016109d3565b61139b8133611656565b156114015760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b60648201526084016109d3565b611441858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611d8292505050565b5061144a611f99565b50505050565b5f805f80516020614f78833981519152610911565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f806114b861155e565b6001015492915050565b5f806114cc61155e565b6005015492915050565b6114de611b2a565b6001600160a01b03811661150757604051631e4fbdf760e01b81525f60048201526024016109d3565b610ae281611b85565b5f600561151e83601f614325565b901c92915050565b6001600160a01b03821661154f5760405163ec442f0560e01b81525f60048201526024016109d3565b61155a5f8383611fc3565b5050565b7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090565b61158f83838360016120fc565b505050565b5f61159f8484611465565b90505f19811461144a57818110156115e357604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016109d3565b61144a84848484035f6120fc565b6001600160a01b03831661161a57604051634b637e8f60e11b81525f60048201526024016109d3565b6001600160a01b0382166116435760405163ec442f0560e01b81525f60048201526024016109d3565b61158f838383611fc3565b6107fa611b2a565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b6001600160a01b0382166116a057604051634b637e8f60e11b81525f60048201526024016109d3565b61155a825f83611fc3565b804710156116ce5760405163cd78605960e01b81523060048201526024016109d3565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611717576040519150601f19603f3d011682016040523d82523d5f602084013e61171c565b606091505b505090508061158f57604051630a12f52160e11b815260040160405180910390fd5b7f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf50180545f80516020614f588339815191529183915f9061177f908490614325565b90915550506040516327ad555d60e11b81526001600160a01b0384166004820152602481018390526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156117d0575f80fd5b505af11580156117e2573d5f803e3d5ffd5b50505050505050565b5f6117f88484845f6121df565b949350505050565b5f8061180a61220f565b604084015160200151909150156118af576040830151516001600160a01b031661188c5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b60648201526084016109d3565b6040830151602081015190516118af916001600160a01b039091169083906122ff565b604051630624488560e41b81526001600160a01b038216906362448850906118db9086906004016144ef565b6020604051808303815f875af11580156118f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099091906144d8565b5f80516020614f7883398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa15801561196f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061199391906144d8565b600283015490915081841115611a055760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016109d3565b808411611a7a5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016109d3565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b5f80516020614f388339815191528054600114611ae25760405162461bcd60e51b81526004016109d390614399565b600281555f611aef61155e565b9050611afa84612386565b6001810154843503611b1657611b1084846125c0565b50611b22565b611b1084846127e4565b505b600190555050565b33611b5c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107fa5760405163118cdaa760e01b81523360048201526024016109d3565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f80516020614f388339815191528054600114611c245760405162461bcd60e51b81526004016109d390614399565b600281555f611c3161155e565b9050611c3c84612a85565b6001810154843503611c5757611c528484612b70565b611b20565b611b208484612cdf565b611c69612ea5565b815f03611cd25760405162461bcd60e51b815260206004820152603160248201527f4e6174697665546f6b656e52656d6f74653a207a65726f20696e697469616c206044820152707265736572766520696d62616c616e636560781b60648201526084016109d3565b611cdc8384612eee565b611ce884836012612f00565b61144a81612f31565b5f815f03611d0057505f6108fa565b306001600160a01b03841603611d2d57611d1b333084611594565b611d263330846115f1565b50806108fa565b610990833384612fa8565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611d7c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f611d8b61155e565b905080600101548414611df25760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20696e76616c696420736f7572636520626c6f636044820152681ad8da185a5b88125160ba1b60648201526084016109d3565b60028101546001600160a01b03848116911614611e645760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a20696e76616c6964206f726967696e2073656e646044820152696572206164647265737360b01b60648201526084016109d3565b5f82806020019051810190611e7991906145e8565b6006830154909150610100900460ff161580611e9a5750600682015460ff16155b15611eb15760068201805461ffff19166101011790555b600181516004811115611ec657611ec6614413565b03611efd575f8160200151806020019051810190611ee49190614670565b9050611ef7815f0151826020015161310b565b50611f92565b600281516004811115611f1257611f12614413565b03611f40575f8160200151806020019051810190611f3091906146a8565b9050611ef7818260800151613158565b60405162461bcd60e51b815260206004820152602160248201527f546f6b656e52656d6f74653a20696e76616c6964206d657373616765207479706044820152606560f81b60648201526084016109d3565b5050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b5f80516020614f188339815191526001600160a01b038416611ffd5781816002015f828254611ff29190614325565b9091555061206d9050565b6001600160a01b0384165f908152602082905260409020548281101561204f5760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016109d3565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b03831661208b5760028101805483900390556120a9565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120ee91815260200190565b60405180910390a350505050565b5f80516020614f188339815191526001600160a01b0385166121335760405163e602df0560e01b81525f60048201526024016109d3565b6001600160a01b03841661215c57604051634a1406b160e11b81525f60048201526024016109d3565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115611f9257836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516121d091815260200190565b60405180910390a35050505050565b5f811515841515036121fc576121f585846143dd565b90506117f8565b61220685846143f4565b95945050505050565b5f80516020614f7883398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612269573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228d9190614772565b90506122998282611656565b156108fa5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b60648201526084016109d3565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa15801561234c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061237091906144d8565b905061144a84846123818585614325565b613282565b80356123a45760405162461bcd60e51b81526004016109d39061478d565b5f6123b56040830160208401613fa4565b6001600160a01b0316036123db5760405162461bcd60e51b81526004016109d3906147d8565b5f6123ec6060830160408401613fa4565b6001600160a01b0316036124575760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420636f6e7460448201526b72616374206164647265737360a01b60648201526084016109d3565b5f81608001351161247a5760405162461bcd60e51b81526004016109d390614835565b5f8160a00135116124db5760405162461bcd60e51b815260206004820152602560248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420676173206044820152641b1a5b5a5d60da1b60648201526084016109d3565b80608001358160a00135106125435760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a20696e76616c696420726563697069656e742067604482015267185cc81b1a5b5a5d60c21b60648201526084016109d3565b5f612555610100830160e08401613fa4565b6001600160a01b031603610ae25760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f2066616c6c6261636b20726563697060448201526b69656e74206164647265737360a01b60648201526084016109d3565b5f6125c961155e565b90506125f96125de6040850160208601613fa4565b6101408501356125f460e0870160c08801613fa4565b61333f565b5f6126218361261061012087016101008801613fa4565b86610120013587610140013561343c565b6040805180820190915291945091505f908060028152602001604051806101000160405280865f01548152602001306001600160a01b031681526020016126653390565b6001600160a01b0316815260200161268360608a0160408b01613fa4565b6001600160a01b03168152602081018890526040016126a560608a018a614879565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a089013560208201526040016126f96101008a0160e08b01613fa4565b6001600160a01b0316905260405161271491906020016148bb565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92612796928201908061276e6101208c016101008d01613fa4565b6001600160a01b03168152602090810188905290825260808a0135908201526040015f610e55565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b1688886040516127d49291906149c2565b60405180910390a3505050505050565b5f6127ed61155e565b905061281983356128046040860160208701613fa4565b61281460e0870160c08801613fa4565b6134ff565b5f6128308361261061012087016101008801613fa4565b6040805180820190915291945091505f90806004815260200160405180610160016040528061285c3390565b6001600160a01b03168152602001885f013581526020018860200160208101906128869190613fa4565b6001600160a01b031681526020016128a460608a0160408b01613fa4565b6001600160a01b03168152602081018890526040016128c660608a018a614879565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a0890135602082015260400161291a6101008a0160e08b01613fa4565b6001600160a01b031681526080890135602082015260400161294260e08a0160c08b01613fa4565b6001600160a01b03168152610140890135602091820152604051612967929101614ad0565b60408051601f19818403018152919052905290505f6105dc61299661298f6060890189614879565b9050611510565b6129a091906143dd565b6129ad9062055730614325565b6040805160c0810182526001870154815260028701546001600160a01b03166020820152815180830183529293505f92612a3692820190806129f76101208d016101008e01613fa4565b6001600160a01b031681526020908101899052908252818101869052604080515f815280830182528184015251606090920191610e9591889101614447565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168989604051612a749291906149c2565b60405180910390a350505050505050565b5f612a966060830160408401613fa4565b6001600160a01b031603612af85760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e74206164647260448201526265737360e81b60648201526084016109d3565b5f8160c0013511612b1b5760405162461bcd60e51b81526004016109d390614835565b8035612b395760405162461bcd60e51b81526004016109d39061478d565b5f612b4a6040830160208401613fa4565b6001600160a01b031603610ae25760405162461bcd60e51b81526004016109d3906147d8565b5f612b7961155e565b9050612ba4612b8e6040850160208601613fa4565b60a08501356125f4610100870160e08801613fa4565b5f612bc883612bb96080870160608801613fa4565b86608001358760a0013561343c565b6040805180820190915291945091505f9080600181526020016040518060400160405280886040016020810190612bff9190613fa4565b6001600160a01b0316815260200187815250604051602001612c219190614427565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92612ca19282019080612c7960808c0160608d01613fa4565b6001600160a01b03168152602090810188905290825260c08a0135908201526040015f610e55565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb5288886040516127d4929190614bad565b5f612ce861155e565b9050612d108335612cff6040860160208701613fa4565b612814610100870160e08801613fa4565b5f612d2583612bb96080870160608801613fa4565b60408051808201825260038152815160e081018352883581529396509193505f9260208084019282820191612d5e918b01908b01613fa4565b6001600160a01b03168152602001612d7c60608a0160408b01613fa4565b6001600160a01b031681526020810188905260a0890135604082015260c08901356060820152608001612db66101008a0160e08b01613fa4565b6001600160a01b03169052604051612e269190602001815181526020808301516001600160a01b0390811691830191909152604080840151821690830152606080840151908301526080808401519083015260a0808401519083015260c092830151169181019190915260e00190565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92612ca19282019080612e7e60808c0160608d01613fa4565b6001600160a01b03168152602090810188905290825262053020908201526040015f610e55565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107fa57604051631afcd79f60e31b815260040160405180910390fd5b612ef6612ea5565b61155a828261359d565b612f08612ea5565b612f1e835f0151846020015185604001516135ed565b612f26613608565b61158f838383613618565b612f39612ea5565b60648110612f975760405162461bcd60e51b815260206004820152602560248201527f4e6174697665546f6b656e52656d6f74653a20696e76616c69642070657263656044820152646e7461676560d81b60648201526084016109d3565b5f80516020614f5883398151915255565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa158015612fee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061301291906144d8565b90506130296001600160a01b03861685308661393c565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa15801561306d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061309191906144d8565b90508181116130f75760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016109d3565b6131018282614338565b9695505050505050565b816001600160a01b03167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b8260405161314691815260200190565b60405180910390a261155a828261173e565b613162308261173e565b5f825f0151836020015184604001518560a001516040516024016131899493929190614c4c565b60408051601f198184030181529190526020810180516001600160e01b031663161b12ff60e11b17905260c084015160608501519192505f916131cf9190859085613975565b905080156132235783606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff48460405161321691815260200190565b60405180910390a261144a565b83606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb08460405161326291815260200190565b60405180910390a260e084015161144a906001600160a01b0316846116ab565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526132d38482613a45565b61144a576040516001600160a01b0384811660248301525f604483015261333591869182169063095ea7b3906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613ae2565b61144a8482613ae2565b5f61334861155e565b60028101549091506001600160a01b0385811691161461337a5760405162461bcd60e51b81526004016109d390614c7d565b82156133d45760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f207365636f6e646172792060448201526266656560e81b60648201526084016109d3565b6001600160a01b0382161561144a5760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f206d756c74692d686f702060448201526766616c6c6261636b60c01b60648201526084016109d3565b5f805f61344761155e565b905061345287613b43565b965061345e8686611cf1565b600382015460048301549196506134789160ff16866117eb565b60038201546004830154613490919060ff168a6117eb565b116134f25760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a20696e73756666696369656e7420746f6b656e7360448201526b103a37903a3930b739b332b960a11b60648201526084016109d3565b5094959294509192505050565b5f61350861155e565b8054909150840361353b57306001600160a01b0384160361353b5760405162461bcd60e51b81526004016109d390614c7d565b6001600160a01b03821661144a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f206d756c74692d686f702066616c6c6044820152636261636b60e01b60648201526084016109d3565b6135a5612ea5565b5f80516020614f188339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036135de8482614d1e565b506004810161144a8382614d1e565b6135f5612ea5565b6135ff8382613b5b565b61158f82613b7d565b613610612ea5565b6107fa613b8e565b613620612ea5565b5f61362961155e565b90506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561366e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061369291906144d8565b815560608401516136f85760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b60648201526084016109d3565b80546060850151036137725760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d65000000000060648201526084016109d3565b60808401516001600160a01b03166137d85760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b60648201526084016109d3565b60128460a0015160ff1611156138425760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b60648201526084016109d3565b60128260ff1611156138a25760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b60648201526084016109d3565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b9186169190910217905561391e9083613ba2565b60048301805460ff1916911515919091179055600390910155505050565b6040516001600160a01b03848116602483015283811660448301526064820183905261144a9186918216906323b872dd90608401613303565b5f845a10156139c65760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e7420676173000000000060448201526064016109d3565b83471015613a165760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c756500000060448201526064016109d3565b826001600160a01b03163b5f03613a2e57505f6117f8565b5f805f84516020860188888bf19695505050505050565b5f805f846001600160a01b031684604051613a609190614dd9565b5f604051808303815f865af19150503d805f8114613a99576040519150601f19603f3d011682016040523d82523d5f602084013e613a9e565b606091505b5091509150818015613ac8575080511580613ac8575080806020019051810190613ac89190614df4565b80156122065750505050506001600160a01b03163b151590565b5f613af66001600160a01b03841683613bec565b905080515f14158015613b1a575080806020019051810190613b189190614df4565b155b1561158f57604051635274afe760e01b81526001600160a01b03841660048201526024016109d3565b5f613b5762010203600160981b01836116ab565b5090565b613b63612ea5565b613b6b613bf9565b613b73613c09565b61155a8282613c11565b613b85612ea5565b610ae281613d95565b5f5f80516020614f38833981519152611fbc565b5f8060ff808516908416118181613bc557613bbd8587614e13565b60ff16613bd3565b613bcf8686614e13565b60ff165b613bde90600a614f0c565b9350909150505b9250929050565b606061099083835f613d9d565b613c01612ea5565b6107fa613e2c565b6107fa612ea5565b613c19612ea5565b6001600160a01b038216613c955760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016109d3565b5f5f80516020614f7883398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ce7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d0b91906144d8565b11613d735760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b60648201526084016109d3565b81546001600160a01b0319166001600160a01b03821617825561144a8361191b565b6114de612ea5565b606081471015613dc25760405163cd78605960e01b81523060048201526024016109d3565b5f80856001600160a01b03168486604051613ddd9190614dd9565b5f6040518083038185875af1925050503d805f8114613e17576040519150601f19603f3d011682016040523d82523d5f602084013e613e1c565b606091505b5091509150613101868383613e34565b611f99612ea5565b606082613e4957613e4482613e90565b610990565b8151158015613e6057506001600160a01b0384163b155b15613e8957604051639996b31560e01b81526001600160a01b03851660048201526024016109d3565b5080610990565b805115613ea05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f5b83811015613ed3578181015183820152602001613ebb565b50505f910152565b5f8151808452613ef2816020860160208601613eb9565b601f01601f19169290920160200192915050565b602081525f6109906020830184613edb565b6001600160a01b0381168114610ae2575f80fd5b8035613f3781613f18565b919050565b5f8060408385031215613f4d575f80fd5b8235613f5881613f18565b946020939093013593505050565b5f805f60608486031215613f78575f80fd5b8335613f8381613f18565b92506020840135613f9381613f18565b929592945050506040919091013590565b5f60208284031215613fb4575f80fd5b813561099081613f18565b5f60208284031215613fcf575f80fd5b5035919050565b5f60208284031215613fe6575f80fd5b81356001600160401b03811115613ffb575f80fd5b82016101608185031215610990575f80fd5b5f610100828403121561401e575f80fd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b038111828210171561405a5761405a614024565b60405290565b604080519081016001600160401b038111828210171561405a5761405a614024565b60405161010081016001600160401b038111828210171561405a5761405a614024565b604051601f8201601f191681016001600160401b03811182821017156140cd576140cd614024565b604052919050565b5f6001600160401b038211156140ed576140ed614024565b50601f01601f191660200190565b5f82601f83011261410a575f80fd5b813561411d614118826140d5565b6140a5565b818152846020838601011115614131575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80848603610120811215614162575f80fd5b60c081121561416f575f80fd5b50614178614038565b853561418381613f18565b8152602086013561419381613f18565b80602083015250604086013560408201526060860135606082015260808601356141bc81613f18565b608082015260a086013560ff811681146141d4575f80fd5b60a0820152935060c08501356001600160401b038111156141f3575f80fd5b6141ff878288016140fb565b949794965050505060e0830135926101000135919050565b5f6040828403121561401e575f80fd5b5f805f806060858703121561423a575f80fd5b84359350602085013561424c81613f18565b925060408501356001600160401b0380821115614267575f80fd5b818701915087601f83011261427a575f80fd5b813581811115614288575f80fd5b886020828501011115614299575f80fd5b95989497505060200194505050565b5f80604083850312156142b9575f80fd5b82356142c481613f18565b915060208301356142d481613f18565b809150509250929050565b600181811c908216806142f357607f821691505b60208210810361401e57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156108fa576108fa614311565b818103818111156108fa576108fa614311565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b80820281158282048414176108fa576108fa614311565b5f8261440e57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b81516001600160a01b0316815260208083015190820152604081016108fa565b602081525f82516005811061446a57634e487b7160e01b5f52602160045260245ffd5b8060208401525060208301516040808401526117f86060840182613edb565b6020808252602f908201527f4e6174697665546f6b656e52656d6f74653a20636f6e747261637420756e646560408201526e1c98dbdb1b185d195c985b1a5e9959608a1b606082015260800190565b5f602082840312156144e8575f80fd5b5051919050565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b8084101561457c5784518316825293850193600193909301929085019061455a565b5060a0880151878203601f190160e0890152945061459a8186613edb565b98975050505050505050565b5f82601f8301126145b5575f80fd5b81516145c3614118826140d5565b8181528460208386010111156145d7575f80fd5b6117f8826020830160208701613eb9565b5f602082840312156145f8575f80fd5b81516001600160401b038082111561460e575f80fd5b9083019060408286031215614621575f80fd5b614629614060565b825160058110614637575f80fd5b815260208301518281111561464a575f80fd5b614656878286016145a6565b60208301525095945050505050565b8051613f3781613f18565b5f60408284031215614680575f80fd5b614688614060565b825161469381613f18565b81526020928301519281019290925250919050565b5f602082840312156146b8575f80fd5b81516001600160401b03808211156146ce575f80fd5b9083019061010082860312156146e2575f80fd5b6146ea614082565b825181526146fa60208401614665565b602082015261470b60408401614665565b604082015261471c60608401614665565b60608201526080830151608082015260a08301518281111561473c575f80fd5b614748878286016145a6565b60a08301525060c083015160c082015261476460e08401614665565b60e082015295945050505050565b5f60208284031215614782575f80fd5b815161099081613f18565b6020808252602b908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20626c60408201526a1bd8dad8da185a5b88125160aa1b606082015260800190565b60208082526037908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20746f60408201527f6b656e207472616e736665727265722061646472657373000000000000000000606082015260800190565b60208082526024908201527f546f6b656e52656d6f74653a207a65726f20726571756972656420676173206c6040820152631a5b5a5d60e21b606082015260800190565b5f808335601e1984360301811261488e575f80fd5b8301803591506001600160401b038211156148a7575f80fd5b602001915036819003821315613be5575f80fd5b60208152815160208201525f602083015160018060a01b0380821660408501528060408601511660608501525050606083015161490360808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c085015261492a610120850183613edb565b915060c085015160e085015260e085015161494f828601826001600160a01b03169052565b5090949350505050565b5f808335601e1984360301811261496e575f80fd5b83016020810192503590506001600160401b0381111561498c575f80fd5b803603821315613be5575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60408152823560408201525f6149da60208501613f2c565b6001600160a01b031660608301526149f460408501613f2c565b6001600160a01b03166080830152614a0f6060850185614959565b6101608060a0860152614a276101a08601838561499a565b9250608087013560c086015260a087013560e0860152614a4960c08801613f2c565b9150610100614a62818701846001600160a01b03169052565b614a6e60e08901613f2c565b9250610120614a87818801856001600160a01b03169052565b614a92828a01613f2c565b93506101409150614aad828801856001600160a01b03169052565b880135918601919091529095013561018084015260209092019290925292915050565b60208152614aea6020820183516001600160a01b03169052565b602082015160408201525f6040830151614b0f60608401826001600160a01b03169052565b5060608301516001600160a01b038116608084015250608083015160a083015260a08301516101608060c0850152614b4b610180850183613edb565b915060c085015160e085015260e0850151610100614b73818701836001600160a01b03169052565b860151610120868101919091528601519050610140614b9c818701836001600160a01b03169052565b959095015193019290925250919050565b8235815261012081016020840135614bc481613f18565b6001600160a01b039081166020840152604085013590614be382613f18565b166040830152614bf560608501613f2c565b6001600160a01b0381166060840152506080840135608083015260a084013560a083015260c084013560c0830152614c2f60e08501613f2c565b6001600160a01b031660e083015261010090910191909152919050565b8481526001600160a01b038481166020830152831660408201526080606082018190525f9061310190830184613edb565b6020808252603a908201527f546f6b656e52656d6f74653a20696e76616c69642064657374696e6174696f6e60408201527f20746f6b656e207472616e736665727265722061646472657373000000000000606082015260800190565b601f82111561158f57805f5260205f20601f840160051c81016020851015614cff5750805b601f840160051c820191505b81811015611f92575f8155600101614d0b565b81516001600160401b03811115614d3757614d37614024565b614d4b81614d4584546142df565b84614cda565b602080601f831160018114614d7e575f8415614d675750858301515b5f19600386901b1c1916600185901b17855561126e565b5f85815260208120601f198616915b82811015614dac57888601518255948401946001909101908401614d8d565b5085821015614dc957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614dea818460208701613eb9565b9190910192915050565b5f60208284031215614e04575f80fd5b81518015158114610990575f80fd5b60ff82811682821603908111156108fa576108fa614311565b600181815b80851115614e6657815f1904821115614e4c57614e4c614311565b80851615614e5957918102915b93841c9390800290614e31565b509250929050565b5f82614e7c575060016108fa565b81614e8857505f6108fa565b8160018114614e9e5760028114614ea857614ec4565b60019150506108fa565b60ff841115614eb957614eb9614311565b50506001821b6108fa565b5060208310610133831016604e8410600b8410161715614ee7575081810a6108fa565b614ef18383614e2c565b805f1904821115614f0457614f04614311565b029392505050565b5f6109908383614e6e56fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00d2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c750069a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf500de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a2646970667358221220832c5ad6c5cb8b0b2ebe7f175a8b66d6f2f51bc1c706fc0f6cb38a09790f473d64736f6c63430008190033", + Bin: "0x608060405234801561000f575f80fd5b5060405161511a38038061511a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614fcd8061014d5f395ff3fe608060405260043610610280575f3560e01c8063715018a61161014e578063b8a46d02116100c0578063dd62ed3e11610079578063dd62ed3e14610736578063e0fd9cb814610755578063ed0ae4b014610452578063ef793e2a14610769578063f2fde38b1461077d578063f3f981d81461079c5761028f565b8063b8a46d02146106b9578063c3cd6927146106d8578063c452165e146106ec578063c868efaa14610703578063d0e30db01461028f578063d2cc7a70146107225761028f565b80638f6cec88116101125780638f6cec8814610608578063909a6ac01461062757806395d89b4114610647578063973142971461065b578063a5717bc01461067a578063a9059cbb1461069a5761028f565b8063715018a61461057b57806371717c181461058f5780637ee3779a146105a55780638bf2fa94146105b95780638da5cb5b146105cc5761028f565b80632e1a7d4d116101f25780634511243e116101ab5780634511243e146104b55780635507f3d1146104d457806355538c8b146104ea5780635eb99514146105095780636e6eef8d1461052857806370a082311461053b5761028f565b80632e1a7d4d146103e6578063313ce56714610405578063329c3e1214610420578063347212c41461045257806335cac1591461046e5780634213cf78146104a15761028f565b806315beb59f1161024457806315beb59f1461035557806318160ddd1461036a5780631906529c1461037e57806323b872dd14610392578063254ac160146103b15780632b0d8f18146103c75761028f565b806302a30c7d1461029757806306fdde03146102c05780630733c8c8146102e1578063095ea7b3146103035780630ca1c5c9146103225761028f565b3661028f5761028d6107bb565b005b61028d6107bb565b3480156102a2575f80fd5b506102ab6107fc565b60405190151581526020015b60405180910390f35b3480156102cb575f80fd5b506102d4610813565b6040516102b79190613f06565b3480156102ec575f80fd5b506102f56108d3565b6040519081526020016102b7565b34801561030e575f80fd5b506102ab61031d366004613f3c565b6108e7565b34801561032d575f80fd5b507f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf501546102f5565b348015610360575f80fd5b506102f56105dc81565b348015610375575f80fd5b506102f5610900565b348015610389575f80fd5b506102f561091b565b34801561039d575f80fd5b506102ab6103ac366004613f66565b610972565b3480156103bc575f80fd5b506102f56201fbd081565b3480156103d2575f80fd5b5061028d6103e1366004613fa4565b610997565b3480156103f1575f80fd5b5061028d610400366004613fbf565b610a99565b348015610410575f80fd5b50604051601281526020016102b7565b34801561042b575f80fd5b5061043a6001600160991b0181565b6040516001600160a01b0390911681526020016102b7565b34801561045d575f80fd5b5061043a62010203600160981b0181565b348015610479575f80fd5b506102f57f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0081565b3480156104ac575f80fd5b506102f5610ae5565b3480156104c0575f80fd5b5061028d6104cf366004613fa4565b610af6565b3480156104df575f80fd5b506102f56205302081565b3480156104f5575f80fd5b5061028d610504366004613fbf565b610be5565b348015610514575f80fd5b5061028d610523366004613fbf565b610ef7565b61028d610536366004613fd6565b610f08565b348015610546575f80fd5b506102f5610555366004613fa4565b6001600160a01b03165f9081525f80516020614f18833981519152602052604090205490565b348015610586575f80fd5b5061028d610f36565b34801561059a575f80fd5b506102f56205573081565b3480156105b0575f80fd5b506102ab610f47565b61028d6105c736600461400d565b610f5e565b3480156105d7575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031661043a565b348015610613575f80fd5b5061028d61062236600461414d565b610f8c565b348015610632575f80fd5b506102f55f80516020614f7883398151915281565b348015610652575f80fd5b506102d461109e565b348015610666575f80fd5b506102ab610675366004613fa4565b6110dc565b348015610685575f80fd5b506102f55f80516020614f5883398151915281565b3480156106a5575f80fd5b506102ab6106b4366004613f3c565b6110f5565b3480156106c4575f80fd5b5061028d6106d3366004614217565b611102565b3480156106e3575f80fd5b5061043a611276565b3480156106f7575f80fd5b5061043a600160981b81565b34801561070e575f80fd5b5061028d61071d366004614227565b611293565b34801561072d575f80fd5b506102f5611450565b348015610741575f80fd5b506102f56107503660046142a8565b611465565b348015610760575f80fd5b506102f56114ae565b348015610774575f80fd5b506102f56114c2565b348015610788575f80fd5b5061028d610797366004613fa4565b6114d6565b3480156107a7575f80fd5b506102f56107b6366004613fbf565b611510565b60405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a26107fa3334611526565b565b5f8061080661155e565b6006015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f80516020614f1883398151915291610851906142df565b80601f016020809104026020016040519081016040528092919081815260200182805461087d906142df565b80156108c85780601f1061089f576101008083540402835291602001916108c8565b820191905f5260205f20905b8154815290600101906020018083116108ab57829003601f168201915b505050505091505090565b5f806108dd61155e565b6003015492915050565b5f336108f4818585611582565b60019150505b92915050565b5f805f80516020614f188339815191525b6002015492915050565b5f5f80516020614f588339815191528161094462010203600160981b0131600160981b31614325565b90505f61094f6114c2565b836001015461095e9190614325565b905061096a8282614338565b935050505090565b5f3361097f858285611594565b61098a8585856115f1565b60019150505b9392505050565b5f80516020614f788339815191526109ad61164e565b6001600160a01b0382166109dc5760405162461bcd60e51b81526004016109d39061434b565b60405180910390fd5b6109e68183611656565b15610a495760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b60648201526084016109d3565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b60405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a2610ad83382611677565b610ae233826116ab565b50565b5f80610aef61155e565b5492915050565b5f80516020614f78833981519152610b0c61164e565b6001600160a01b038216610b325760405162461bcd60e51b81526004016109d39061434b565b610b3c8183611656565b610b9a5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b60648201526084016109d3565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b5f80516020614f388339815191528054600114610c145760405162461bcd60e51b81526004016109d390614399565b600281557f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf502545f80516020614f5883398151915290600160981b31908111610cd25760405162461bcd60e51b8152602060048201526044602482018190527f4e6174697665546f6b656e52656d6f74653a206275726e206164647265737320908201527f62616c616e6365206e6f742067726561746572207468616e206c6173742072656064820152631c1bdc9d60e21b608482015260a4016109d3565b5f826002015482610ce39190614338565b90505f6064845f015483610cf791906143dd565b610d0191906143f4565b90505f610d0e8284614338565b6002860185905590508115610d3157610d27308361173e565b610d313083611526565b5f610d4b610d3d6108d3565b610d45610f47565b846117eb565b11610db55760405162461bcd60e51b815260206004820152603460248201527f4e6174697665546f6b656e52656d6f74653a207a65726f207363616c6564206160448201527336b7bab73a103a37903932b837b93a10313ab93760611b60648201526084016109d3565b604080518082018252600181528151808301835262010203600160981b018152602080820185905292515f9380840192610df192909101614427565b60405160208183030381529060405281525090505f610eac6040518060c00160405280610e1c6114ae565b8152602001610e29611276565b6001600160a01b0316815260408051808201825230815260208181018a905283015281018c90526060015f5b604051908082528060200260200182016040528015610e7e578160200160208202803683370190505b50815260200184604051602001610e959190614447565b604051602081830303815290604052815250611800565b9050807f0832c643b65d6d3724ed14ac3a655fbc7cae54fb010918b2c2f70ef6b1bb94a584604051610ee091815260200190565b60405180910390a250506001909555505050505050565b610eff61164e565b610ae28161191b565b610f106107fc565b610f2c5760405162461bcd60e51b81526004016109d390614489565b610ae28134611ab3565b610f3e611b2a565b6107fa5f611b85565b5f80610f5161155e565b6004015460ff1692915050565b610f666107fc565b610f825760405162461bcd60e51b81526004016109d390614489565b610ae28134611bf5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610fd05750825b90505f826001600160401b03166001148015610feb5750303b155b905081158015610ff9575080155b156110175760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561104157845460ff60401b1916600160401b1785555b61104d89898989611c61565b831561109357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f80516020614f1883398151915291610851906142df565b5f5f80516020614f788339815191526109908184611656565b5f336108f48185856115f1565b5f61110b61155e565b6006810154909150610100900460ff16156111685760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e52656d6f74653a20616c726561647920726567697374657265640060448201526064016109d3565b604080516060808201835260058401548252600284015460ff600160a01b820481166020808601918252600160a81b9093048216858701908152865180880188525f808252885188518188015293518516848a015291519093168286015286518083039095018552608090910190955280820192909252919290916111fd906111f390870187613fa4565b8660200135611cf1565b6040805160c0810182526001870154815260028701546001600160a01b03166020808301919091528251808401845293945061126e939192830191908190611247908b018b613fa4565b6001600160a01b0316815260209081018690529082526201fbd0908201526040015f610e55565b505050505050565b5f8061128061155e565b600201546001600160a01b031692915050565b61129b611d38565b5f5f80516020614f7883398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611306573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132a91906144d8565b10156113915760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b60648201526084016109d3565b61139b8133611656565b156114015760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b60648201526084016109d3565b611441858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611d8292505050565b5061144a611f99565b50505050565b5f805f80516020614f78833981519152610911565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f806114b861155e565b6001015492915050565b5f806114cc61155e565b6005015492915050565b6114de611b2a565b6001600160a01b03811661150757604051631e4fbdf760e01b81525f60048201526024016109d3565b610ae281611b85565b5f600561151e83601f614325565b901c92915050565b6001600160a01b03821661154f5760405163ec442f0560e01b81525f60048201526024016109d3565b61155a5f8383611fc3565b5050565b7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090565b61158f83838360016120fc565b505050565b5f61159f8484611465565b90505f19811461144a57818110156115e357604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016109d3565b61144a84848484035f6120fc565b6001600160a01b03831661161a57604051634b637e8f60e11b81525f60048201526024016109d3565b6001600160a01b0382166116435760405163ec442f0560e01b81525f60048201526024016109d3565b61158f838383611fc3565b6107fa611b2a565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b6001600160a01b0382166116a057604051634b637e8f60e11b81525f60048201526024016109d3565b61155a825f83611fc3565b804710156116ce5760405163cd78605960e01b81523060048201526024016109d3565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611717576040519150601f19603f3d011682016040523d82523d5f602084013e61171c565b606091505b505090508061158f57604051630a12f52160e11b815260040160405180910390fd5b7f69a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf50180545f80516020614f588339815191529183915f9061177f908490614325565b90915550506040516327ad555d60e11b81526001600160a01b0384166004820152602481018390526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156117d0575f80fd5b505af11580156117e2573d5f803e3d5ffd5b50505050505050565b5f6117f88484845f6121df565b949350505050565b5f8061180a61220f565b604084015160200151909150156118af576040830151516001600160a01b031661188c5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b60648201526084016109d3565b6040830151602081015190516118af916001600160a01b039091169083906122ff565b604051630624488560e41b81526001600160a01b038216906362448850906118db9086906004016144ef565b6020604051808303815f875af11580156118f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099091906144d8565b5f80516020614f7883398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa15801561196f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061199391906144d8565b600283015490915081841115611a055760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016109d3565b808411611a7a5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016109d3565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b5f80516020614f388339815191528054600114611ae25760405162461bcd60e51b81526004016109d390614399565b600281555f611aef61155e565b9050611afa84612386565b6001810154843503611b1657611b1084846125c0565b50611b22565b611b1084846127e4565b505b600190555050565b33611b5c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107fa5760405163118cdaa760e01b81523360048201526024016109d3565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f80516020614f388339815191528054600114611c245760405162461bcd60e51b81526004016109d390614399565b600281555f611c3161155e565b9050611c3c84612a85565b6001810154843503611c5757611c528484612b70565b611b20565b611b208484612cdf565b611c69612ea5565b815f03611cd25760405162461bcd60e51b815260206004820152603160248201527f4e6174697665546f6b656e52656d6f74653a207a65726f20696e697469616c206044820152707265736572766520696d62616c616e636560781b60648201526084016109d3565b611cdc8384612eee565b611ce884836012612f00565b61144a81612f31565b5f815f03611d0057505f6108fa565b306001600160a01b03841603611d2d57611d1b333084611594565b611d263330846115f1565b50806108fa565b610990833384612fa8565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611d7c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f611d8b61155e565b905080600101548414611df25760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20696e76616c696420736f7572636520626c6f636044820152681ad8da185a5b88125160ba1b60648201526084016109d3565b60028101546001600160a01b03848116911614611e645760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a20696e76616c6964206f726967696e2073656e646044820152696572206164647265737360b01b60648201526084016109d3565b5f82806020019051810190611e7991906145e8565b6006830154909150610100900460ff161580611e9a5750600682015460ff16155b15611eb15760068201805461ffff19166101011790555b600181516004811115611ec657611ec6614413565b03611efd575f8160200151806020019051810190611ee49190614670565b9050611ef7815f0151826020015161310b565b50611f92565b600281516004811115611f1257611f12614413565b03611f40575f8160200151806020019051810190611f3091906146a8565b9050611ef7818260800151613158565b60405162461bcd60e51b815260206004820152602160248201527f546f6b656e52656d6f74653a20696e76616c6964206d657373616765207479706044820152606560f81b60648201526084016109d3565b5050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b5f80516020614f188339815191526001600160a01b038416611ffd5781816002015f828254611ff29190614325565b9091555061206d9050565b6001600160a01b0384165f908152602082905260409020548281101561204f5760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016109d3565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b03831661208b5760028101805483900390556120a9565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120ee91815260200190565b60405180910390a350505050565b5f80516020614f188339815191526001600160a01b0385166121335760405163e602df0560e01b81525f60048201526024016109d3565b6001600160a01b03841661215c57604051634a1406b160e11b81525f60048201526024016109d3565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115611f9257836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516121d091815260200190565b60405180910390a35050505050565b5f811515841515036121fc576121f585846143dd565b90506117f8565b61220685846143f4565b95945050505050565b5f80516020614f7883398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612269573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228d9190614772565b90506122998282611656565b156108fa5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b60648201526084016109d3565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa15801561234c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061237091906144d8565b905061144a84846123818585614325565b613282565b80356123a45760405162461bcd60e51b81526004016109d39061478d565b5f6123b56040830160208401613fa4565b6001600160a01b0316036123db5760405162461bcd60e51b81526004016109d3906147d8565b5f6123ec6060830160408401613fa4565b6001600160a01b0316036124575760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420636f6e7460448201526b72616374206164647265737360a01b60648201526084016109d3565b5f81608001351161247a5760405162461bcd60e51b81526004016109d390614835565b5f8160a00135116124db5760405162461bcd60e51b815260206004820152602560248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420676173206044820152641b1a5b5a5d60da1b60648201526084016109d3565b80608001358160a00135106125435760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a20696e76616c696420726563697069656e742067604482015267185cc81b1a5b5a5d60c21b60648201526084016109d3565b5f612555610100830160e08401613fa4565b6001600160a01b031603610ae25760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f2066616c6c6261636b20726563697060448201526b69656e74206164647265737360a01b60648201526084016109d3565b5f6125c961155e565b90506125f96125de6040850160208601613fa4565b6101408501356125f460e0870160c08801613fa4565b61333f565b5f6126218361261061012087016101008801613fa4565b86610120013587610140013561343c565b6040805180820190915291945091505f908060028152602001604051806101000160405280865f01548152602001306001600160a01b031681526020016126653390565b6001600160a01b0316815260200161268360608a0160408b01613fa4565b6001600160a01b03168152602081018890526040016126a560608a018a614879565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a089013560208201526040016126f96101008a0160e08b01613fa4565b6001600160a01b0316905260405161271491906020016148bb565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92612796928201908061276e6101208c016101008d01613fa4565b6001600160a01b03168152602090810188905290825260808a0135908201526040015f610e55565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b1688886040516127d49291906149c2565b60405180910390a3505050505050565b5f6127ed61155e565b905061281983356128046040860160208701613fa4565b61281460e0870160c08801613fa4565b6134ff565b5f6128308361261061012087016101008801613fa4565b6040805180820190915291945091505f90806004815260200160405180610160016040528061285c3390565b6001600160a01b03168152602001885f013581526020018860200160208101906128869190613fa4565b6001600160a01b031681526020016128a460608a0160408b01613fa4565b6001600160a01b03168152602081018890526040016128c660608a018a614879565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a0890135602082015260400161291a6101008a0160e08b01613fa4565b6001600160a01b031681526080890135602082015260400161294260e08a0160c08b01613fa4565b6001600160a01b03168152610140890135602091820152604051612967929101614ad0565b60408051601f19818403018152919052905290505f6105dc61299661298f6060890189614879565b9050611510565b6129a091906143dd565b6129ad9062055730614325565b6040805160c0810182526001870154815260028701546001600160a01b03166020820152815180830183529293505f92612a3692820190806129f76101208d016101008e01613fa4565b6001600160a01b031681526020908101899052908252818101869052604080515f815280830182528184015251606090920191610e9591889101614447565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168989604051612a749291906149c2565b60405180910390a350505050505050565b5f612a966060830160408401613fa4565b6001600160a01b031603612af85760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e74206164647260448201526265737360e81b60648201526084016109d3565b5f8160c0013511612b1b5760405162461bcd60e51b81526004016109d390614835565b8035612b395760405162461bcd60e51b81526004016109d39061478d565b5f612b4a6040830160208401613fa4565b6001600160a01b031603610ae25760405162461bcd60e51b81526004016109d3906147d8565b5f612b7961155e565b9050612ba4612b8e6040850160208601613fa4565b60a08501356125f4610100870160e08801613fa4565b5f612bc883612bb96080870160608801613fa4565b86608001358760a0013561343c565b6040805180820190915291945091505f9080600181526020016040518060400160405280886040016020810190612bff9190613fa4565b6001600160a01b0316815260200187815250604051602001612c219190614427565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92612ca19282019080612c7960808c0160608d01613fa4565b6001600160a01b03168152602090810188905290825260c08a0135908201526040015f610e55565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb5288886040516127d4929190614bad565b5f612ce861155e565b9050612d108335612cff6040860160208701613fa4565b612814610100870160e08801613fa4565b5f612d2583612bb96080870160608801613fa4565b60408051808201825260038152815160e081018352883581529396509193505f9260208084019282820191612d5e918b01908b01613fa4565b6001600160a01b03168152602001612d7c60608a0160408b01613fa4565b6001600160a01b031681526020810188905260a0890135604082015260c08901356060820152608001612db66101008a0160e08b01613fa4565b6001600160a01b03169052604051612e269190602001815181526020808301516001600160a01b0390811691830191909152604080840151821690830152606080840151908301526080808401519083015260a0808401519083015260c092830151169181019190915260e00190565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92612ca19282019080612e7e60808c0160608d01613fa4565b6001600160a01b03168152602090810188905290825262053020908201526040015f610e55565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107fa57604051631afcd79f60e31b815260040160405180910390fd5b612ef6612ea5565b61155a828261359d565b612f08612ea5565b612f1e835f0151846020015185604001516135ed565b612f26613608565b61158f838383613618565b612f39612ea5565b60648110612f975760405162461bcd60e51b815260206004820152602560248201527f4e6174697665546f6b656e52656d6f74653a20696e76616c69642070657263656044820152646e7461676560d81b60648201526084016109d3565b5f80516020614f5883398151915255565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa158015612fee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061301291906144d8565b90506130296001600160a01b03861685308661393c565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa15801561306d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061309191906144d8565b90508181116130f75760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016109d3565b6131018282614338565b9695505050505050565b816001600160a01b03167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b8260405161314691815260200190565b60405180910390a261155a828261173e565b613162308261173e565b5f825f0151836020015184604001518560a001516040516024016131899493929190614c4c565b60408051601f198184030181529190526020810180516001600160e01b031663161b12ff60e11b17905260c084015160608501519192505f916131cf9190859085613975565b905080156132235783606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff48460405161321691815260200190565b60405180910390a261144a565b83606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb08460405161326291815260200190565b60405180910390a260e084015161144a906001600160a01b0316846116ab565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526132d38482613a45565b61144a576040516001600160a01b0384811660248301525f604483015261333591869182169063095ea7b3906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613ae2565b61144a8482613ae2565b5f61334861155e565b60028101549091506001600160a01b0385811691161461337a5760405162461bcd60e51b81526004016109d390614c7d565b82156133d45760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f207365636f6e646172792060448201526266656560e81b60648201526084016109d3565b6001600160a01b0382161561144a5760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f206d756c74692d686f702060448201526766616c6c6261636b60c01b60648201526084016109d3565b5f805f61344761155e565b905061345287613b43565b965061345e8686611cf1565b600382015460048301549196506134789160ff16866117eb565b60038201546004830154613490919060ff168a6117eb565b116134f25760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a20696e73756666696369656e7420746f6b656e7360448201526b103a37903a3930b739b332b960a11b60648201526084016109d3565b5094959294509192505050565b5f61350861155e565b8054909150840361353b57306001600160a01b0384160361353b5760405162461bcd60e51b81526004016109d390614c7d565b6001600160a01b03821661144a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f206d756c74692d686f702066616c6c6044820152636261636b60e01b60648201526084016109d3565b6135a5612ea5565b5f80516020614f188339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036135de8482614d1e565b506004810161144a8382614d1e565b6135f5612ea5565b6135ff8382613b5b565b61158f82613b7d565b613610612ea5565b6107fa613b8e565b613620612ea5565b5f61362961155e565b90506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561366e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061369291906144d8565b815560608401516136f85760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b60648201526084016109d3565b80546060850151036137725760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d65000000000060648201526084016109d3565b60808401516001600160a01b03166137d85760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b60648201526084016109d3565b60128460a0015160ff1611156138425760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b60648201526084016109d3565b60128260ff1611156138a25760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b60648201526084016109d3565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b9186169190910217905561391e9083613ba2565b60048301805460ff1916911515919091179055600390910155505050565b6040516001600160a01b03848116602483015283811660448301526064820183905261144a9186918216906323b872dd90608401613303565b5f845a10156139c65760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e7420676173000000000060448201526064016109d3565b83471015613a165760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c756500000060448201526064016109d3565b826001600160a01b03163b5f03613a2e57505f6117f8565b5f805f84516020860188888bf19695505050505050565b5f805f846001600160a01b031684604051613a609190614dd9565b5f604051808303815f865af19150503d805f8114613a99576040519150601f19603f3d011682016040523d82523d5f602084013e613a9e565b606091505b5091509150818015613ac8575080511580613ac8575080806020019051810190613ac89190614df4565b80156122065750505050506001600160a01b03163b151590565b5f613af66001600160a01b03841683613bec565b905080515f14158015613b1a575080806020019051810190613b189190614df4565b155b1561158f57604051635274afe760e01b81526001600160a01b03841660048201526024016109d3565b5f613b5762010203600160981b01836116ab565b5090565b613b63612ea5565b613b6b613bf9565b613b73613c09565b61155a8282613c11565b613b85612ea5565b610ae281613d95565b5f5f80516020614f38833981519152611fbc565b5f8060ff808516908416118181613bc557613bbd8587614e13565b60ff16613bd3565b613bcf8686614e13565b60ff165b613bde90600a614f0c565b9350909150505b9250929050565b606061099083835f613d9d565b613c01612ea5565b6107fa613e2c565b6107fa612ea5565b613c19612ea5565b6001600160a01b038216613c955760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016109d3565b5f5f80516020614f7883398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ce7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d0b91906144d8565b11613d735760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b60648201526084016109d3565b81546001600160a01b0319166001600160a01b03821617825561144a8361191b565b6114de612ea5565b606081471015613dc25760405163cd78605960e01b81523060048201526024016109d3565b5f80856001600160a01b03168486604051613ddd9190614dd9565b5f6040518083038185875af1925050503d805f8114613e17576040519150601f19603f3d011682016040523d82523d5f602084013e613e1c565b606091505b5091509150613101868383613e34565b611f99612ea5565b606082613e4957613e4482613e90565b610990565b8151158015613e6057506001600160a01b0384163b155b15613e8957604051639996b31560e01b81526001600160a01b03851660048201526024016109d3565b5080610990565b805115613ea05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f5b83811015613ed3578181015183820152602001613ebb565b50505f910152565b5f8151808452613ef2816020860160208601613eb9565b601f01601f19169290920160200192915050565b602081525f6109906020830184613edb565b6001600160a01b0381168114610ae2575f80fd5b8035613f3781613f18565b919050565b5f8060408385031215613f4d575f80fd5b8235613f5881613f18565b946020939093013593505050565b5f805f60608486031215613f78575f80fd5b8335613f8381613f18565b92506020840135613f9381613f18565b929592945050506040919091013590565b5f60208284031215613fb4575f80fd5b813561099081613f18565b5f60208284031215613fcf575f80fd5b5035919050565b5f60208284031215613fe6575f80fd5b81356001600160401b03811115613ffb575f80fd5b82016101608185031215610990575f80fd5b5f610100828403121561401e575f80fd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b038111828210171561405a5761405a614024565b60405290565b604080519081016001600160401b038111828210171561405a5761405a614024565b60405161010081016001600160401b038111828210171561405a5761405a614024565b604051601f8201601f191681016001600160401b03811182821017156140cd576140cd614024565b604052919050565b5f6001600160401b038211156140ed576140ed614024565b50601f01601f191660200190565b5f82601f83011261410a575f80fd5b813561411d614118826140d5565b6140a5565b818152846020838601011115614131575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80848603610120811215614162575f80fd5b60c081121561416f575f80fd5b50614178614038565b853561418381613f18565b8152602086013561419381613f18565b80602083015250604086013560408201526060860135606082015260808601356141bc81613f18565b608082015260a086013560ff811681146141d4575f80fd5b60a0820152935060c08501356001600160401b038111156141f3575f80fd5b6141ff878288016140fb565b949794965050505060e0830135926101000135919050565b5f6040828403121561401e575f80fd5b5f805f806060858703121561423a575f80fd5b84359350602085013561424c81613f18565b925060408501356001600160401b0380821115614267575f80fd5b818701915087601f83011261427a575f80fd5b813581811115614288575f80fd5b886020828501011115614299575f80fd5b95989497505060200194505050565b5f80604083850312156142b9575f80fd5b82356142c481613f18565b915060208301356142d481613f18565b809150509250929050565b600181811c908216806142f357607f821691505b60208210810361401e57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156108fa576108fa614311565b818103818111156108fa576108fa614311565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b80820281158282048414176108fa576108fa614311565b5f8261440e57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b81516001600160a01b0316815260208083015190820152604081016108fa565b602081525f82516005811061446a57634e487b7160e01b5f52602160045260245ffd5b8060208401525060208301516040808401526117f86060840182613edb565b6020808252602f908201527f4e6174697665546f6b656e52656d6f74653a20636f6e747261637420756e646560408201526e1c98dbdb1b185d195c985b1a5e9959608a1b606082015260800190565b5f602082840312156144e8575f80fd5b5051919050565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b8084101561457c5784518316825293850193600193909301929085019061455a565b5060a0880151878203601f190160e0890152945061459a8186613edb565b98975050505050505050565b5f82601f8301126145b5575f80fd5b81516145c3614118826140d5565b8181528460208386010111156145d7575f80fd5b6117f8826020830160208701613eb9565b5f602082840312156145f8575f80fd5b81516001600160401b038082111561460e575f80fd5b9083019060408286031215614621575f80fd5b614629614060565b825160058110614637575f80fd5b815260208301518281111561464a575f80fd5b614656878286016145a6565b60208301525095945050505050565b8051613f3781613f18565b5f60408284031215614680575f80fd5b614688614060565b825161469381613f18565b81526020928301519281019290925250919050565b5f602082840312156146b8575f80fd5b81516001600160401b03808211156146ce575f80fd5b9083019061010082860312156146e2575f80fd5b6146ea614082565b825181526146fa60208401614665565b602082015261470b60408401614665565b604082015261471c60608401614665565b60608201526080830151608082015260a08301518281111561473c575f80fd5b614748878286016145a6565b60a08301525060c083015160c082015261476460e08401614665565b60e082015295945050505050565b5f60208284031215614782575f80fd5b815161099081613f18565b6020808252602b908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20626c60408201526a1bd8dad8da185a5b88125160aa1b606082015260800190565b60208082526037908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20746f60408201527f6b656e207472616e736665727265722061646472657373000000000000000000606082015260800190565b60208082526024908201527f546f6b656e52656d6f74653a207a65726f20726571756972656420676173206c6040820152631a5b5a5d60e21b606082015260800190565b5f808335601e1984360301811261488e575f80fd5b8301803591506001600160401b038211156148a7575f80fd5b602001915036819003821315613be5575f80fd5b60208152815160208201525f602083015160018060a01b0380821660408501528060408601511660608501525050606083015161490360808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c085015261492a610120850183613edb565b915060c085015160e085015260e085015161494f828601826001600160a01b03169052565b5090949350505050565b5f808335601e1984360301811261496e575f80fd5b83016020810192503590506001600160401b0381111561498c575f80fd5b803603821315613be5575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60408152823560408201525f6149da60208501613f2c565b6001600160a01b031660608301526149f460408501613f2c565b6001600160a01b03166080830152614a0f6060850185614959565b6101608060a0860152614a276101a08601838561499a565b9250608087013560c086015260a087013560e0860152614a4960c08801613f2c565b9150610100614a62818701846001600160a01b03169052565b614a6e60e08901613f2c565b9250610120614a87818801856001600160a01b03169052565b614a92828a01613f2c565b93506101409150614aad828801856001600160a01b03169052565b880135918601919091529095013561018084015260209092019290925292915050565b60208152614aea6020820183516001600160a01b03169052565b602082015160408201525f6040830151614b0f60608401826001600160a01b03169052565b5060608301516001600160a01b038116608084015250608083015160a083015260a08301516101608060c0850152614b4b610180850183613edb565b915060c085015160e085015260e0850151610100614b73818701836001600160a01b03169052565b860151610120868101919091528601519050610140614b9c818701836001600160a01b03169052565b959095015193019290925250919050565b8235815261012081016020840135614bc481613f18565b6001600160a01b039081166020840152604085013590614be382613f18565b166040830152614bf560608501613f2c565b6001600160a01b0381166060840152506080840135608083015260a084013560a083015260c084013560c0830152614c2f60e08501613f2c565b6001600160a01b031660e083015261010090910191909152919050565b8481526001600160a01b038481166020830152831660408201526080606082018190525f9061310190830184613edb565b6020808252603a908201527f546f6b656e52656d6f74653a20696e76616c69642064657374696e6174696f6e60408201527f20746f6b656e207472616e736665727265722061646472657373000000000000606082015260800190565b601f82111561158f57805f5260205f20601f840160051c81016020851015614cff5750805b601f840160051c820191505b81811015611f92575f8155600101614d0b565b81516001600160401b03811115614d3757614d37614024565b614d4b81614d4584546142df565b84614cda565b602080601f831160018114614d7e575f8415614d675750858301515b5f19600386901b1c1916600185901b17855561126e565b5f85815260208120601f198616915b82811015614dac57888601518255948401946001909101908401614d8d565b5085821015614dc957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614dea818460208701613eb9565b9190910192915050565b5f60208284031215614e04575f80fd5b81518015158114610990575f80fd5b60ff82811682821603908111156108fa576108fa614311565b600181815b80851115614e6657815f1904821115614e4c57614e4c614311565b80851615614e5957918102915b93841c9390800290614e31565b509250929050565b5f82614e7c575060016108fa565b81614e8857505f6108fa565b8160018114614e9e5760028114614ea857614ec4565b60019150506108fa565b60ff841115614eb957614eb9614311565b50506001821b6108fa565b5060208310610133831016604e8410600b8410161715614ee7575081810a6108fa565b614ef18383614e2c565b805f1904821115614f0457614f04614311565b029392505050565b5f6109908383614e6e56fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00d2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c750069a5f7616543528c4fbe43f410b1034bd6da4ba06c25bedf04617268014cf500de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a26469706673582212203ac389fdc886afad4fd44bc2525f10f374fc7aaaf79be2957127aaed72f8283e64736f6c63430008190033", } // NativeTokenRemoteUpgradeableABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 66317080d..df73bc057 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -31,7 +31,7 @@ var ( // ConversionData is an auto generated low-level Go binding around an user-defined struct. type ConversionData struct { - SubnetID [32]byte + L1ID [32]byte ValidatorManagerBlockchainID [32]byte ValidatorManagerAddress common.Address InitialValidators []InitialValidator @@ -76,14 +76,14 @@ type Validator struct { // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { - SubnetID [32]byte + L1ID [32]byte ChurnPeriodSeconds uint64 MaximumChurnPercentage uint8 } // ValidatorMessagesValidationPeriod is an auto generated low-level Go binding around an user-defined struct. type ValidatorMessagesValidationPeriod struct { - SubnetID [32]byte + L1ID [32]byte NodeID []byte BlsPublicKey []byte RegistrationExpiry uint64 @@ -103,8 +103,8 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidBLSKeyLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encodedConversionID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedConversionID\",\"type\":\"bytes32\"}],\"name\":\"InvalidConversionID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"}],\"name\":\"InvalidDelegationFee\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidDelegationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumDelegatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidDelegatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"name\":\"InvalidMaximumChurnPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"InvalidMinStakeDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"InvalidNodeID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"InvalidRegistrationExpiry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"InvalidRewardRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"}],\"name\":\"InvalidStakeMultiplier\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"InvalidTokenAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InvalidTotalWeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidUptimeBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"}],\"name\":\"InvalidValidatorManagerAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidatorManagerBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"name\":\"MaxChurnRateExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newValidatorWeight\",\"type\":\"uint64\"}],\"name\":\"MaxWeightExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"MinStakeDurationNotPassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"NodeAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PChainOwnerAddressesNotSorted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorNotPoS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroWeightToValueFactor\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"DelegationEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"DelegatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BIPS_CONVERSION_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"erc20\",\"outputs\":[{\"internalType\":\"contractIERC20Mintable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"startingWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endedAt\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"baseSettings\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"minimumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"minimumStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"weightToValueFactor\",\"type\":\"uint256\"},{\"internalType\":\"contractIRewardCalculator\",\"name\":\"rewardCalculator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"internalType\":\"structPoSValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"contractIERC20Mintable\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delegationAmount\",\"type\":\"uint256\"}],\"name\":\"initializeDelegatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"}],\"internalType\":\"structValidatorRegistrationInput\",\"name\":\"registrationInput\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"initializeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"registeredValidators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"valueToWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"weightToValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615f8a380380615f8a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615e3d8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061024a575f3560e01c80637d8d2f7711610140578063afb98096116100bf578063c974d1b611610084578063c974d1b614610532578063d5f20ff61461053a578063df93d8de1461055a578063e4a63c4014610564578063fb8b11dd14610578578063fd7ac5e71461058b575f80fd5b8063afb98096146104c3578063b771b3bc146104ea578063ba3a4b97146104f8578063bc5fbfec1461050b578063bee0a03f1461051f575f80fd5b80639ae06447116101055780639ae06447146104775780639e1bc4ef1461048a5780639e478eea1461049d578063a3a65e48146104b0578063a9778a7a146102f9575f80fd5b80637d8d2f771461042357806380dd672f146104365780638280a25a146104495780638ef34c981461045157806393e2459814610464575f80fd5b8063467ef06f116101cc578063620658561161019157806362065856146103b257806366435abf146103c5578063732214f8146103d857806376f78621146103df578063785e9e86146103f2575f80fd5b8063467ef06f1461033b5780634bee00401461034e5780635dd6a6cb1461036f57806360305d621461038257806360ad77841461039f575f80fd5b806325e1c7761161021257806325e1c776146102bb5780632e2194d8146102ce57806335455ded146102f957806337b9be8f146103155780633a1cfff614610328575f80fd5b80630118acc41461024e5780630322ed9814610263578063151d30d1146102765780631ec447241461029557806320d91b7a146102a8575b5f80fd5b61026161025c366004614d81565b61059e565b005b610261610271366004614dbc565b6105af565b61027e600a81565b60405160ff90911681526020015b60405180910390f35b6102616102a3366004614d81565b61083f565b6102616102b6366004614dd3565b61084b565b6102616102c9366004614e21565b610e01565b6102e16102dc366004614dbc565b610e75565b6040516001600160401b03909116815260200161028c565b61030261271081565b60405161ffff909116815260200161028c565b610261610323366004614e56565b610ec9565b610261610336366004614d81565b610edc565b610261610349366004614ea4565b610ee8565b61036161035c366004614ee2565b610fba565b60405190815260200161028c565b61026161037d366004614e56565b610fef565b61038a601481565b60405163ffffffff909116815260200161028c565b6102616103ad366004614e21565b610ffb565b6103616103c0366004614f49565b6112c3565b6102e16103d3366004614dbc565b6112e3565b6103615f81565b6102616103ed366004614d81565b6112f7565b5f80516020615d88833981519152546001600160a01b03165b6040516001600160a01b03909116815260200161028c565b610261610431366004614e56565b611303565b610261610444366004614e21565b61130f565b61027e603081565b61026161045f366004614f64565b611549565b610261610472366004614dbc565b6115fa565b610261610485366004614e56565b61168e565b610361610498366004614f92565b61169a565b6102616104ab366004614fb2565b6116c6565b6102616104be366004614ea4565b6117a5565b6103617f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b61040b6005600160991b0181565b610261610506366004614dbc565b61199b565b6103615f80516020615da883398151915281565b61026161052d366004614dbc565b611bf4565b61027e601481565b61054d610548366004614dbc565b611d30565b60405161028c919061505a565b6102e16202a30081565b6103615f80516020615d8883398151915281565b610261610586366004614f64565b611e7f565b6103616105993660046150da565b611f16565b6105aa8383835f611f71565b505050565b5f8181525f80516020615dc88339815191526020526040808220815160e0810190925280545f80516020615da883398151915293929190829060ff1660058111156105fc576105fc614fe5565b600581111561060d5761060d614fe5565b815260200160018201805461062190615145565b80601f016020809104026020016040519081016040528092919081815260200182805461064d90615145565b80156106985780601f1061066f57610100808354040283529160200191610698565b820191905f5260205f20905b81548152906001019060200180831161067b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561070357610703614fe5565b1461073f575f8381526005830160205260409081902054905163170cc93360e21b81526107369160ff169060040161517d565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af41580156107b6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107dd9190810190615286565b6040518263ffffffff1660e01b81526004016107f991906152b7565b6020604051808303815f875af1158015610815573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083991906152c9565b50505050565b6108398383835f611f9d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f80516020615da88339815191529060ff161561089d57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090491906152c9565b83602001351461092d576040516372b0a7e760e11b815260208401356004820152602401610736565b3061093e60608501604086016152e0565b6001600160a01b0316146109815761095c60608401604085016152e0565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610736565b5f61098f60608501856152fb565b905090505f805b828163ffffffff161015610bf7575f6109b260608801886152fb565b8363ffffffff168181106109c8576109c8615340565b90506020028101906109da9190615354565b6109e3906153bf565b80516040519192505f9160068801916109fb9161543a565b90815260200160405180910390205414610a2b57805160405163a41f772f60e01b815261073691906004016152b7565b5f6002885f013584604051602001610a5a92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a749161543a565b602060405180830381855afa158015610a8f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ab291906152c9565b90508086600601835f0151604051610aca919061543a565b90815260408051918290036020908101909220929092555f8381526005890190915220805460ff191660021781558251600190910190610b0a908261548f565b50604082810180515f84815260058a016020529290922060028101805492516001600160401b039485166001600160c01b031990941693909317600160801b85851602176001600160c01b0316600160c01b429590951694909402939093179092556003909101805467ffffffffffffffff19169055610b8a908561555e565b8251604051919550610b9b9161543a565b60408051918290038220908401516001600160401b031682529082907ffe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c9060200160405180910390a3505080610bf09061557e565b9050610996565b5060038301805467ffffffffffffffff60401b1916600160401b6001600160401b0384168102919091179091556001840154606491610c3a910460ff16836155a0565b6001600160401b03161015610c6d57604051633e1a785160e01b81526001600160401b0382166004820152602401610736565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d847884610c91876122ca565b604001516040518263ffffffff1660e01b8152600401610cb191906152b7565b602060405180830381865af4158015610ccc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf091906152c9565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610d2a91906156f6565b5f60405180830381865af4158015610d44573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d6b9190810190615286565b90505f600282604051610d7e919061543a565b602060405180830381855afa158015610d99573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610dbc91906152c9565b9050828114610de85760405163baaea89d60e01b81526004810182905260248101849052604401610736565b5050506007909201805460ff1916600117905550505050565b610e0a826123e0565b610e2a576040516330efa98b60e01b815260048101839052602401610736565b5f610e3483611d30565b5190506002816005811115610e4b57610e4b614fe5565b14610e6b578060405163170cc93360e21b8152600401610736919061517d565b6108398383612409565b5f80610e7f6126a8565b60030154610e8d908461578a565b9050801580610ea257506001600160401b0381115b15610ec35760405163222d164360e21b815260048101849052602401610736565b92915050565b610ed584848484611f9d565b5050505050565b6108398383835f6126cc565b610ef0612909565b5f610ef96126a8565b90505f80610f0684612940565b91509150610f13826123e0565b610f1f57505050610fa1565b5f828152600684016020908152604080832054600b870190925290912080546001600160a01b031981169091556001600160a01b03918216911680610f615750805b600483516005811115610f7657610f76614fe5565b03610f8557610f858185612cf8565b610f9b82610f9685604001516112c3565b612d22565b50505050505b610fb760015f80516020615de883398151915255565b50565b5f610fc3612909565b610fcf85858585612d58565b9050610fe760015f80516020615de883398151915255565b949350505050565b61083984848484612ed8565b5f6110046126a8565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561103d5761103d614fe5565b600381111561104e5761104e614fe5565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6110c482611d30565b90506001835160038111156110db576110db614fe5565b146110fc578251604051633b0d540d60e21b815261073691906004016157a9565b60048151600581111561111157611111614fe5565b036111275761111f86612f04565b505050505050565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f61114c896122ca565b604001516040518263ffffffff1660e01b815260040161116c91906152b7565b606060405180830381865af4158015611187573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ab91906157c3565b50915091508184146111d857846040015160405163089938b360e11b815260040161073691815260200190565b806001600160401b031683606001516001600160401b031610806112115750806001600160401b03168560a001516001600160401b0316115b1561123a57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610736565b5f888152600787016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b810267ffffffffffffffff60401b1990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f6112cc6126a8565b60030154610ec3906001600160401b038416615803565b5f6112ed82611d30565b6080015192915050565b6105aa8383835f612ed8565b610ed5848484846126cc565b611317612909565b5f6113206126a8565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561135957611359614fe5565b600381111561136a5761136a614fe5565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e3576113e3614fe5565b14611404578051604051633b0d540d60e21b815261073691906004016157a9565b60046114138260400151611d30565b51600581111561142557611425614fe5565b14611524575f611434846122ca565b90505f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f84604001516040518263ffffffff1660e01b815260040161147391906152b7565b606060405180830381865af415801561148e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114b291906157c3565b5091509150818460400151146114de5760405163089938b360e11b815260048101839052602401610736565b806001600160401b03168460c001516001600160401b0316111561152057604051632e19bc2d60e11b81526001600160401b0382166004820152602401610736565b5050505b61152d84612f04565b505061154560015f80516020615de883398151915255565b5050565b5f6115526126a8565b90506001600160a01b0382166115865760405163caa903f960e01b81526001600160a01b0383166004820152602401610736565b5f8381526006820160205260409020546001600160a01b031633146115cc57335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610736565b5f928352600b01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f6116036126a8565b90505f61160f83611d30565b519050600481600581111561162657611626614fe5565b14611646578060405163170cc93360e21b8152600401610736919061517d565b5f8381526006830160205260409020546001600160a01b0316331461166b57336115a7565b5f8381526006830160205260409020546105aa906001600160a01b031684612cf8565b61083984848484611f71565b5f6116a3612909565b6116ae8333846130d9565b9050610ec360015f80516020615de883398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061170f575080546001600160401b03808416911610155b1561172d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556117588484613317565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615da88339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f6117d8866122ca565b604001516040518263ffffffff1660e01b81526004016117f891906152b7565b6040805180830381865af4158015611812573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611836919061581a565b915091508061185c57604051632d07135360e01b81528115156004820152602401610736565b5f8281526004840160205260409020805461187690615145565b90505f0361189a5760405163089938b360e11b815260048101839052602401610736565b60015f838152600580860160205260409091205460ff16908111156118c1576118c1614fe5565b146118f4575f8281526005840160205260409081902054905163170cc93360e21b81526107369160ff169060040161517d565b5f828152600484016020526040812061190c91614cd0565b5f828152600584016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917f8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b910160405180910390a250505050565b5f6119a46126a8565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff1660038111156119dd576119dd614fe5565b60038111156119ee576119ee614fe5565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a6757611a67614fe5565b14158015611a885750600381516003811115611a8557611a85614fe5565b14155b15611aa9578051604051633b0d540d60e21b815261073691906004016157a9565b5f611ab78260400151611d30565b905080606001516001600160401b03165f03611ae9576040516339b894f960e21b815260048101859052602401610736565b60408083015160608301516080840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93611b5793906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015611b71573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b989190810190615286565b6040518263ffffffff1660e01b8152600401611bb491906152b7565b6020604051808303815f875af1158015611bd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed591906152c9565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040902080545f80516020615da88339815191529190611c3b90615145565b90505f03611c5f5760405163089938b360e11b815260048101839052602401610736565b60015f838152600580840160205260409091205460ff1690811115611c8657611c86614fe5565b14611cb9575f8281526005820160205260409081902054905163170cc93360e21b81526107369160ff169060040161517d565b5f8281526004808301602052604091829020915163ee5b48eb60e01b81526005600160991b019263ee5b48eb92611cf0920161583d565b6020604051808303815f875af1158015611d0c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105aa91906152c9565b611d38614d07565b5f8281525f80516020615dc8833981519152602052604090819020815160e0810190925280545f80516020615da8833981519152929190829060ff166005811115611d8557611d85614fe5565b6005811115611d9657611d96614fe5565b8152602001600182018054611daa90615145565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd690615145565b8015611e215780601f10611df857610100808354040283529160200191611e21565b820191905f5260205f20905b815481529060010190602001808311611e0457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6001600160a01b038116611eb15760405163caa903f960e01b81526001600160a01b0382166004820152602401610736565b5f611eba6126a8565b5f8481526007820160205260409020549091506001600160a01b03610100909104163314611ee857336115a7565b5f928352600901602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6040515f905f80516020615da8833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0690611f5990869086906158c7565b90815260200160405180910390205491505092915050565b611f7d84848484611f9d565b61083957604051631036cf9160e11b815260048101859052602401610736565b5f80611fa76126a8565b5f878152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115611fe057611fe0614fe5565b6003811115611ff157611ff1614fe5565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61206782611d30565b905060028351600381111561207e5761207e614fe5565b1461209f578251604051633b0d540d60e21b815261073691906004016157a9565b60208301516001600160a01b0316331461213b575f8281526006850160205260409020546001600160a01b031633146120d857336115a7565b5f82815260068501602052604090205460a082015161210791600160b01b90046001600160401b03169061555e565b6001600160401b031642101561213b5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610736565b60028151600581111561215057612150614fe5565b036122725760028401546080840151612172916001600160401b03169061555e565b6001600160401b03164210156121a65760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610736565b87156121b8576121b68288612409565b505b5f8981526007850160205260409020805460ff19166003179055606083015160808201516121f19184916121ec91906158d6565b613331565b505f8a8152600786016020526040812060020180546001600160401b03909316600160c01b026001600160c01b039093169290921790915561223484888c613508565b9050828a7f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5760405160405180910390a315159450610fe79350505050565b60048151600581111561228757612287614fe5565b036122ae5761229783878b613508565b506122a189612f04565b6001945050505050610fe7565b805160405163170cc93360e21b8152610736919060040161517d565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561232e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261235591908101906158f6565b915091508061237757604051636b2f19e960e01b815260040160405180910390fd5b81511561239d578151604051636ba589a560e01b81526004810191909152602401610736565b60208201516001600160a01b0316156123d9576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610736565b5092915050565b5f806123ea6126a8565b5f938452600601602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612454573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261247b91908101906158f6565b915091508061249d57604051636b2f19e960e01b815260040160405180910390fd5b5f6124a66126a8565b60058101548451919250146124d4578251604051636ba589a560e01b81526004810191909152602401610736565b60208301516001600160a01b031615612510576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610736565b60208301516001600160a01b03161561254c576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610736565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b815260040161258991906152b7565b6040805180830381865af41580156125a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c79190615986565b915091508188146125ee5760405163089938b360e11b815260048101899052602401610736565b5f8881526006840160205260409020600101546001600160401b03908116908216111561267f575f888152600684016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261269d565b505f8781526006830160205260409020600101546001600160401b03165b979650505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f806126d66126a8565b90505f6126e2876136f6565b90506126ed876123e0565b6126fc57600192505050610fe7565b5f8781526006830160205260409020546001600160a01b0316331461272157336115a7565b5f87815260068301602052604090205460a082015161275091600160b01b90046001600160401b03169061555e565b6001600160401b03168160c001516001600160401b031610156127975760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610736565b5f86156127af576127a88887612409565b90506127cd565b505f8781526006830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906127f2906112c3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561285b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287f91906152c9565b90506001600160a01b0386166128ab575f8981526006850160205260409020546001600160a01b031695505b5f898152600a85016020526040812080548392906128ca9084906159a9565b90915550505f898152600b909401602052604090932080546001600160a01b0387166001600160a01b0319909116179055505015159050949350505050565b5f80516020615de883398151915280546001190161293a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612949614d07565b5f80516020615da88339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f61297c886122ca565b604001516040518263ffffffff1660e01b815260040161299c91906152b7565b6040805180830381865af41580156129b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129da919061581a565b915091508015612a0157604051632d07135360e01b81528115156004820152602401610736565b5f82815260058085016020526040808320815160e08101909252805491929091839160ff90911690811115612a3857612a38614fe5565b6005811115612a4957612a49614fe5565b8152602001600182018054612a5d90615145565b80601f0160208091040260200160405190810160405280929190818152602001828054612a8990615145565b8015612ad45780601f10612aab57610100808354040283529160200191612ad4565b820191905f5260205f20905b815481529060010190602001808311612ab757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612b3f57612b3f614fe5565b14158015612b605750600181516005811115612b5d57612b5d614fe5565b14155b15612b8157805160405163170cc93360e21b8152610736919060040161517d565b600381516005811115612b9657612b96614fe5565b03612ba45760048152612ba9565b600581525b836006018160200151604051612bbf919061543a565b90815260408051602092819003830190205f90819055858152600587810190935220825181548493839160ff1916906001908490811115612c0257612c02614fe5565b021790555060208201516001820190612c1b908261548f565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612cc157612cc1614fe5565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f612d016126a8565b5f838152600a820160205260408120805491905590915061083984826139db565b5f80516020615d8883398151915254611545906001600160a01b03168383613a51565b60015f80516020615de883398151915255565b5f80612d626126a8565b600281015490915061ffff600160401b90910481169086161080612d8b575061271061ffff8616115b15612daf57604051635f12e6c360e11b815261ffff86166004820152602401610736565b60028101546001600160401b039081169085161015612deb576040516202a06d60e11b81526001600160401b0385166004820152602401610736565b8054831080612dfd5750806001015483115b15612e1e5760405163222d164360e21b815260048101849052602401610736565b5f612e2884613ab0565b90505f612e3482610e75565b90505f612e418983613ad3565b5f818152600686016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600b9096019095529790932080546001600160a01b031916909617909555509395945050505050565b612ee4848484846126cc565b61083957604051635bff683f60e11b815260048101859052602401610736565b5f612f0d6126a8565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115612f4657612f46614fe5565b6003811115612f5757612f57614fe5565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612fcb614045565b602001518260800151612fde919061555e565b6001600160401b03164210156130125760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610736565b5f848152600784016020908152604080832080546001600160a81b03191681556001810184905560020183905560098601909152902080546001600160a01b031981169091556001600160a01b03168061306d575060208201515b5f8061307a8388866140a6565b915091506130938560200151610f9687606001516112c3565b6040805183815260208101839052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f806130e36126a8565b90505f6130f26102dc85613ab0565b90505f6130fe87611d30565b9050613109876123e0565b613129576040516330efa98b60e01b815260048101889052602401610736565b60028151600581111561313e5761313e614fe5565b1461315f57805160405163170cc93360e21b8152610736919060040161517d565b5f828260800151613170919061555e565b6002850154604084015191925061319291600160501b90910460ff16906155a0565b6001600160401b0316816001600160401b031611156131cf57604051636d51fe0560e11b81526001600160401b0382166004820152602401610736565b5f806131db8a84613331565b915091505f8a8360405160200161320992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260078b019093529120805491925060019160ff1916828002179055505f8181526007880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a2234269060800160405180910390a496505050505050505b9392505050565b61331f614153565b6133288261419e565b61154581614218565b5f8281525f80516020615dc8833981519152602052604081206002015481905f80516020615da883398151915290600160801b90046001600160401b03166133798582614280565b5f613383876144ea565b5f888152600585016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af415801561342c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526134539190810190615286565b6040518263ffffffff1660e01b815260040161346f91906152b7565b6020604051808303815f875af115801561348b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134af91906152c9565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f806135126126a8565b90505f6135228660400151611d30565b90505f60038251600581111561353a5761353a614fe5565b1480613558575060048251600581111561355657613556614fe5565b145b15613568575060c08101516135a5565b60028251600581111561357d5761357d614fe5565b036135895750426135a5565b815160405163170cc93360e21b8152610736919060040161517d565b86608001516001600160401b0316816001600160401b0316116135cd575f9350505050613310565b600483015460608801515f916001600160a01b031690634f22429f906135f2906112c3565b60a086015160808c01516040808e01515f90815260068b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa158015613673573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061369791906152c9565b90506001600160a01b0387166136af57876020015196505b5f8681526008850160209081526040808320849055600990960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b6136fe614d07565b5f8281525f80516020615dc88339815191526020526040808220815160e0810190925280545f80516020615da883398151915293929190829060ff16600581111561374b5761374b614fe5565b600581111561375c5761375c614fe5565b815260200160018201805461377090615145565b80601f016020809104026020016040519081016040528092919081815260200182805461379c90615145565b80156137e75780601f106137be576101008083540402835291602001916137e7565b820191905f5260205f20905b8154815290600101906020018083116137ca57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a0909101529091508151600581111561385557613855614fe5565b14613888575f8481526005830160205260409081902054905163170cc93360e21b81526107369160ff169060040161517d565b60038152426001600160401b031660c08201525f84815260058381016020526040909120825181548493839160ff19169060019084908111156138cd576138cd614fe5565b0217905550602082015160018201906138e6908261548f565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6139848582613331565b6080840151604080516001600160401b03909216825242602083015291935083925087917ffbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42910160405180910390a3509392505050565b5f5f80516020615d8883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015613a36575f80fd5b505af1158015613a48573d5f803e3d5ffd5b50505050505050565b6040516001600160a01b038381166024830152604482018390526105aa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061455f565b5f610ec3825f80516020615d88833981519152546001600160a01b0316906145c0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f9060ff16613b1757604051637fab81e560e01b815260040160405180910390fd5b5f80516020615da883398151915242613b366060860160408701614f49565b6001600160401b0316111580613b705750613b546202a300426159a9565b613b646060860160408701614f49565b6001600160401b031610155b15613baa57613b856060850160408601614f49565b604051635879da1360e11b81526001600160401b039091166004820152602401610736565b60038101546001600160401b0390613bcd90600160401b900482168583166159a9565b1115613bf757604051633e1a785160e01b81526001600160401b0384166004820152602401610736565b613c0c613c0760608601866159bc565b6145cc565b613c1c613c0760808601866159bc565b6030613c2b60208601866159d0565b905014613c5d57613c3f60208501856159d0565b6040516326475b2f60e11b8152610736925060040190815260200190565b613c6784806159d0565b90505f03613c9457613c7984806159d0565b604051633e08a12560e11b8152600401610736929190615a12565b5f60068201613ca386806159d0565b604051613cb19291906158c7565b90815260200160405180910390205414613cea57613ccf84806159d0565b60405163a41f772f60e01b8152600401610736929190615a12565b613cf4835f614280565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce519060208101613d318a806159d0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190613d79908b018b6159d0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001613dc260608b0160408c01614f49565b6001600160401b03168152602001613ddd60608b018b6159bc565b613de690615a25565b8152602001613df860808b018b6159bc565b613e0190615a25565b8152602001886001600160401b03168152506040518263ffffffff1660e01b8152600401613e2f9190615b52565b5f60405180830381865af4158015613e49573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613e709190810190615c09565b5f82815260048601602052604090209193509150613e8e828261548f565b508160068401613e9e88806159d0565b604051613eac9291906158c7565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613ee89085906004016152b7565b6020604051808303815f875af1158015613f04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f2891906152c9565b5f8481526005860160205260409020805460ff191660011790559050613f4e87806159d0565b5f858152600587016020526040902060010191613f6c919083615c4c565b505f83815260058501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff1916905580613fcb88806159d0565b604051613fd99291906158c7565b6040518091039020847fd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49898b60400160208101906140179190614f49565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b604080516060810182525f80825260208201819052918101829052905f80516020615da883398151915260408051606081018252825481526001909201546001600160401b0381166020840152600160401b900460ff169082015292915050565b5f805f6140b16126a8565b5f86815260088201602052604081208054908290559192509081908015614145575f878152600685016020526040902054612710906140fb90600160a01b900461ffff1683615803565b614105919061578a565b91508184600a015f8981526020019081526020015f205f82825461412991906159a9565b9091555061413990508282615d05565b925061414589846139db565b509097909650945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661419c57604051631afcd79f60e31b815260040160405180910390fd5b565b6141a6614153565b6141af81614735565b6141b761474e565b610fb7606082013560808301356141d460c0850160a08601614f49565b6141e460e0860160c08701615d18565b6141f5610100870160e08801615d31565b61010087013561420d61014089016101208a016152e0565b88610140013561475e565b614220614153565b5f80516020615d888339815191526001600160a01b03821661426057604051637330680360e01b81526001600160a01b0383166004820152602401610736565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615da88339815191525f6001600160401b0380841690851611156142b4576142ad83856158d6565b90506142c1565b6142be84846158d6565b90505b60408051608081018252600284015480825260038501546001600160401b038082166020850152600160401b8204811694840194909452600160801b900490921660608201524291158061432e57506001840154815161432a916001600160401b0316906159a9565b8210155b15614356576001600160401b0380841660608301528282526040820151166020820152614375565b8281606001818151614368919061555e565b6001600160401b03169052505b60608101516143859060646155a0565b602082015160018601546001600160401b0392909216916143b09190600160401b900460ff166155a0565b6001600160401b031610156143e957606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610736565b85816040018181516143fb919061555e565b6001600160401b031690525060408101805186919061441b9083906158d6565b6001600160401b03169052506001840154604082015160649161444991600160401b90910460ff16906155a0565b6001600160401b03161015614482576040808201519051633e1a785160e01b81526001600160401b039091166004820152602401610736565b8051600285015560208101516003909401805460408301516060909301516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b0319909316919097161717919091169390931790925550505050565b5f8181525f80516020615dc88339815191526020526040812060020180545f80516020615da8833981519152919060089061453490600160401b90046001600160401b0316615d51565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6145736001600160a01b0384168361491b565b905080515f141580156145975750808060200190518101906145959190615d6c565b155b156105aa57604051635274afe760e01b81526001600160a01b0384166004820152602401610736565b5f613310833384614928565b6145d96020820182614ea4565b63ffffffff161580156145f957506145f460208201826152fb565b151590505b156146405761460b6020820182614ea4565b61461860208301836152fb565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610736565b61464d60208201826152fb565b905061465c6020830183614ea4565b63ffffffff1611156146755761460b6020820182614ea4565b60015b61468560208301836152fb565b90508110156115455761469b60208301836152fb565b6146a6600184615d05565b8181106146b5576146b5615340565b90506020020160208101906146ca91906152e0565b6001600160a01b03166146e060208401846152fb565b838181106146f0576146f0615340565b905060200201602081019061470591906152e0565b6001600160a01b0316101561472d57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614678565b61473d614153565b614745614a8b565b610fb781614a93565b614756614153565b61419c614b7b565b614766614153565b5f61476f6126a8565b905061ffff86161580614787575061271061ffff8716115b156147ab57604051635f12e6c360e11b815261ffff87166004820152602401610736565b878911156147cf5760405163222d164360e21b8152600481018a9052602401610736565b60ff851615806147e25750600a60ff8616115b156148055760405163170db35960e31b815260ff86166004820152602401610736565b61480d614045565b602001516001600160401b0316876001600160401b0316101561484d576040516202a06d60e11b81526001600160401b0388166004820152602401610736565b835f0361486d5760405163a733007160e01b815260040160405180910390fd5b8161488e57604051632f6bd1db60e01b815260048101839052602401610736565b978855600188019690965560028701805460ff909416600160501b0260ff60501b1961ffff909616600160401b0269ffffffffffffffffffff199095166001600160401b0390971696909617939093179390931693909317905560038401919091556004830180546001600160a01b039092166001600160a01b0319909216919091179055600590910155565b606061331083835f614b83565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa15801561496e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061499291906152c9565b90506149a96001600160a01b038616853086614c12565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa1580156149ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a1191906152c9565b9050818111614a775760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610736565b614a818282615d05565b9695505050505050565b61419c614153565b614a9b614153565b80355f80516020615da88339815191529081556014614ac06060840160408501615d31565b60ff161180614adf5750614ada6060830160408401615d31565b60ff16155b15614b1357614af46060830160408401615d31565b604051634a59bbff60e11b815260ff9091166004820152602401610736565b614b236060830160408401615d31565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614b546040830160208401614f49565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d45614153565b606081471015614ba85760405163cd78605960e01b8152306004820152602401610736565b5f80856001600160a01b03168486604051614bc3919061543a565b5f6040518083038185875af1925050503d805f8114614bfd576040519150601f19603f3d011682016040523d82523d5f602084013e614c02565b606091505b5091509150614a81868383614c4b565b6040516001600160a01b0384811660248301528381166044830152606482018390526108399186918216906323b872dd90608401613a7e565b606082614c6057614c5b82614ca7565b613310565b8151158015614c7757506001600160a01b0384163b155b15614ca057604051639996b31560e01b81526001600160a01b0385166004820152602401610736565b5080613310565b805115614cb75780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614cdc90615145565b5f825580601f10614ceb575050565b601f0160209004905f5260205f2090810190610fb79190614d44565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614d58575f8155600101614d45565b5090565b8015158114610fb7575f80fd5b803563ffffffff81168114614d7c575f80fd5b919050565b5f805f60608486031215614d93575f80fd5b833592506020840135614da581614d5c565b9150614db360408501614d69565b90509250925092565b5f60208284031215614dcc575f80fd5b5035919050565b5f8060408385031215614de4575f80fd5b82356001600160401b03811115614df9575f80fd5b830160808186031215614e0a575f80fd5b9150614e1860208401614d69565b90509250929050565b5f8060408385031215614e32575f80fd5b82359150614e1860208401614d69565b6001600160a01b0381168114610fb7575f80fd5b5f805f8060808587031215614e69575f80fd5b843593506020850135614e7b81614d5c565b9250614e8960408601614d69565b91506060850135614e9981614e42565b939692955090935050565b5f60208284031215614eb4575f80fd5b61331082614d69565b803561ffff81168114614d7c575f80fd5b6001600160401b0381168114610fb7575f80fd5b5f805f8060808587031215614ef5575f80fd5b84356001600160401b03811115614f0a575f80fd5b850160a08188031215614f1b575f80fd5b9350614f2960208601614ebd565b92506040850135614f3981614ece565b9396929550929360600135925050565b5f60208284031215614f59575f80fd5b813561331081614ece565b5f8060408385031215614f75575f80fd5b823591506020830135614f8781614e42565b809150509250929050565b5f8060408385031215614fa3575f80fd5b50508035926020909101359150565b5f80828403610180811215614fc5575f80fd5b61016080821215614fd4575f80fd5b8493508301359050614f8781614e42565b634e487b7160e01b5f52602160045260245ffd5b6006811061500957615009614fe5565b9052565b5f5b8381101561502757818101518382015260200161500f565b50505f910152565b5f815180845261504681602086016020860161500d565b601f01601f19169290920160200192915050565b6020815261506c602082018351614ff9565b5f602083015160e0604084015261508761010084018261502f565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156150eb575f80fd5b82356001600160401b0380821115615101575f80fd5b818501915085601f830112615114575f80fd5b813581811115615122575f80fd5b866020828501011115615133575f80fd5b60209290920196919550909350505050565b600181811c9082168061515957607f821691505b60208210810361517757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ec38284614ff9565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156151c1576151c161518b565b60405290565b604080519081016001600160401b03811182821017156151c1576151c161518b565b604051601f8201601f191681016001600160401b03811182821017156152115761521161518b565b604052919050565b5f6001600160401b038211156152315761523161518b565b50601f01601f191660200190565b5f82601f83011261524e575f80fd5b815161526161525c82615219565b6151e9565b818152846020838601011115615275575f80fd5b610fe782602083016020870161500d565b5f60208284031215615296575f80fd5b81516001600160401b038111156152ab575f80fd5b610fe78482850161523f565b602081525f613310602083018461502f565b5f602082840312156152d9575f80fd5b5051919050565b5f602082840312156152f0575f80fd5b813561331081614e42565b5f808335601e19843603018112615310575f80fd5b8301803591506001600160401b03821115615329575f80fd5b6020019150600581901b3603821315613501575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615368575f80fd5b9190910192915050565b5f82601f830112615381575f80fd5b813561538f61525c82615219565b8181528460208386010111156153a3575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156153cf575f80fd5b6153d761519f565b82356001600160401b03808211156153ed575f80fd5b6153f936838701615372565b8352602085013591508082111561540e575f80fd5b5061541b36828601615372565b602083015250604083013561542f81614ece565b604082015292915050565b5f825161536881846020870161500d565b601f8211156105aa57805f5260205f20601f840160051c810160208510156154705750805b601f840160051c820191505b81811015610ed5575f815560010161547c565b81516001600160401b038111156154a8576154a861518b565b6154bc816154b68454615145565b8461544b565b602080601f8311600181146154ef575f84156154d85750858301515b5f19600386901b1c1916600185901b17855561111f565b5f85815260208120601f198616915b8281101561551d578886015182559484019460019091019084016154fe565b508582101561553a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156123d9576123d961554a565b5f63ffffffff8083168181036155965761559661554a565b6001019392505050565b6001600160401b038181168382160280821691908281146155c3576155c361554a565b505092915050565b5f808335601e198436030181126155e0575f80fd5b83016020810192503590506001600160401b038111156155fe575f80fd5b803603821315613501575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b878110156156e957848303601f19018952813536889003605e19018112615670575f80fd5b8701606061567e82806155cb565b82875261568e838801828461560c565b9250505061569e868301836155cb565b868303888801526156b083828461560c565b9250505060408083013592506156c583614ece565b6001600160401b03929092169490910193909352978301979083019060010161564b565b5090979650505050505050565b6020815281356020820152602082013560408201525f604083013561571a81614e42565b6001600160a01b031660608381019190915283013536849003601e19018112615741575f80fd5b83016020810190356001600160401b0381111561575c575f80fd5b8060051b360382131561576d575f80fd5b60808085015261578160a085018284615634565b95945050505050565b5f826157a457634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157bd576157bd614fe5565b91905290565b5f805f606084860312156157d5575f80fd5b8351925060208401516157e781614ece565b60408501519092506157f881614ece565b809150509250925092565b8082028115828204841417610ec357610ec361554a565b5f806040838503121561582b575f80fd5b825191506020830151614f8781614d5c565b5f60208083525f845461584f81615145565b806020870152604060018084165f8114615870576001811461588c576158b9565b60ff19851660408a0152604084151560051b8a010195506158b9565b895f5260205f205f5b858110156158b05781548b8201860152908301908801615895565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038281168282160390808211156123d9576123d961554a565b5f8060408385031215615907575f80fd5b82516001600160401b038082111561591d575f80fd5b9084019060608287031215615930575f80fd5b61593861519f565b82518152602083015161594a81614e42565b6020820152604083015182811115615960575f80fd5b61596c8882860161523f565b6040830152508094505050506020830151614f8781614d5c565b5f8060408385031215615997575f80fd5b825191506020830151614f8781614ece565b80820180821115610ec357610ec361554a565b5f8235603e19833603018112615368575f80fd5b5f808335601e198436030181126159e5575f80fd5b8301803591506001600160401b038211156159fe575f80fd5b602001915036819003821315613501575f80fd5b602081525f610fe760208301848661560c565b5f60408236031215615a35575f80fd5b615a3d6151c7565b615a4683614d69565b81526020808401356001600160401b0380821115615a62575f80fd5b9085019036601f830112615a74575f80fd5b813581811115615a8657615a8661518b565b8060051b9150615a978483016151e9565b8181529183018401918481019036841115615ab0575f80fd5b938501935b83851015615ada5784359250615aca83614e42565b8282529385019390850190615ab5565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015615b475784516001600160a01b03168252938301936001929092019190830190615b1e565b509695505050505050565b60208152815160208201525f602083015160e06040840152615b7861010084018261502f565b90506040840151601f1980858403016060860152615b96838361502f565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152615bc68383615aec565b925060a08601519150808584030160c086015250615be48282615aec565b91505060c0840151615c0160e08501826001600160401b03169052565b509392505050565b5f8060408385031215615c1a575f80fd5b8251915060208301516001600160401b03811115615c36575f80fd5b615c428582860161523f565b9150509250929050565b6001600160401b03831115615c6357615c6361518b565b615c7783615c718354615145565b8361544b565b5f601f841160018114615ca8575f8515615c915750838201355b5f19600387901b1c1916600186901b178355610ed5565b5f83815260208120601f198716915b82811015615cd75786850135825560209485019460019092019101615cb7565b5086821015615cf3575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81810381811115610ec357610ec361554a565b5f60208284031215615d28575f80fd5b61331082614ebd565b5f60208284031215615d41575f80fd5b813560ff81168114613310575f80fd5b5f6001600160401b038083168181036155965761559661554a565b5f60208284031215615d7c575f80fd5b815161331081614d5c56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb059b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220ee25e381fae95b0185742479ca4122b379a66cb39687e5c34843bddb8afe124564736f6c63430008190033", + ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidBLSKeyLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encodedConversionID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedConversionID\",\"type\":\"bytes32\"}],\"name\":\"InvalidConversionID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"}],\"name\":\"InvalidDelegationFee\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidDelegationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumDelegatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidDelegatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"name\":\"InvalidMaximumChurnPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"InvalidMinStakeDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"InvalidNodeID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"InvalidRegistrationExpiry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"InvalidRewardRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"}],\"name\":\"InvalidStakeMultiplier\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"InvalidTokenAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InvalidTotalWeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidUptimeBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"}],\"name\":\"InvalidValidatorManagerAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidatorManagerBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"name\":\"MaxChurnRateExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newValidatorWeight\",\"type\":\"uint64\"}],\"name\":\"MaxWeightExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"MinStakeDurationNotPassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"NodeAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PChainOwnerAddressesNotSorted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorNotPoS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroWeightToValueFactor\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"DelegationEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"DelegatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BIPS_CONVERSION_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"erc20\",\"outputs\":[{\"internalType\":\"contractIERC20Mintable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"startingWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endedAt\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"baseSettings\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"minimumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"minimumStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"weightToValueFactor\",\"type\":\"uint256\"},{\"internalType\":\"contractIRewardCalculator\",\"name\":\"rewardCalculator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"internalType\":\"structPoSValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"contractIERC20Mintable\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delegationAmount\",\"type\":\"uint256\"}],\"name\":\"initializeDelegatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"}],\"internalType\":\"structValidatorRegistrationInput\",\"name\":\"registrationInput\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"initializeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"registeredValidators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"valueToWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"weightToValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615f8a380380615f8a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615e3d8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061024a575f3560e01c80637d8d2f7711610140578063afb98096116100bf578063c974d1b611610084578063c974d1b614610532578063d5f20ff61461053a578063df93d8de1461055a578063e4a63c4014610564578063fb8b11dd14610578578063fd7ac5e71461058b575f80fd5b8063afb98096146104c3578063b771b3bc146104ea578063ba3a4b97146104f8578063bc5fbfec1461050b578063bee0a03f1461051f575f80fd5b80639ae06447116101055780639ae06447146104775780639e1bc4ef1461048a5780639e478eea1461049d578063a3a65e48146104b0578063a9778a7a146102f9575f80fd5b80637d8d2f771461042357806380dd672f146104365780638280a25a146104495780638ef34c981461045157806393e2459814610464575f80fd5b8063467ef06f116101cc578063620658561161019157806362065856146103b257806366435abf146103c5578063732214f8146103d857806376f78621146103df578063785e9e86146103f2575f80fd5b8063467ef06f1461033b5780634bee00401461034e5780635dd6a6cb1461036f57806360305d621461038257806360ad77841461039f575f80fd5b806325e1c7761161021257806325e1c776146102bb5780632e2194d8146102ce57806335455ded146102f957806337b9be8f146103155780633a1cfff614610328575f80fd5b80630118acc41461024e5780630322ed9814610263578063151d30d1146102765780631ec447241461029557806320d91b7a146102a8575b5f80fd5b61026161025c366004614d81565b61059e565b005b610261610271366004614dbc565b6105af565b61027e600a81565b60405160ff90911681526020015b60405180910390f35b6102616102a3366004614d81565b61083f565b6102616102b6366004614dd3565b61084b565b6102616102c9366004614e21565b610e01565b6102e16102dc366004614dbc565b610e75565b6040516001600160401b03909116815260200161028c565b61030261271081565b60405161ffff909116815260200161028c565b610261610323366004614e56565b610ec9565b610261610336366004614d81565b610edc565b610261610349366004614ea4565b610ee8565b61036161035c366004614ee2565b610fba565b60405190815260200161028c565b61026161037d366004614e56565b610fef565b61038a601481565b60405163ffffffff909116815260200161028c565b6102616103ad366004614e21565b610ffb565b6103616103c0366004614f49565b6112c3565b6102e16103d3366004614dbc565b6112e3565b6103615f81565b6102616103ed366004614d81565b6112f7565b5f80516020615d88833981519152546001600160a01b03165b6040516001600160a01b03909116815260200161028c565b610261610431366004614e56565b611303565b610261610444366004614e21565b61130f565b61027e603081565b61026161045f366004614f64565b611549565b610261610472366004614dbc565b6115fa565b610261610485366004614e56565b61168e565b610361610498366004614f92565b61169a565b6102616104ab366004614fb2565b6116c6565b6102616104be366004614ea4565b6117a5565b6103617f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b61040b6005600160991b0181565b610261610506366004614dbc565b61199b565b6103615f80516020615da883398151915281565b61026161052d366004614dbc565b611bf4565b61027e601481565b61054d610548366004614dbc565b611d30565b60405161028c919061505a565b6102e16202a30081565b6103615f80516020615d8883398151915281565b610261610586366004614f64565b611e7f565b6103616105993660046150da565b611f16565b6105aa8383835f611f71565b505050565b5f8181525f80516020615dc88339815191526020526040808220815160e0810190925280545f80516020615da883398151915293929190829060ff1660058111156105fc576105fc614fe5565b600581111561060d5761060d614fe5565b815260200160018201805461062190615145565b80601f016020809104026020016040519081016040528092919081815260200182805461064d90615145565b80156106985780601f1061066f57610100808354040283529160200191610698565b820191905f5260205f20905b81548152906001019060200180831161067b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561070357610703614fe5565b1461073f575f8381526005830160205260409081902054905163170cc93360e21b81526107369160ff169060040161517d565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af41580156107b6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107dd9190810190615286565b6040518263ffffffff1660e01b81526004016107f991906152b7565b6020604051808303815f875af1158015610815573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083991906152c9565b50505050565b6108398383835f611f9d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f80516020615da88339815191529060ff161561089d57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090491906152c9565b83602001351461092d576040516372b0a7e760e11b815260208401356004820152602401610736565b3061093e60608501604086016152e0565b6001600160a01b0316146109815761095c60608401604085016152e0565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610736565b5f61098f60608501856152fb565b905090505f805b828163ffffffff161015610bf7575f6109b260608801886152fb565b8363ffffffff168181106109c8576109c8615340565b90506020028101906109da9190615354565b6109e3906153bf565b80516040519192505f9160068801916109fb9161543a565b90815260200160405180910390205414610a2b57805160405163a41f772f60e01b815261073691906004016152b7565b5f6002885f013584604051602001610a5a92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a749161543a565b602060405180830381855afa158015610a8f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ab291906152c9565b90508086600601835f0151604051610aca919061543a565b90815260408051918290036020908101909220929092555f8381526005890190915220805460ff191660021781558251600190910190610b0a908261548f565b50604082810180515f84815260058a016020529290922060028101805492516001600160401b039485166001600160c01b031990941693909317600160801b85851602176001600160c01b0316600160c01b429590951694909402939093179092556003909101805467ffffffffffffffff19169055610b8a908561555e565b8251604051919550610b9b9161543a565b60408051918290038220908401516001600160401b031682529082907ffe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c9060200160405180910390a3505080610bf09061557e565b9050610996565b5060038301805467ffffffffffffffff60401b1916600160401b6001600160401b0384168102919091179091556001840154606491610c3a910460ff16836155a0565b6001600160401b03161015610c6d57604051633e1a785160e01b81526001600160401b0382166004820152602401610736565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d847884610c91876122ca565b604001516040518263ffffffff1660e01b8152600401610cb191906152b7565b602060405180830381865af4158015610ccc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf091906152c9565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610d2a91906156f6565b5f60405180830381865af4158015610d44573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d6b9190810190615286565b90505f600282604051610d7e919061543a565b602060405180830381855afa158015610d99573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610dbc91906152c9565b9050828114610de85760405163baaea89d60e01b81526004810182905260248101849052604401610736565b5050506007909201805460ff1916600117905550505050565b610e0a826123e0565b610e2a576040516330efa98b60e01b815260048101839052602401610736565b5f610e3483611d30565b5190506002816005811115610e4b57610e4b614fe5565b14610e6b578060405163170cc93360e21b8152600401610736919061517d565b6108398383612409565b5f80610e7f6126a8565b60030154610e8d908461578a565b9050801580610ea257506001600160401b0381115b15610ec35760405163222d164360e21b815260048101849052602401610736565b92915050565b610ed584848484611f9d565b5050505050565b6108398383835f6126cc565b610ef0612909565b5f610ef96126a8565b90505f80610f0684612940565b91509150610f13826123e0565b610f1f57505050610fa1565b5f828152600684016020908152604080832054600b870190925290912080546001600160a01b031981169091556001600160a01b03918216911680610f615750805b600483516005811115610f7657610f76614fe5565b03610f8557610f858185612cf8565b610f9b82610f9685604001516112c3565b612d22565b50505050505b610fb760015f80516020615de883398151915255565b50565b5f610fc3612909565b610fcf85858585612d58565b9050610fe760015f80516020615de883398151915255565b949350505050565b61083984848484612ed8565b5f6110046126a8565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561103d5761103d614fe5565b600381111561104e5761104e614fe5565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6110c482611d30565b90506001835160038111156110db576110db614fe5565b146110fc578251604051633b0d540d60e21b815261073691906004016157a9565b60048151600581111561111157611111614fe5565b036111275761111f86612f04565b505050505050565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f61114c896122ca565b604001516040518263ffffffff1660e01b815260040161116c91906152b7565b606060405180830381865af4158015611187573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ab91906157c3565b50915091508184146111d857846040015160405163089938b360e11b815260040161073691815260200190565b806001600160401b031683606001516001600160401b031610806112115750806001600160401b03168560a001516001600160401b0316115b1561123a57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610736565b5f888152600787016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b810267ffffffffffffffff60401b1990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f6112cc6126a8565b60030154610ec3906001600160401b038416615803565b5f6112ed82611d30565b6080015192915050565b6105aa8383835f612ed8565b610ed5848484846126cc565b611317612909565b5f6113206126a8565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561135957611359614fe5565b600381111561136a5761136a614fe5565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e3576113e3614fe5565b14611404578051604051633b0d540d60e21b815261073691906004016157a9565b60046114138260400151611d30565b51600581111561142557611425614fe5565b14611524575f611434846122ca565b90505f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f84604001516040518263ffffffff1660e01b815260040161147391906152b7565b606060405180830381865af415801561148e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114b291906157c3565b5091509150818460400151146114de5760405163089938b360e11b815260048101839052602401610736565b806001600160401b03168460c001516001600160401b0316111561152057604051632e19bc2d60e11b81526001600160401b0382166004820152602401610736565b5050505b61152d84612f04565b505061154560015f80516020615de883398151915255565b5050565b5f6115526126a8565b90506001600160a01b0382166115865760405163caa903f960e01b81526001600160a01b0383166004820152602401610736565b5f8381526006820160205260409020546001600160a01b031633146115cc57335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610736565b5f928352600b01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f6116036126a8565b90505f61160f83611d30565b519050600481600581111561162657611626614fe5565b14611646578060405163170cc93360e21b8152600401610736919061517d565b5f8381526006830160205260409020546001600160a01b0316331461166b57336115a7565b5f8381526006830160205260409020546105aa906001600160a01b031684612cf8565b61083984848484611f71565b5f6116a3612909565b6116ae8333846130d9565b9050610ec360015f80516020615de883398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061170f575080546001600160401b03808416911610155b1561172d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556117588484613317565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615da88339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f6117d8866122ca565b604001516040518263ffffffff1660e01b81526004016117f891906152b7565b6040805180830381865af4158015611812573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611836919061581a565b915091508061185c57604051632d07135360e01b81528115156004820152602401610736565b5f8281526004840160205260409020805461187690615145565b90505f0361189a5760405163089938b360e11b815260048101839052602401610736565b60015f838152600580860160205260409091205460ff16908111156118c1576118c1614fe5565b146118f4575f8281526005840160205260409081902054905163170cc93360e21b81526107369160ff169060040161517d565b5f828152600484016020526040812061190c91614cd0565b5f828152600584016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917f8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b910160405180910390a250505050565b5f6119a46126a8565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff1660038111156119dd576119dd614fe5565b60038111156119ee576119ee614fe5565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a6757611a67614fe5565b14158015611a885750600381516003811115611a8557611a85614fe5565b14155b15611aa9578051604051633b0d540d60e21b815261073691906004016157a9565b5f611ab78260400151611d30565b905080606001516001600160401b03165f03611ae9576040516339b894f960e21b815260048101859052602401610736565b60408083015160608301516080840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93611b5793906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015611b71573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b989190810190615286565b6040518263ffffffff1660e01b8152600401611bb491906152b7565b6020604051808303815f875af1158015611bd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed591906152c9565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040902080545f80516020615da88339815191529190611c3b90615145565b90505f03611c5f5760405163089938b360e11b815260048101839052602401610736565b60015f838152600580840160205260409091205460ff1690811115611c8657611c86614fe5565b14611cb9575f8281526005820160205260409081902054905163170cc93360e21b81526107369160ff169060040161517d565b5f8281526004808301602052604091829020915163ee5b48eb60e01b81526005600160991b019263ee5b48eb92611cf0920161583d565b6020604051808303815f875af1158015611d0c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105aa91906152c9565b611d38614d07565b5f8281525f80516020615dc8833981519152602052604090819020815160e0810190925280545f80516020615da8833981519152929190829060ff166005811115611d8557611d85614fe5565b6005811115611d9657611d96614fe5565b8152602001600182018054611daa90615145565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd690615145565b8015611e215780601f10611df857610100808354040283529160200191611e21565b820191905f5260205f20905b815481529060010190602001808311611e0457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6001600160a01b038116611eb15760405163caa903f960e01b81526001600160a01b0382166004820152602401610736565b5f611eba6126a8565b5f8481526007820160205260409020549091506001600160a01b03610100909104163314611ee857336115a7565b5f928352600901602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6040515f905f80516020615da8833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0690611f5990869086906158c7565b90815260200160405180910390205491505092915050565b611f7d84848484611f9d565b61083957604051631036cf9160e11b815260048101859052602401610736565b5f80611fa76126a8565b5f878152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115611fe057611fe0614fe5565b6003811115611ff157611ff1614fe5565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61206782611d30565b905060028351600381111561207e5761207e614fe5565b1461209f578251604051633b0d540d60e21b815261073691906004016157a9565b60208301516001600160a01b0316331461213b575f8281526006850160205260409020546001600160a01b031633146120d857336115a7565b5f82815260068501602052604090205460a082015161210791600160b01b90046001600160401b03169061555e565b6001600160401b031642101561213b5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610736565b60028151600581111561215057612150614fe5565b036122725760028401546080840151612172916001600160401b03169061555e565b6001600160401b03164210156121a65760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610736565b87156121b8576121b68288612409565b505b5f8981526007850160205260409020805460ff19166003179055606083015160808201516121f19184916121ec91906158d6565b613331565b505f8a8152600786016020526040812060020180546001600160401b03909316600160c01b026001600160c01b039093169290921790915561223484888c613508565b9050828a7f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5760405160405180910390a315159450610fe79350505050565b60048151600581111561228757612287614fe5565b036122ae5761229783878b613508565b506122a189612f04565b6001945050505050610fe7565b805160405163170cc93360e21b8152610736919060040161517d565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561232e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261235591908101906158f6565b915091508061237757604051636b2f19e960e01b815260040160405180910390fd5b81511561239d578151604051636ba589a560e01b81526004810191909152602401610736565b60208201516001600160a01b0316156123d9576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610736565b5092915050565b5f806123ea6126a8565b5f938452600601602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612454573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261247b91908101906158f6565b915091508061249d57604051636b2f19e960e01b815260040160405180910390fd5b5f6124a66126a8565b60058101548451919250146124d4578251604051636ba589a560e01b81526004810191909152602401610736565b60208301516001600160a01b031615612510576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610736565b60208301516001600160a01b03161561254c576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610736565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b815260040161258991906152b7565b6040805180830381865af41580156125a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c79190615986565b915091508188146125ee5760405163089938b360e11b815260048101899052602401610736565b5f8881526006840160205260409020600101546001600160401b03908116908216111561267f575f888152600684016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261269d565b505f8781526006830160205260409020600101546001600160401b03165b979650505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f806126d66126a8565b90505f6126e2876136f6565b90506126ed876123e0565b6126fc57600192505050610fe7565b5f8781526006830160205260409020546001600160a01b0316331461272157336115a7565b5f87815260068301602052604090205460a082015161275091600160b01b90046001600160401b03169061555e565b6001600160401b03168160c001516001600160401b031610156127975760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610736565b5f86156127af576127a88887612409565b90506127cd565b505f8781526006830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906127f2906112c3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561285b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287f91906152c9565b90506001600160a01b0386166128ab575f8981526006850160205260409020546001600160a01b031695505b5f898152600a85016020526040812080548392906128ca9084906159a9565b90915550505f898152600b909401602052604090932080546001600160a01b0387166001600160a01b0319909116179055505015159050949350505050565b5f80516020615de883398151915280546001190161293a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612949614d07565b5f80516020615da88339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f61297c886122ca565b604001516040518263ffffffff1660e01b815260040161299c91906152b7565b6040805180830381865af41580156129b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129da919061581a565b915091508015612a0157604051632d07135360e01b81528115156004820152602401610736565b5f82815260058085016020526040808320815160e08101909252805491929091839160ff90911690811115612a3857612a38614fe5565b6005811115612a4957612a49614fe5565b8152602001600182018054612a5d90615145565b80601f0160208091040260200160405190810160405280929190818152602001828054612a8990615145565b8015612ad45780601f10612aab57610100808354040283529160200191612ad4565b820191905f5260205f20905b815481529060010190602001808311612ab757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612b3f57612b3f614fe5565b14158015612b605750600181516005811115612b5d57612b5d614fe5565b14155b15612b8157805160405163170cc93360e21b8152610736919060040161517d565b600381516005811115612b9657612b96614fe5565b03612ba45760048152612ba9565b600581525b836006018160200151604051612bbf919061543a565b90815260408051602092819003830190205f90819055858152600587810190935220825181548493839160ff1916906001908490811115612c0257612c02614fe5565b021790555060208201516001820190612c1b908261548f565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612cc157612cc1614fe5565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f612d016126a8565b5f838152600a820160205260408120805491905590915061083984826139db565b5f80516020615d8883398151915254611545906001600160a01b03168383613a51565b60015f80516020615de883398151915255565b5f80612d626126a8565b600281015490915061ffff600160401b90910481169086161080612d8b575061271061ffff8616115b15612daf57604051635f12e6c360e11b815261ffff86166004820152602401610736565b60028101546001600160401b039081169085161015612deb576040516202a06d60e11b81526001600160401b0385166004820152602401610736565b8054831080612dfd5750806001015483115b15612e1e5760405163222d164360e21b815260048101849052602401610736565b5f612e2884613ab0565b90505f612e3482610e75565b90505f612e418983613ad3565b5f818152600686016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600b9096019095529790932080546001600160a01b031916909617909555509395945050505050565b612ee4848484846126cc565b61083957604051635bff683f60e11b815260048101859052602401610736565b5f612f0d6126a8565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115612f4657612f46614fe5565b6003811115612f5757612f57614fe5565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612fcb614045565b602001518260800151612fde919061555e565b6001600160401b03164210156130125760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610736565b5f848152600784016020908152604080832080546001600160a81b03191681556001810184905560020183905560098601909152902080546001600160a01b031981169091556001600160a01b03168061306d575060208201515b5f8061307a8388866140a6565b915091506130938560200151610f9687606001516112c3565b6040805183815260208101839052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f806130e36126a8565b90505f6130f26102dc85613ab0565b90505f6130fe87611d30565b9050613109876123e0565b613129576040516330efa98b60e01b815260048101889052602401610736565b60028151600581111561313e5761313e614fe5565b1461315f57805160405163170cc93360e21b8152610736919060040161517d565b5f828260800151613170919061555e565b6002850154604084015191925061319291600160501b90910460ff16906155a0565b6001600160401b0316816001600160401b031611156131cf57604051636d51fe0560e11b81526001600160401b0382166004820152602401610736565b5f806131db8a84613331565b915091505f8a8360405160200161320992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260078b019093529120805491925060019160ff1916828002179055505f8181526007880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a2234269060800160405180910390a496505050505050505b9392505050565b61331f614153565b6133288261419e565b61154581614218565b5f8281525f80516020615dc8833981519152602052604081206002015481905f80516020615da883398151915290600160801b90046001600160401b03166133798582614280565b5f613383876144ea565b5f888152600585016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af415801561342c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526134539190810190615286565b6040518263ffffffff1660e01b815260040161346f91906152b7565b6020604051808303815f875af115801561348b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134af91906152c9565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f806135126126a8565b90505f6135228660400151611d30565b90505f60038251600581111561353a5761353a614fe5565b1480613558575060048251600581111561355657613556614fe5565b145b15613568575060c08101516135a5565b60028251600581111561357d5761357d614fe5565b036135895750426135a5565b815160405163170cc93360e21b8152610736919060040161517d565b86608001516001600160401b0316816001600160401b0316116135cd575f9350505050613310565b600483015460608801515f916001600160a01b031690634f22429f906135f2906112c3565b60a086015160808c01516040808e01515f90815260068b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa158015613673573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061369791906152c9565b90506001600160a01b0387166136af57876020015196505b5f8681526008850160209081526040808320849055600990960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b6136fe614d07565b5f8281525f80516020615dc88339815191526020526040808220815160e0810190925280545f80516020615da883398151915293929190829060ff16600581111561374b5761374b614fe5565b600581111561375c5761375c614fe5565b815260200160018201805461377090615145565b80601f016020809104026020016040519081016040528092919081815260200182805461379c90615145565b80156137e75780601f106137be576101008083540402835291602001916137e7565b820191905f5260205f20905b8154815290600101906020018083116137ca57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a0909101529091508151600581111561385557613855614fe5565b14613888575f8481526005830160205260409081902054905163170cc93360e21b81526107369160ff169060040161517d565b60038152426001600160401b031660c08201525f84815260058381016020526040909120825181548493839160ff19169060019084908111156138cd576138cd614fe5565b0217905550602082015160018201906138e6908261548f565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6139848582613331565b6080840151604080516001600160401b03909216825242602083015291935083925087917ffbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42910160405180910390a3509392505050565b5f5f80516020615d8883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015613a36575f80fd5b505af1158015613a48573d5f803e3d5ffd5b50505050505050565b6040516001600160a01b038381166024830152604482018390526105aa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061455f565b5f610ec3825f80516020615d88833981519152546001600160a01b0316906145c0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f9060ff16613b1757604051637fab81e560e01b815260040160405180910390fd5b5f80516020615da883398151915242613b366060860160408701614f49565b6001600160401b0316111580613b705750613b546202a300426159a9565b613b646060860160408701614f49565b6001600160401b031610155b15613baa57613b856060850160408601614f49565b604051635879da1360e11b81526001600160401b039091166004820152602401610736565b60038101546001600160401b0390613bcd90600160401b900482168583166159a9565b1115613bf757604051633e1a785160e01b81526001600160401b0384166004820152602401610736565b613c0c613c0760608601866159bc565b6145cc565b613c1c613c0760808601866159bc565b6030613c2b60208601866159d0565b905014613c5d57613c3f60208501856159d0565b6040516326475b2f60e11b8152610736925060040190815260200190565b613c6784806159d0565b90505f03613c9457613c7984806159d0565b604051633e08a12560e11b8152600401610736929190615a12565b5f60068201613ca386806159d0565b604051613cb19291906158c7565b90815260200160405180910390205414613cea57613ccf84806159d0565b60405163a41f772f60e01b8152600401610736929190615a12565b613cf4835f614280565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce519060208101613d318a806159d0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190613d79908b018b6159d0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001613dc260608b0160408c01614f49565b6001600160401b03168152602001613ddd60608b018b6159bc565b613de690615a25565b8152602001613df860808b018b6159bc565b613e0190615a25565b8152602001886001600160401b03168152506040518263ffffffff1660e01b8152600401613e2f9190615b52565b5f60405180830381865af4158015613e49573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613e709190810190615c09565b5f82815260048601602052604090209193509150613e8e828261548f565b508160068401613e9e88806159d0565b604051613eac9291906158c7565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613ee89085906004016152b7565b6020604051808303815f875af1158015613f04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f2891906152c9565b5f8481526005860160205260409020805460ff191660011790559050613f4e87806159d0565b5f858152600587016020526040902060010191613f6c919083615c4c565b505f83815260058501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff1916905580613fcb88806159d0565b604051613fd99291906158c7565b6040518091039020847fd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49898b60400160208101906140179190614f49565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b604080516060810182525f80825260208201819052918101829052905f80516020615da883398151915260408051606081018252825481526001909201546001600160401b0381166020840152600160401b900460ff169082015292915050565b5f805f6140b16126a8565b5f86815260088201602052604081208054908290559192509081908015614145575f878152600685016020526040902054612710906140fb90600160a01b900461ffff1683615803565b614105919061578a565b91508184600a015f8981526020019081526020015f205f82825461412991906159a9565b9091555061413990508282615d05565b925061414589846139db565b509097909650945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661419c57604051631afcd79f60e31b815260040160405180910390fd5b565b6141a6614153565b6141af81614735565b6141b761474e565b610fb7606082013560808301356141d460c0850160a08601614f49565b6141e460e0860160c08701615d18565b6141f5610100870160e08801615d31565b61010087013561420d61014089016101208a016152e0565b88610140013561475e565b614220614153565b5f80516020615d888339815191526001600160a01b03821661426057604051637330680360e01b81526001600160a01b0383166004820152602401610736565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615da88339815191525f6001600160401b0380841690851611156142b4576142ad83856158d6565b90506142c1565b6142be84846158d6565b90505b60408051608081018252600284015480825260038501546001600160401b038082166020850152600160401b8204811694840194909452600160801b900490921660608201524291158061432e57506001840154815161432a916001600160401b0316906159a9565b8210155b15614356576001600160401b0380841660608301528282526040820151166020820152614375565b8281606001818151614368919061555e565b6001600160401b03169052505b60608101516143859060646155a0565b602082015160018601546001600160401b0392909216916143b09190600160401b900460ff166155a0565b6001600160401b031610156143e957606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610736565b85816040018181516143fb919061555e565b6001600160401b031690525060408101805186919061441b9083906158d6565b6001600160401b03169052506001840154604082015160649161444991600160401b90910460ff16906155a0565b6001600160401b03161015614482576040808201519051633e1a785160e01b81526001600160401b039091166004820152602401610736565b8051600285015560208101516003909401805460408301516060909301516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b0319909316919097161717919091169390931790925550505050565b5f8181525f80516020615dc88339815191526020526040812060020180545f80516020615da8833981519152919060089061453490600160401b90046001600160401b0316615d51565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6145736001600160a01b0384168361491b565b905080515f141580156145975750808060200190518101906145959190615d6c565b155b156105aa57604051635274afe760e01b81526001600160a01b0384166004820152602401610736565b5f613310833384614928565b6145d96020820182614ea4565b63ffffffff161580156145f957506145f460208201826152fb565b151590505b156146405761460b6020820182614ea4565b61461860208301836152fb565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610736565b61464d60208201826152fb565b905061465c6020830183614ea4565b63ffffffff1611156146755761460b6020820182614ea4565b60015b61468560208301836152fb565b90508110156115455761469b60208301836152fb565b6146a6600184615d05565b8181106146b5576146b5615340565b90506020020160208101906146ca91906152e0565b6001600160a01b03166146e060208401846152fb565b838181106146f0576146f0615340565b905060200201602081019061470591906152e0565b6001600160a01b0316101561472d57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614678565b61473d614153565b614745614a8b565b610fb781614a93565b614756614153565b61419c614b7b565b614766614153565b5f61476f6126a8565b905061ffff86161580614787575061271061ffff8716115b156147ab57604051635f12e6c360e11b815261ffff87166004820152602401610736565b878911156147cf5760405163222d164360e21b8152600481018a9052602401610736565b60ff851615806147e25750600a60ff8616115b156148055760405163170db35960e31b815260ff86166004820152602401610736565b61480d614045565b602001516001600160401b0316876001600160401b0316101561484d576040516202a06d60e11b81526001600160401b0388166004820152602401610736565b835f0361486d5760405163a733007160e01b815260040160405180910390fd5b8161488e57604051632f6bd1db60e01b815260048101839052602401610736565b978855600188019690965560028701805460ff909416600160501b0260ff60501b1961ffff909616600160401b0269ffffffffffffffffffff199095166001600160401b0390971696909617939093179390931693909317905560038401919091556004830180546001600160a01b039092166001600160a01b0319909216919091179055600590910155565b606061331083835f614b83565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa15801561496e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061499291906152c9565b90506149a96001600160a01b038616853086614c12565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa1580156149ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a1191906152c9565b9050818111614a775760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610736565b614a818282615d05565b9695505050505050565b61419c614153565b614a9b614153565b80355f80516020615da88339815191529081556014614ac06060840160408501615d31565b60ff161180614adf5750614ada6060830160408401615d31565b60ff16155b15614b1357614af46060830160408401615d31565b604051634a59bbff60e11b815260ff9091166004820152602401610736565b614b236060830160408401615d31565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614b546040830160208401614f49565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d45614153565b606081471015614ba85760405163cd78605960e01b8152306004820152602401610736565b5f80856001600160a01b03168486604051614bc3919061543a565b5f6040518083038185875af1925050503d805f8114614bfd576040519150601f19603f3d011682016040523d82523d5f602084013e614c02565b606091505b5091509150614a81868383614c4b565b6040516001600160a01b0384811660248301528381166044830152606482018390526108399186918216906323b872dd90608401613a7e565b606082614c6057614c5b82614ca7565b613310565b8151158015614c7757506001600160a01b0384163b155b15614ca057604051639996b31560e01b81526001600160a01b0385166004820152602401610736565b5080613310565b805115614cb75780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614cdc90615145565b5f825580601f10614ceb575050565b601f0160209004905f5260205f2090810190610fb79190614d44565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614d58575f8155600101614d45565b5090565b8015158114610fb7575f80fd5b803563ffffffff81168114614d7c575f80fd5b919050565b5f805f60608486031215614d93575f80fd5b833592506020840135614da581614d5c565b9150614db360408501614d69565b90509250925092565b5f60208284031215614dcc575f80fd5b5035919050565b5f8060408385031215614de4575f80fd5b82356001600160401b03811115614df9575f80fd5b830160808186031215614e0a575f80fd5b9150614e1860208401614d69565b90509250929050565b5f8060408385031215614e32575f80fd5b82359150614e1860208401614d69565b6001600160a01b0381168114610fb7575f80fd5b5f805f8060808587031215614e69575f80fd5b843593506020850135614e7b81614d5c565b9250614e8960408601614d69565b91506060850135614e9981614e42565b939692955090935050565b5f60208284031215614eb4575f80fd5b61331082614d69565b803561ffff81168114614d7c575f80fd5b6001600160401b0381168114610fb7575f80fd5b5f805f8060808587031215614ef5575f80fd5b84356001600160401b03811115614f0a575f80fd5b850160a08188031215614f1b575f80fd5b9350614f2960208601614ebd565b92506040850135614f3981614ece565b9396929550929360600135925050565b5f60208284031215614f59575f80fd5b813561331081614ece565b5f8060408385031215614f75575f80fd5b823591506020830135614f8781614e42565b809150509250929050565b5f8060408385031215614fa3575f80fd5b50508035926020909101359150565b5f80828403610180811215614fc5575f80fd5b61016080821215614fd4575f80fd5b8493508301359050614f8781614e42565b634e487b7160e01b5f52602160045260245ffd5b6006811061500957615009614fe5565b9052565b5f5b8381101561502757818101518382015260200161500f565b50505f910152565b5f815180845261504681602086016020860161500d565b601f01601f19169290920160200192915050565b6020815261506c602082018351614ff9565b5f602083015160e0604084015261508761010084018261502f565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156150eb575f80fd5b82356001600160401b0380821115615101575f80fd5b818501915085601f830112615114575f80fd5b813581811115615122575f80fd5b866020828501011115615133575f80fd5b60209290920196919550909350505050565b600181811c9082168061515957607f821691505b60208210810361517757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ec38284614ff9565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156151c1576151c161518b565b60405290565b604080519081016001600160401b03811182821017156151c1576151c161518b565b604051601f8201601f191681016001600160401b03811182821017156152115761521161518b565b604052919050565b5f6001600160401b038211156152315761523161518b565b50601f01601f191660200190565b5f82601f83011261524e575f80fd5b815161526161525c82615219565b6151e9565b818152846020838601011115615275575f80fd5b610fe782602083016020870161500d565b5f60208284031215615296575f80fd5b81516001600160401b038111156152ab575f80fd5b610fe78482850161523f565b602081525f613310602083018461502f565b5f602082840312156152d9575f80fd5b5051919050565b5f602082840312156152f0575f80fd5b813561331081614e42565b5f808335601e19843603018112615310575f80fd5b8301803591506001600160401b03821115615329575f80fd5b6020019150600581901b3603821315613501575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615368575f80fd5b9190910192915050565b5f82601f830112615381575f80fd5b813561538f61525c82615219565b8181528460208386010111156153a3575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156153cf575f80fd5b6153d761519f565b82356001600160401b03808211156153ed575f80fd5b6153f936838701615372565b8352602085013591508082111561540e575f80fd5b5061541b36828601615372565b602083015250604083013561542f81614ece565b604082015292915050565b5f825161536881846020870161500d565b601f8211156105aa57805f5260205f20601f840160051c810160208510156154705750805b601f840160051c820191505b81811015610ed5575f815560010161547c565b81516001600160401b038111156154a8576154a861518b565b6154bc816154b68454615145565b8461544b565b602080601f8311600181146154ef575f84156154d85750858301515b5f19600386901b1c1916600185901b17855561111f565b5f85815260208120601f198616915b8281101561551d578886015182559484019460019091019084016154fe565b508582101561553a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156123d9576123d961554a565b5f63ffffffff8083168181036155965761559661554a565b6001019392505050565b6001600160401b038181168382160280821691908281146155c3576155c361554a565b505092915050565b5f808335601e198436030181126155e0575f80fd5b83016020810192503590506001600160401b038111156155fe575f80fd5b803603821315613501575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b878110156156e957848303601f19018952813536889003605e19018112615670575f80fd5b8701606061567e82806155cb565b82875261568e838801828461560c565b9250505061569e868301836155cb565b868303888801526156b083828461560c565b9250505060408083013592506156c583614ece565b6001600160401b03929092169490910193909352978301979083019060010161564b565b5090979650505050505050565b6020815281356020820152602082013560408201525f604083013561571a81614e42565b6001600160a01b031660608381019190915283013536849003601e19018112615741575f80fd5b83016020810190356001600160401b0381111561575c575f80fd5b8060051b360382131561576d575f80fd5b60808085015261578160a085018284615634565b95945050505050565b5f826157a457634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157bd576157bd614fe5565b91905290565b5f805f606084860312156157d5575f80fd5b8351925060208401516157e781614ece565b60408501519092506157f881614ece565b809150509250925092565b8082028115828204841417610ec357610ec361554a565b5f806040838503121561582b575f80fd5b825191506020830151614f8781614d5c565b5f60208083525f845461584f81615145565b806020870152604060018084165f8114615870576001811461588c576158b9565b60ff19851660408a0152604084151560051b8a010195506158b9565b895f5260205f205f5b858110156158b05781548b8201860152908301908801615895565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038281168282160390808211156123d9576123d961554a565b5f8060408385031215615907575f80fd5b82516001600160401b038082111561591d575f80fd5b9084019060608287031215615930575f80fd5b61593861519f565b82518152602083015161594a81614e42565b6020820152604083015182811115615960575f80fd5b61596c8882860161523f565b6040830152508094505050506020830151614f8781614d5c565b5f8060408385031215615997575f80fd5b825191506020830151614f8781614ece565b80820180821115610ec357610ec361554a565b5f8235603e19833603018112615368575f80fd5b5f808335601e198436030181126159e5575f80fd5b8301803591506001600160401b038211156159fe575f80fd5b602001915036819003821315613501575f80fd5b602081525f610fe760208301848661560c565b5f60408236031215615a35575f80fd5b615a3d6151c7565b615a4683614d69565b81526020808401356001600160401b0380821115615a62575f80fd5b9085019036601f830112615a74575f80fd5b813581811115615a8657615a8661518b565b8060051b9150615a978483016151e9565b8181529183018401918481019036841115615ab0575f80fd5b938501935b83851015615ada5784359250615aca83614e42565b8282529385019390850190615ab5565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015615b475784516001600160a01b03168252938301936001929092019190830190615b1e565b509695505050505050565b60208152815160208201525f602083015160e06040840152615b7861010084018261502f565b90506040840151601f1980858403016060860152615b96838361502f565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152615bc68383615aec565b925060a08601519150808584030160c086015250615be48282615aec565b91505060c0840151615c0160e08501826001600160401b03169052565b509392505050565b5f8060408385031215615c1a575f80fd5b8251915060208301516001600160401b03811115615c36575f80fd5b615c428582860161523f565b9150509250929050565b6001600160401b03831115615c6357615c6361518b565b615c7783615c718354615145565b8361544b565b5f601f841160018114615ca8575f8515615c915750838201355b5f19600387901b1c1916600186901b178355610ed5565b5f83815260208120601f198716915b82811015615cd75786850135825560209485019460019092019101615cb7565b5086821015615cf3575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81810381811115610ec357610ec361554a565b5f60208284031215615d28575f80fd5b61331082614ebd565b5f60208284031215615d41575f80fd5b813560ff81168114613310575f80fd5b5f6001600160401b038083168181036155965761559661554a565b5f60208284031215615d7c575f80fd5b815161331081614d5c56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb059b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212201be65d8f9ecdd56e1463ac260a6c3019bebda51325c2ee53f00feb0121a1035d64736f6c63430008190033", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -3154,8 +3154,8 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidato // ValidatorMessagesMetaData contains all meta data concerning the ValidatorMessages contract. var ValidatorMessagesMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"InvalidBLSPublicKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"}],\"name\":\"InvalidCodecID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"actual\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"}],\"name\":\"InvalidMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageType\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"}],\"name\":\"packConversionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"valid\",\"type\":\"bool\"}],\"name\":\"packL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"packL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"validationPeriod\",\"type\":\"tuple\"}],\"name\":\"packRegisterL1ValidatorMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"conversionID\",\"type\":\"bytes32\"}],\"name\":\"packSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"packValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackRegisterL1ValidatorMessage\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x61217b610034600b8282823980515f1a607314602857634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100b1575f3560e01c8063854a893f11610079578063854a893f146101b257806387418b8e1461020f5780639b83546514610222578063a699c13514610242578063e1d68f3014610255578063eb97ce5114610268575f80fd5b8063021de88f146100b5578063088c2463146100e25780634d8478841461011257806350782b0f146101335780637f7c427a1461016b575b5f80fd5b6100c86100c33660046118a9565b610289565b604080519283529015156020830152015b60405180910390f35b6100f56100f03660046118a9565b61044a565b604080519283526001600160401b039091166020830152016100d9565b6101256101203660046118a9565b61063b565b6040519081526020016100d9565b6101466101413660046118a9565b6107c8565b604080519384526001600160401b0392831660208501529116908201526060016100d9565b6101a56101793660046118e2565b604080515f60208201819052602282015260268082019390935281518082039093018352604601905290565b6040516100d99190611946565b6101a56101c036600461197a565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6101a561021d3660046119eb565b610a1e565b6102356102303660046118a9565b610b60565b6040516100d99190611bb4565b6101a5610250366004611c6b565b6114ab565b6101a5610263366004611c9d565b6114ef565b61027b610276366004611d80565b611525565b6040516100d9929190611e7c565b5f8082516027146102c457825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044015b60405180910390fd5b5f805b6002811015610313576102db816001611ea8565b6102e6906008611ebb565b61ffff168582815181106102fc576102fc611ed2565b016020015160f81c901b91909117906001016102c7565b5061ffff81161561033d5760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561039857610354816003611ea8565b61035f906008611ebb565b63ffffffff1686610371836002611ee6565b8151811061038157610381611ed2565b016020015160f81c901b9190911790600101610340565b5063ffffffff81166002146103c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015610415576103d781601f611ea8565b6103e2906008611ebb565b876103ee836006611ee6565b815181106103fe576103fe611ed2565b016020015160f81c901b91909117906001016103c3565b505f8660268151811061042a5761042a611ed2565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461048057825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016102bb565b5f805b60028110156104cf57610497816001611ea8565b6104a2906008611ebb565b61ffff168582815181106104b8576104b8611ed2565b016020015160f81c901b9190911790600101610483565b5061ffff8116156104f95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561055457610510816003611ea8565b61051b906008611ebb565b63ffffffff168661052d836002611ee6565b8151811061053d5761053d611ed2565b016020015160f81c901b91909117906001016104fc565b5063ffffffff81161561057a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156105cf5761059181601f611ea8565b61059c906008611ebb565b876105a8836006611ee6565b815181106105b8576105b8611ed2565b016020015160f81c901b919091179060010161057d565b505f805b600881101561062e576105e7816007611ea8565b6105f2906008611ebb565b6001600160401b031688610607836026611ee6565b8151811061061757610617611ed2565b016020015160f81c901b91909117906001016105d3565b5090969095509350505050565b5f815160261461067057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016102bb565b5f805b60028110156106bf57610687816001611ea8565b610692906008611ebb565b61ffff168482815181106106a8576106a8611ed2565b016020015160f81c901b9190911790600101610673565b5061ffff8116156106e95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561074457610700816003611ea8565b61070b906008611ebb565b63ffffffff168561071d836002611ee6565b8151811061072d5761072d611ed2565b016020015160f81c901b91909117906001016106ec565b5063ffffffff81161561076a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156107bf5761078181601f611ea8565b61078c906008611ebb565b86610798836006611ee6565b815181106107a8576107a8611ed2565b016020015160f81c901b919091179060010161076d565b50949350505050565b5f805f83516036146107ff57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016102bb565b5f805b600281101561084e57610816816001611ea8565b610821906008611ebb565b61ffff1686828151811061083757610837611ed2565b016020015160f81c901b9190911790600101610802565b5061ffff8116156108785760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b60048110156108d35761088f816003611ea8565b61089a906008611ebb565b63ffffffff16876108ac836002611ee6565b815181106108bc576108bc611ed2565b016020015160f81c901b919091179060010161087b565b5063ffffffff81166003146108fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156109505761091281601f611ea8565b61091d906008611ebb565b88610929836006611ee6565b8151811061093957610939611ed2565b016020015160f81c901b91909117906001016108fe565b505f805b60088110156109af57610968816007611ea8565b610973906008611ebb565b6001600160401b031689610988836026611ee6565b8151811061099857610998611ed2565b016020015160f81c901b9190911790600101610954565b505f805b6008811015610a0e576109c7816007611ea8565b6109d2906008611ebb565b6001600160401b03168a6109e783602e611ee6565b815181106109f7576109f7611ed2565b016020015160f81c901b91909117906001016109b3565b5091989097509095509350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b836060015151811015610b59578184606001518281518110610aba57610aba611ed2565b60200260200101515f01515185606001518381518110610adc57610adc611ed2565b60200260200101515f015186606001518481518110610afd57610afd611ed2565b60200260200101516020015187606001518581518110610b1f57610b1f611ed2565b602002602001015160400151604051602001610b3f959493929190611ef9565b60408051601f198184030181529190529150600101610a96565b5092915050565b610b68611712565b5f610b71611712565b5f805b6002811015610bcf57610b88816001611ea8565b610b93906008611ebb565b61ffff1686610ba863ffffffff871684611ee6565b81518110610bb857610bb8611ed2565b016020015160f81c901b9190911790600101610b74565b5061ffff811615610bf95760405163407b587360e01b815261ffff821660048201526024016102bb565b610c04600284611f72565b9250505f805b6004811015610c6957610c1e816003611ea8565b610c29906008611ebb565b63ffffffff16868563ffffffff1683610c429190611ee6565b81518110610c5257610c52611ed2565b016020015160f81c901b9190911790600101610c0a565b5063ffffffff8116600114610c9157604051635b60892f60e01b815260040160405180910390fd5b610c9c600484611f72565b9250505f805b6020811015610cf957610cb681601f611ea8565b610cc1906008611ebb565b86610cd263ffffffff871684611ee6565b81518110610ce257610ce2611ed2565b016020015160f81c901b9190911790600101610ca2565b50808252610d08602084611f72565b9250505f805b6004811015610d6d57610d22816003611ea8565b610d2d906008611ebb565b63ffffffff16868563ffffffff1683610d469190611ee6565b81518110610d5657610d56611ed2565b016020015160f81c901b9190911790600101610d0e565b50610d79600484611f72565b92505f8163ffffffff166001600160401b03811115610d9a57610d9a61176c565b6040519080825280601f01601f191660200182016040528015610dc4576020820181803683370190505b5090505f5b8263ffffffff16811015610e335786610de863ffffffff871683611ee6565b81518110610df857610df8611ed2565b602001015160f81c60f81b828281518110610e1557610e15611ed2565b60200101906001600160f81b03191690815f1a905350600101610dc9565b5060208301819052610e458285611f72565b604080516030808252606082019092529195505f92506020820181803683370190505090505f5b6030811015610ed15786610e8663ffffffff871683611ee6565b81518110610e9657610e96611ed2565b602001015160f81c60f81b828281518110610eb357610eb3611ed2565b60200101906001600160f81b03191690815f1a905350600101610e6c565b5060408301819052610ee4603085611f72565b9350505f805b6008811015610f4a57610efe816007611ea8565b610f09906008611ebb565b6001600160401b031687610f2363ffffffff881684611ee6565b81518110610f3357610f33611ed2565b016020015160f81c901b9190911790600101610eea565b506001600160401b0381166060840152610f65600885611f72565b9350505f805f5b6004811015610fcb57610f80816003611ea8565b610f8b906008611ebb565b63ffffffff16888763ffffffff1683610fa49190611ee6565b81518110610fb457610fb4611ed2565b016020015160f81c901b9190911790600101610f6c565b50610fd7600486611f72565b94505f5b600481101561103a57610fef816003611ea8565b610ffa906008611ebb565b63ffffffff16888763ffffffff16836110139190611ee6565b8151811061102357611023611ed2565b016020015160f81c901b9290921791600101610fdb565b50611046600486611f72565b94505f8263ffffffff166001600160401b038111156110675761106761176c565b604051908082528060200260200182016040528015611090578160200160208202803683370190505b5090505f5b8363ffffffff16811015611178576040805160148082528183019092525f916020820181803683370190505090505f5b601481101561112a578a6110df63ffffffff8b1683611ee6565b815181106110ef576110ef611ed2565b602001015160f81c60f81b82828151811061110c5761110c611ed2565b60200101906001600160f81b03191690815f1a9053506001016110c5565b505f601482015190508084848151811061114657611146611ed2565b6001600160a01b039092166020928302919091019091015261116960148a611f72565b98505050806001019050611095565b506040805180820190915263ffffffff9092168252602082015260808401525f80805b60048110156111fa576111af816003611ea8565b6111ba906008611ebb565b63ffffffff16898863ffffffff16836111d39190611ee6565b815181106111e3576111e3611ed2565b016020015160f81c901b919091179060010161119b565b50611206600487611f72565b95505f5b60048110156112695761121e816003611ea8565b611229906008611ebb565b63ffffffff16898863ffffffff16836112429190611ee6565b8151811061125257611252611ed2565b016020015160f81c901b929092179160010161120a565b50611275600487611f72565b95505f8263ffffffff166001600160401b038111156112965761129661176c565b6040519080825280602002602001820160405280156112bf578160200160208202803683370190505b5090505f5b8363ffffffff168110156113a7576040805160148082528183019092525f916020820181803683370190505090505f5b6014811015611359578b61130e63ffffffff8c1683611ee6565b8151811061131e5761131e611ed2565b602001015160f81c60f81b82828151811061133b5761133b611ed2565b60200101906001600160f81b03191690815f1a9053506001016112f4565b505f601482015190508084848151811061137557611375611ed2565b6001600160a01b039092166020928302919091019091015261139860148b611f72565b995050508060010190506112c4565b506040805180820190915263ffffffff9092168252602082015260a08501525f6113d18284611f72565b6113dc906014611f8f565b6113e785607a611f72565b6113f19190611f72565b90508063ffffffff1688511461142d57875160405163cc92daa160e01b815263ffffffff918216600482015290821660248201526044016102bb565b5f805b600881101561149057611444816007611ea8565b61144f906008611ebb565b6001600160401b03168a61146963ffffffff8b1684611ee6565b8151811061147957611479611ed2565b016020015160f81c901b9190911790600101611430565b506001600160401b031660c086015250929695505050505050565b6040515f6020820152600160e11b60228201526026810183905281151560f81b60468201526060906047015b60405160208183030381529060405290505b92915050565b6040515f602082018190526022820152602681018390526001600160c01b031960c083901b166046820152606090604e016114d7565b5f606082604001515160301461154e5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861158f988a986001989297929690959094909390929101611fb7565b60405160208183030381529060405290505f5b84608001516020015151811015611601578185608001516020015182815181106115ce576115ce611ed2565b60200260200101516040516020016115e7929190612071565b60408051601f1981840301815291905291506001016115a2565b5060a08401518051602091820151516040516116219385939291016120a7565b60405160208183030381529060405290505f5b8460a00151602001515181101561169357818560a0015160200151828151811061166057611660611ed2565b6020026020010151604051602001611679929190612071565b60408051601f198184030181529190529150600101611634565b5060c08401516040516116aa9183916020016120e2565b60405160208183030381529060405290506002816040516116cb9190612113565b602060405180830381855afa1580156116e6573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611709919061212e565b94909350915050565b6040805160e0810182525f808252606060208084018290528385018290528184018390528451808601865283815280820183905260808501528451808601909552918452908301529060a082019081525f60209091015290565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156117a2576117a261176c565b60405290565b604051606081016001600160401b03811182821017156117a2576117a261176c565b604080519081016001600160401b03811182821017156117a2576117a261176c565b60405160e081016001600160401b03811182821017156117a2576117a261176c565b604051601f8201601f191681016001600160401b03811182821017156118365761183661176c565b604052919050565b5f82601f83011261184d575f80fd5b81356001600160401b038111156118665761186661176c565b611879601f8201601f191660200161180e565b81815284602083860101111561188d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156118b9575f80fd5b81356001600160401b038111156118ce575f80fd5b6118da8482850161183e565b949350505050565b5f602082840312156118f2575f80fd5b5035919050565b5f5b838110156119135781810151838201526020016118fb565b50505f910152565b5f81518084526119328160208601602086016118f9565b601f01601f19169290920160200192915050565b602081525f611958602083018461191b565b9392505050565b80356001600160401b0381168114611975575f80fd5b919050565b5f805f6060848603121561198c575f80fd5b8335925061199c6020850161195f565b91506119aa6040850161195f565b90509250925092565b80356001600160a01b0381168114611975575f80fd5b5f6001600160401b038211156119e1576119e161176c565b5060051b60200190565b5f60208083850312156119fc575f80fd5b82356001600160401b0380821115611a12575f80fd5b9084019060808287031215611a25575f80fd5b611a2d611780565b823581528383013584820152611a45604084016119b3565b604082015260608084013583811115611a5c575f80fd5b80850194505087601f850112611a70575f80fd5b8335611a83611a7e826119c9565b61180e565b81815260059190911b8501860190868101908a831115611aa1575f80fd5b8787015b83811015611b3a57803587811115611abb575f80fd5b8801808d03601f1901861315611acf575f80fd5b611ad76117a8565b8a82013589811115611ae7575f80fd5b611af58f8d8386010161183e565b825250604082013589811115611b09575f80fd5b611b178f8d8386010161183e565b8c83015250611b2787830161195f565b6040820152845250918801918801611aa5565b506060850152509198975050505050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015611ba95784516001600160a01b03168252938301936001929092019190830190611b80565b509695505050505050565b60208152815160208201525f602083015160e06040840152611bda61010084018261191b565b90506040840151601f1980858403016060860152611bf8838361191b565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152611c288383611b4e565b925060a08601519150808584030160c086015250611c468282611b4e565b91505060c0840151611c6360e08501826001600160401b03169052565b509392505050565b5f8060408385031215611c7c575f80fd5b8235915060208301358015158114611c92575f80fd5b809150509250929050565b5f8060408385031215611cae575f80fd5b82359150611cbe6020840161195f565b90509250929050565b5f60408284031215611cd7575f80fd5b611cdf6117ca565b9050813563ffffffff81168114611cf4575f80fd5b81526020828101356001600160401b03811115611d0f575f80fd5b8301601f81018513611d1f575f80fd5b8035611d2d611a7e826119c9565b81815260059190911b82018301908381019087831115611d4b575f80fd5b928401925b82841015611d7057611d61846119b3565b82529284019290840190611d50565b8085870152505050505092915050565b5f60208284031215611d90575f80fd5b81356001600160401b0380821115611da6575f80fd5b9083019060e08286031215611db9575f80fd5b611dc16117ec565b82358152602083013582811115611dd6575f80fd5b611de28782860161183e565b602083015250604083013582811115611df9575f80fd5b611e058782860161183e565b604083015250611e176060840161195f565b6060820152608083013582811115611e2d575f80fd5b611e3987828601611cc7565b60808301525060a083013582811115611e50575f80fd5b611e5c87828601611cc7565b60a083015250611e6e60c0840161195f565b60c082015295945050505050565b828152604060208201525f6118da604083018461191b565b634e487b7160e01b5f52601160045260245ffd5b818103818111156114e9576114e9611e94565b80820281158282048414176114e9576114e9611e94565b634e487b7160e01b5f52603260045260245ffd5b808201808211156114e9576114e9611e94565b5f8651611f0a818460208b016118f9565b60e087901b6001600160e01b0319169083019081528551611f32816004840160208a016118f9565b8551910190611f488160048401602089016118f9565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b63ffffffff818116838216019080821115610b5957610b59611e94565b63ffffffff818116838216028082169190828114611faf57611faf611e94565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651611ffd81602a850160208b016118f9565b86519083019061201481602a840160208b016118f9565b60c087901b6001600160c01b031916602a9290910191820152612046603282018660e01b6001600160e01b0319169052565b61205f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516120828184602088016118f9565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516120b88184602089016118f9565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516120f38184602088016118f9565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f82516121248184602087016118f9565b9190910192915050565b5f6020828403121561213e575f80fd5b505191905056fea26469706673582212203eff6412f7c7baf5a74defc914c1b4770aa5110fc94bc4e80bc185b10586511764736f6c63430008190033", + ABI: "[{\"inputs\":[],\"name\":\"InvalidBLSPublicKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"}],\"name\":\"InvalidCodecID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"actual\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"}],\"name\":\"InvalidMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageType\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"}],\"name\":\"packConversionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"valid\",\"type\":\"bool\"}],\"name\":\"packL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"packL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"validationPeriod\",\"type\":\"tuple\"}],\"name\":\"packRegisterL1ValidatorMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"conversionID\",\"type\":\"bytes32\"}],\"name\":\"packSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"packValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackRegisterL1ValidatorMessage\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x61217b610034600b8282823980515f1a607314602857634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100b1575f3560e01c8063854a893f11610079578063854a893f146101b257806387418b8e1461020f5780639b83546514610222578063a699c13514610242578063e1d68f3014610255578063eb97ce5114610268575f80fd5b8063021de88f146100b5578063088c2463146100e25780634d8478841461011257806350782b0f146101335780637f7c427a1461016b575b5f80fd5b6100c86100c33660046118a9565b610289565b604080519283529015156020830152015b60405180910390f35b6100f56100f03660046118a9565b61044a565b604080519283526001600160401b039091166020830152016100d9565b6101256101203660046118a9565b61063b565b6040519081526020016100d9565b6101466101413660046118a9565b6107c8565b604080519384526001600160401b0392831660208501529116908201526060016100d9565b6101a56101793660046118e2565b604080515f60208201819052602282015260268082019390935281518082039093018352604601905290565b6040516100d99190611946565b6101a56101c036600461197a565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6101a561021d3660046119eb565b610a1e565b6102356102303660046118a9565b610b60565b6040516100d99190611bb4565b6101a5610250366004611c6b565b6114ab565b6101a5610263366004611c9d565b6114ef565b61027b610276366004611d80565b611525565b6040516100d9929190611e7c565b5f8082516027146102c457825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044015b60405180910390fd5b5f805b6002811015610313576102db816001611ea8565b6102e6906008611ebb565b61ffff168582815181106102fc576102fc611ed2565b016020015160f81c901b91909117906001016102c7565b5061ffff81161561033d5760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561039857610354816003611ea8565b61035f906008611ebb565b63ffffffff1686610371836002611ee6565b8151811061038157610381611ed2565b016020015160f81c901b9190911790600101610340565b5063ffffffff81166002146103c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015610415576103d781601f611ea8565b6103e2906008611ebb565b876103ee836006611ee6565b815181106103fe576103fe611ed2565b016020015160f81c901b91909117906001016103c3565b505f8660268151811061042a5761042a611ed2565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461048057825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016102bb565b5f805b60028110156104cf57610497816001611ea8565b6104a2906008611ebb565b61ffff168582815181106104b8576104b8611ed2565b016020015160f81c901b9190911790600101610483565b5061ffff8116156104f95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561055457610510816003611ea8565b61051b906008611ebb565b63ffffffff168661052d836002611ee6565b8151811061053d5761053d611ed2565b016020015160f81c901b91909117906001016104fc565b5063ffffffff81161561057a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156105cf5761059181601f611ea8565b61059c906008611ebb565b876105a8836006611ee6565b815181106105b8576105b8611ed2565b016020015160f81c901b919091179060010161057d565b505f805b600881101561062e576105e7816007611ea8565b6105f2906008611ebb565b6001600160401b031688610607836026611ee6565b8151811061061757610617611ed2565b016020015160f81c901b91909117906001016105d3565b5090969095509350505050565b5f815160261461067057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016102bb565b5f805b60028110156106bf57610687816001611ea8565b610692906008611ebb565b61ffff168482815181106106a8576106a8611ed2565b016020015160f81c901b9190911790600101610673565b5061ffff8116156106e95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561074457610700816003611ea8565b61070b906008611ebb565b63ffffffff168561071d836002611ee6565b8151811061072d5761072d611ed2565b016020015160f81c901b91909117906001016106ec565b5063ffffffff81161561076a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156107bf5761078181601f611ea8565b61078c906008611ebb565b86610798836006611ee6565b815181106107a8576107a8611ed2565b016020015160f81c901b919091179060010161076d565b50949350505050565b5f805f83516036146107ff57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016102bb565b5f805b600281101561084e57610816816001611ea8565b610821906008611ebb565b61ffff1686828151811061083757610837611ed2565b016020015160f81c901b9190911790600101610802565b5061ffff8116156108785760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b60048110156108d35761088f816003611ea8565b61089a906008611ebb565b63ffffffff16876108ac836002611ee6565b815181106108bc576108bc611ed2565b016020015160f81c901b919091179060010161087b565b5063ffffffff81166003146108fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156109505761091281601f611ea8565b61091d906008611ebb565b88610929836006611ee6565b8151811061093957610939611ed2565b016020015160f81c901b91909117906001016108fe565b505f805b60088110156109af57610968816007611ea8565b610973906008611ebb565b6001600160401b031689610988836026611ee6565b8151811061099857610998611ed2565b016020015160f81c901b9190911790600101610954565b505f805b6008811015610a0e576109c7816007611ea8565b6109d2906008611ebb565b6001600160401b03168a6109e783602e611ee6565b815181106109f7576109f7611ed2565b016020015160f81c901b91909117906001016109b3565b5091989097509095509350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b836060015151811015610b59578184606001518281518110610aba57610aba611ed2565b60200260200101515f01515185606001518381518110610adc57610adc611ed2565b60200260200101515f015186606001518481518110610afd57610afd611ed2565b60200260200101516020015187606001518581518110610b1f57610b1f611ed2565b602002602001015160400151604051602001610b3f959493929190611ef9565b60408051601f198184030181529190529150600101610a96565b5092915050565b610b68611712565b5f610b71611712565b5f805b6002811015610bcf57610b88816001611ea8565b610b93906008611ebb565b61ffff1686610ba863ffffffff871684611ee6565b81518110610bb857610bb8611ed2565b016020015160f81c901b9190911790600101610b74565b5061ffff811615610bf95760405163407b587360e01b815261ffff821660048201526024016102bb565b610c04600284611f72565b9250505f805b6004811015610c6957610c1e816003611ea8565b610c29906008611ebb565b63ffffffff16868563ffffffff1683610c429190611ee6565b81518110610c5257610c52611ed2565b016020015160f81c901b9190911790600101610c0a565b5063ffffffff8116600114610c9157604051635b60892f60e01b815260040160405180910390fd5b610c9c600484611f72565b9250505f805b6020811015610cf957610cb681601f611ea8565b610cc1906008611ebb565b86610cd263ffffffff871684611ee6565b81518110610ce257610ce2611ed2565b016020015160f81c901b9190911790600101610ca2565b50808252610d08602084611f72565b9250505f805b6004811015610d6d57610d22816003611ea8565b610d2d906008611ebb565b63ffffffff16868563ffffffff1683610d469190611ee6565b81518110610d5657610d56611ed2565b016020015160f81c901b9190911790600101610d0e565b50610d79600484611f72565b92505f8163ffffffff166001600160401b03811115610d9a57610d9a61176c565b6040519080825280601f01601f191660200182016040528015610dc4576020820181803683370190505b5090505f5b8263ffffffff16811015610e335786610de863ffffffff871683611ee6565b81518110610df857610df8611ed2565b602001015160f81c60f81b828281518110610e1557610e15611ed2565b60200101906001600160f81b03191690815f1a905350600101610dc9565b5060208301819052610e458285611f72565b604080516030808252606082019092529195505f92506020820181803683370190505090505f5b6030811015610ed15786610e8663ffffffff871683611ee6565b81518110610e9657610e96611ed2565b602001015160f81c60f81b828281518110610eb357610eb3611ed2565b60200101906001600160f81b03191690815f1a905350600101610e6c565b5060408301819052610ee4603085611f72565b9350505f805b6008811015610f4a57610efe816007611ea8565b610f09906008611ebb565b6001600160401b031687610f2363ffffffff881684611ee6565b81518110610f3357610f33611ed2565b016020015160f81c901b9190911790600101610eea565b506001600160401b0381166060840152610f65600885611f72565b9350505f805f5b6004811015610fcb57610f80816003611ea8565b610f8b906008611ebb565b63ffffffff16888763ffffffff1683610fa49190611ee6565b81518110610fb457610fb4611ed2565b016020015160f81c901b9190911790600101610f6c565b50610fd7600486611f72565b94505f5b600481101561103a57610fef816003611ea8565b610ffa906008611ebb565b63ffffffff16888763ffffffff16836110139190611ee6565b8151811061102357611023611ed2565b016020015160f81c901b9290921791600101610fdb565b50611046600486611f72565b94505f8263ffffffff166001600160401b038111156110675761106761176c565b604051908082528060200260200182016040528015611090578160200160208202803683370190505b5090505f5b8363ffffffff16811015611178576040805160148082528183019092525f916020820181803683370190505090505f5b601481101561112a578a6110df63ffffffff8b1683611ee6565b815181106110ef576110ef611ed2565b602001015160f81c60f81b82828151811061110c5761110c611ed2565b60200101906001600160f81b03191690815f1a9053506001016110c5565b505f601482015190508084848151811061114657611146611ed2565b6001600160a01b039092166020928302919091019091015261116960148a611f72565b98505050806001019050611095565b506040805180820190915263ffffffff9092168252602082015260808401525f80805b60048110156111fa576111af816003611ea8565b6111ba906008611ebb565b63ffffffff16898863ffffffff16836111d39190611ee6565b815181106111e3576111e3611ed2565b016020015160f81c901b919091179060010161119b565b50611206600487611f72565b95505f5b60048110156112695761121e816003611ea8565b611229906008611ebb565b63ffffffff16898863ffffffff16836112429190611ee6565b8151811061125257611252611ed2565b016020015160f81c901b929092179160010161120a565b50611275600487611f72565b95505f8263ffffffff166001600160401b038111156112965761129661176c565b6040519080825280602002602001820160405280156112bf578160200160208202803683370190505b5090505f5b8363ffffffff168110156113a7576040805160148082528183019092525f916020820181803683370190505090505f5b6014811015611359578b61130e63ffffffff8c1683611ee6565b8151811061131e5761131e611ed2565b602001015160f81c60f81b82828151811061133b5761133b611ed2565b60200101906001600160f81b03191690815f1a9053506001016112f4565b505f601482015190508084848151811061137557611375611ed2565b6001600160a01b039092166020928302919091019091015261139860148b611f72565b995050508060010190506112c4565b506040805180820190915263ffffffff9092168252602082015260a08501525f6113d18284611f72565b6113dc906014611f8f565b6113e785607a611f72565b6113f19190611f72565b90508063ffffffff1688511461142d57875160405163cc92daa160e01b815263ffffffff918216600482015290821660248201526044016102bb565b5f805b600881101561149057611444816007611ea8565b61144f906008611ebb565b6001600160401b03168a61146963ffffffff8b1684611ee6565b8151811061147957611479611ed2565b016020015160f81c901b9190911790600101611430565b506001600160401b031660c086015250929695505050505050565b6040515f6020820152600160e11b60228201526026810183905281151560f81b60468201526060906047015b60405160208183030381529060405290505b92915050565b6040515f602082018190526022820152602681018390526001600160c01b031960c083901b166046820152606090604e016114d7565b5f606082604001515160301461154e5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861158f988a986001989297929690959094909390929101611fb7565b60405160208183030381529060405290505f5b84608001516020015151811015611601578185608001516020015182815181106115ce576115ce611ed2565b60200260200101516040516020016115e7929190612071565b60408051601f1981840301815291905291506001016115a2565b5060a08401518051602091820151516040516116219385939291016120a7565b60405160208183030381529060405290505f5b8460a00151602001515181101561169357818560a0015160200151828151811061166057611660611ed2565b6020026020010151604051602001611679929190612071565b60408051601f198184030181529190529150600101611634565b5060c08401516040516116aa9183916020016120e2565b60405160208183030381529060405290506002816040516116cb9190612113565b602060405180830381855afa1580156116e6573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611709919061212e565b94909350915050565b6040805160e0810182525f808252606060208084018290528385018290528184018390528451808601865283815280820183905260808501528451808601909552918452908301529060a082019081525f60209091015290565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156117a2576117a261176c565b60405290565b604051606081016001600160401b03811182821017156117a2576117a261176c565b604080519081016001600160401b03811182821017156117a2576117a261176c565b60405160e081016001600160401b03811182821017156117a2576117a261176c565b604051601f8201601f191681016001600160401b03811182821017156118365761183661176c565b604052919050565b5f82601f83011261184d575f80fd5b81356001600160401b038111156118665761186661176c565b611879601f8201601f191660200161180e565b81815284602083860101111561188d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156118b9575f80fd5b81356001600160401b038111156118ce575f80fd5b6118da8482850161183e565b949350505050565b5f602082840312156118f2575f80fd5b5035919050565b5f5b838110156119135781810151838201526020016118fb565b50505f910152565b5f81518084526119328160208601602086016118f9565b601f01601f19169290920160200192915050565b602081525f611958602083018461191b565b9392505050565b80356001600160401b0381168114611975575f80fd5b919050565b5f805f6060848603121561198c575f80fd5b8335925061199c6020850161195f565b91506119aa6040850161195f565b90509250925092565b80356001600160a01b0381168114611975575f80fd5b5f6001600160401b038211156119e1576119e161176c565b5060051b60200190565b5f60208083850312156119fc575f80fd5b82356001600160401b0380821115611a12575f80fd5b9084019060808287031215611a25575f80fd5b611a2d611780565b823581528383013584820152611a45604084016119b3565b604082015260608084013583811115611a5c575f80fd5b80850194505087601f850112611a70575f80fd5b8335611a83611a7e826119c9565b61180e565b81815260059190911b8501860190868101908a831115611aa1575f80fd5b8787015b83811015611b3a57803587811115611abb575f80fd5b8801808d03601f1901861315611acf575f80fd5b611ad76117a8565b8a82013589811115611ae7575f80fd5b611af58f8d8386010161183e565b825250604082013589811115611b09575f80fd5b611b178f8d8386010161183e565b8c83015250611b2787830161195f565b6040820152845250918801918801611aa5565b506060850152509198975050505050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015611ba95784516001600160a01b03168252938301936001929092019190830190611b80565b509695505050505050565b60208152815160208201525f602083015160e06040840152611bda61010084018261191b565b90506040840151601f1980858403016060860152611bf8838361191b565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152611c288383611b4e565b925060a08601519150808584030160c086015250611c468282611b4e565b91505060c0840151611c6360e08501826001600160401b03169052565b509392505050565b5f8060408385031215611c7c575f80fd5b8235915060208301358015158114611c92575f80fd5b809150509250929050565b5f8060408385031215611cae575f80fd5b82359150611cbe6020840161195f565b90509250929050565b5f60408284031215611cd7575f80fd5b611cdf6117ca565b9050813563ffffffff81168114611cf4575f80fd5b81526020828101356001600160401b03811115611d0f575f80fd5b8301601f81018513611d1f575f80fd5b8035611d2d611a7e826119c9565b81815260059190911b82018301908381019087831115611d4b575f80fd5b928401925b82841015611d7057611d61846119b3565b82529284019290840190611d50565b8085870152505050505092915050565b5f60208284031215611d90575f80fd5b81356001600160401b0380821115611da6575f80fd5b9083019060e08286031215611db9575f80fd5b611dc16117ec565b82358152602083013582811115611dd6575f80fd5b611de28782860161183e565b602083015250604083013582811115611df9575f80fd5b611e058782860161183e565b604083015250611e176060840161195f565b6060820152608083013582811115611e2d575f80fd5b611e3987828601611cc7565b60808301525060a083013582811115611e50575f80fd5b611e5c87828601611cc7565b60a083015250611e6e60c0840161195f565b60c082015295945050505050565b828152604060208201525f6118da604083018461191b565b634e487b7160e01b5f52601160045260245ffd5b818103818111156114e9576114e9611e94565b80820281158282048414176114e9576114e9611e94565b634e487b7160e01b5f52603260045260245ffd5b808201808211156114e9576114e9611e94565b5f8651611f0a818460208b016118f9565b60e087901b6001600160e01b0319169083019081528551611f32816004840160208a016118f9565b8551910190611f488160048401602089016118f9565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b63ffffffff818116838216019080821115610b5957610b59611e94565b63ffffffff818116838216028082169190828114611faf57611faf611e94565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651611ffd81602a850160208b016118f9565b86519083019061201481602a840160208b016118f9565b60c087901b6001600160c01b031916602a9290910191820152612046603282018660e01b6001600160e01b0319169052565b61205f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516120828184602088016118f9565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516120b88184602089016118f9565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516120f38184602088016118f9565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f82516121248184602087016118f9565b9190910192915050565b5f6020828403121561213e575f80fd5b505191905056fea264697066735822122021bc83cb762d019261a415f663497547f82a60b24f9f9026058db0ae0972d18e64736f6c63430008190033", } // ValidatorMessagesABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index c5fc32eaa..dcea5e99f 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -31,7 +31,7 @@ var ( // ConversionData is an auto generated low-level Go binding around an user-defined struct. type ConversionData struct { - SubnetID [32]byte + L1ID [32]byte ValidatorManagerBlockchainID [32]byte ValidatorManagerAddress common.Address InitialValidators []InitialValidator @@ -76,14 +76,14 @@ type Validator struct { // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { - SubnetID [32]byte + L1ID [32]byte ChurnPeriodSeconds uint64 MaximumChurnPercentage uint8 } // ValidatorMessagesValidationPeriod is an auto generated low-level Go binding around an user-defined struct. type ValidatorMessagesValidationPeriod struct { - SubnetID [32]byte + L1ID [32]byte NodeID []byte BlsPublicKey []byte RegistrationExpiry uint64 @@ -103,8 +103,8 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidBLSKeyLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encodedConversionID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedConversionID\",\"type\":\"bytes32\"}],\"name\":\"InvalidConversionID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"}],\"name\":\"InvalidDelegationFee\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidDelegationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumDelegatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidDelegatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"name\":\"InvalidMaximumChurnPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"InvalidMinStakeDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"InvalidNodeID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"InvalidRegistrationExpiry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"InvalidRewardRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"}],\"name\":\"InvalidStakeMultiplier\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InvalidTotalWeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidUptimeBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"}],\"name\":\"InvalidValidatorManagerAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidatorManagerBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"name\":\"MaxChurnRateExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newValidatorWeight\",\"type\":\"uint64\"}],\"name\":\"MaxWeightExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"MinStakeDurationNotPassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"NodeAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PChainOwnerAddressesNotSorted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorNotPoS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroWeightToValueFactor\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"DelegationEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"DelegatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BIPS_CONVERSION_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_MINTER\",\"outputs\":[{\"internalType\":\"contractINativeMinter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"startingWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endedAt\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"baseSettings\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"minimumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"minimumStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"weightToValueFactor\",\"type\":\"uint256\"},{\"internalType\":\"contractIRewardCalculator\",\"name\":\"rewardCalculator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"internalType\":\"structPoSValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"initializeDelegatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"}],\"internalType\":\"structValidatorRegistrationInput\",\"name\":\"registrationInput\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"initializeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"registeredValidators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"valueToWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"weightToValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615cc5380380615cc583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615b788061014d5f395ff3fe608060405260043610610233575f3560e01c80637d8d2f7711610129578063b771b3bc116100a8578063c974d1b61161006d578063c974d1b614610690578063d5f20ff6146106a4578063df93d8de146106d0578063fb8b11dd146106e6578063fd7ac5e714610705575f80fd5b8063b771b3bc14610605578063ba3a4b971461061f578063bc5fbfec1461063e578063bee0a03f1461065e578063c599e24f1461067d575f80fd5b80639ae06447116100ee5780639ae0644714610581578063a3a65e48146105a0578063a9778a7a14610387578063af2f5feb146105bf578063afb98096146105d2575f80fd5b80637d8d2f77146104f157806380dd672f146105105780638280a25a1461052f5780638ef34c981461054357806393e2459814610562575f80fd5b806337b9be8f116101b557806360ad77841161017a57806360ad778414610454578063620658561461047357806366435abf146104a0578063732214f8146104bf57806376f78621146104d2575f80fd5b806337b9be8f146103af5780633a1cfff6146103ce578063467ef06f146103ed5780635dd6a6cb1461040c57806360305d621461042b575f80fd5b806320d91b7a116101fb57806320d91b7a146102e057806325e1c776146102ff5780632e2194d81461031e578063329c3e121461035557806335455ded14610387575f80fd5b80630118acc4146102375780630322ed98146102585780630ba512d114610277578063151d30d1146102965780631ec44724146102c1575b5f80fd5b348015610242575f80fd5b50610256610251366004614b4a565b610724565b005b348015610263575f80fd5b50610256610272366004614b85565b610735565b348015610282575f80fd5b50610256610291366004614b9c565b6109c5565b3480156102a1575f80fd5b506102aa600a81565b60405160ff90911681526020015b60405180910390f35b3480156102cc575f80fd5b506102566102db366004614b4a565b610aa2565b3480156102eb575f80fd5b506102566102fa366004614bb3565b610aae565b34801561030a575f80fd5b50610256610319366004614c01565b611064565b348015610329575f80fd5b5061033d610338366004614b85565b6110d8565b6040516001600160401b0390911681526020016102b8565b348015610360575f80fd5b5061036f6001600160991b0181565b6040516001600160a01b0390911681526020016102b8565b348015610392575f80fd5b5061039c61271081565b60405161ffff90911681526020016102b8565b3480156103ba575f80fd5b506102566103c9366004614c36565b61112c565b3480156103d9575f80fd5b506102566103e8366004614b4a565b61113f565b3480156103f8575f80fd5b50610256610407366004614c84565b61114b565b348015610417575f80fd5b50610256610426366004614c36565b61121d565b348015610436575f80fd5b5061043f601481565b60405163ffffffff90911681526020016102b8565b34801561045f575f80fd5b5061025661046e366004614c01565b611229565b34801561047e575f80fd5b5061049261048d366004614cb1565b6114f1565b6040519081526020016102b8565b3480156104ab575f80fd5b5061033d6104ba366004614b85565b611511565b3480156104ca575f80fd5b506104925f81565b3480156104dd575f80fd5b506102566104ec366004614b4a565b611525565b3480156104fc575f80fd5b5061025661050b366004614c36565b611531565b34801561051b575f80fd5b5061025661052a366004614c01565b61153d565b34801561053a575f80fd5b506102aa603081565b34801561054e575f80fd5b5061025661055d366004614ccc565b611777565b34801561056d575f80fd5b5061025661057c366004614b85565b611828565b34801561058c575f80fd5b5061025661059b366004614c36565b6118bc565b3480156105ab575f80fd5b506102566105ba366004614c84565b6118c8565b6104926105cd366004614d0b565b611abe565b3480156105dd575f80fd5b506104927f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b348015610610575f80fd5b5061036f6005600160991b0181565b34801561062a575f80fd5b50610256610639366004614b85565b611af2565b348015610649575f80fd5b506104925f80516020615ae383398151915281565b348015610669575f80fd5b50610256610678366004614b85565b611d4b565b61049261068b366004614b85565b611e87565b34801561069b575f80fd5b506102aa601481565b3480156106af575f80fd5b506106c36106be366004614b85565b611eb8565b6040516102b89190614de1565b3480156106db575f80fd5b5061033d6202a30081565b3480156106f1575f80fd5b50610256610700366004614ccc565b612007565b348015610710575f80fd5b5061049261071f366004614e61565b61209e565b6107308383835f6120f9565b505050565b5f8181525f80516020615b038339815191526020526040808220815160e0810190925280545f80516020615ae383398151915293929190829060ff16600581111561078257610782614d6c565b600581111561079357610793614d6c565b81526020016001820180546107a790614ecc565b80601f01602080910402602001604051908101604052809291908181526020018280546107d390614ecc565b801561081e5780601f106107f55761010080835404028352916020019161081e565b820191905f5260205f20905b81548152906001019060200180831161080157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561088957610889614d6c565b146108c5575f8381526005830160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614efe565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af415801561093c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109639190810190615007565b6040518263ffffffff1660e01b815260040161097f9190615038565b6020604051808303815f875af115801561099b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bf919061504a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a0e575080546001600160401b03808416911610155b15610a2c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5683612125565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6109bf8383835f612136565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f80516020615ae38339815191529060ff1615610b0057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b67919061504a565b836020013514610b90576040516372b0a7e760e11b8152602084013560048201526024016108bc565b30610ba16060850160408601615061565b6001600160a01b031614610be457610bbf6060840160408501615061565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016108bc565b5f610bf2606085018561507c565b905090505f805b828163ffffffff161015610e5a575f610c15606088018861507c565b8363ffffffff16818110610c2b57610c2b6150c1565b9050602002810190610c3d91906150d5565b610c4690615140565b80516040519192505f916006880191610c5e916151bb565b90815260200160405180910390205414610c8e57805160405163a41f772f60e01b81526108bc9190600401615038565b5f6002885f013584604051602001610cbd92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610cd7916151bb565b602060405180830381855afa158015610cf2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d15919061504a565b90508086600601835f0151604051610d2d91906151bb565b90815260408051918290036020908101909220929092555f8381526005890190915220805460ff191660021781558251600190910190610d6d9082615210565b50604082810180515f84815260058a016020529290922060028101805492516001600160401b039485166001600160c01b031990941693909317600160801b85851602176001600160c01b0316600160c01b429590951694909402939093179092556003909101805467ffffffffffffffff19169055610ded90856152df565b8251604051919550610dfe916151bb565b60408051918290038220908401516001600160401b031682529082907ffe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c9060200160405180910390a3505080610e53906152ff565b9050610bf9565b5060038301805467ffffffffffffffff60401b1916600160401b6001600160401b0384168102919091179091556001840154606491610e9d910460ff1683615321565b6001600160401b03161015610ed057604051633e1a785160e01b81526001600160401b03821660048201526024016108bc565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d847884610ef48761246b565b604001516040518263ffffffff1660e01b8152600401610f149190615038565b602060405180830381865af4158015610f2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f53919061504a565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610f8d9190615477565b5f60405180830381865af4158015610fa7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fce9190810190615007565b90505f600282604051610fe191906151bb565b602060405180830381855afa158015610ffc573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061101f919061504a565b905082811461104b5760405163baaea89d60e01b815260048101829052602481018490526044016108bc565b5050506007909201805460ff1916600117905550505050565b61106d82612581565b61108d576040516330efa98b60e01b8152600481018390526024016108bc565b5f61109783611eb8565b51905060028160058111156110ae576110ae614d6c565b146110ce578060405163170cc93360e21b81526004016108bc9190614efe565b6109bf83836125aa565b5f806110e2612849565b600301546110f0908461550b565b905080158061110557506001600160401b0381115b156111265760405163222d164360e21b8152600481018490526024016108bc565b92915050565b61113884848484612136565b5050505050565b6109bf8383835f61286d565b611153612aaa565b5f61115c612849565b90505f8061116984612ae1565b9150915061117682612581565b61118257505050611204565b5f828152600684016020908152604080832054600b870190925290912080546001600160a01b031981169091556001600160a01b039182169116806111c45750805b6004835160058111156111d9576111d9614d6c565b036111e8576111e88185612e99565b6111fe826111f985604001516114f1565b612ec3565b50505050505b61121a60015f80516020615b2383398151915255565b50565b6109bf84848484612ee9565b5f611232612849565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561126b5761126b614d6c565b600381111561127c5761127c614d6c565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6112f282611eb8565b905060018351600381111561130957611309614d6c565b1461132a578251604051633b0d540d60e21b81526108bc919060040161552a565b60048151600581111561133f5761133f614d6c565b036113555761134d86612f15565b505050505050565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f61137a8961246b565b604001516040518263ffffffff1660e01b815260040161139a9190615038565b606060405180830381865af41580156113b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d99190615544565b509150915081841461140657846040015160405163089938b360e11b81526004016108bc91815260200190565b806001600160401b031683606001516001600160401b0316108061143f5750806001600160401b03168560a001516001600160401b0316115b1561146857604051632e19bc2d60e11b81526001600160401b03821660048201526024016108bc565b5f888152600787016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b810267ffffffffffffffff60401b1990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f6114fa612849565b60030154611126906001600160401b038416615579565b5f61151b82611eb8565b6080015192915050565b6107308383835f612ee9565b6111388484848461286d565b611545612aaa565b5f61154e612849565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561158757611587614d6c565b600381111561159857611598614d6c565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561161157611611614d6c565b14611632578051604051633b0d540d60e21b81526108bc919060040161552a565b60046116418260400151611eb8565b51600581111561165357611653614d6c565b14611752575f6116628461246b565b90505f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f84604001516040518263ffffffff1660e01b81526004016116a19190615038565b606060405180830381865af41580156116bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e09190615544565b50915091508184604001511461170c5760405163089938b360e11b8152600481018390526024016108bc565b806001600160401b03168460c001516001600160401b0316111561174e57604051632e19bc2d60e11b81526001600160401b03821660048201526024016108bc565b5050505b61175b84612f15565b505061177360015f80516020615b2383398151915255565b5050565b5f611780612849565b90506001600160a01b0382166117b45760405163caa903f960e01b81526001600160a01b03831660048201526024016108bc565b5f8381526006820160205260409020546001600160a01b031633146117fa57335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016108bc565b5f928352600b01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f611831612849565b90505f61183d83611eb8565b519050600481600581111561185457611854614d6c565b14611874578060405163170cc93360e21b81526004016108bc9190614efe565b5f8381526006830160205260409020546001600160a01b0316331461189957336117d5565b5f838152600683016020526040902054610730906001600160a01b031684612e99565b6109bf848484846120f9565b5f80516020615ae38339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f6118fb8661246b565b604001516040518263ffffffff1660e01b815260040161191b9190615038565b6040805180830381865af4158015611935573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119599190615590565b915091508061197f57604051632d07135360e01b815281151560048201526024016108bc565b5f8281526004840160205260409020805461199990614ecc565b90505f036119bd5760405163089938b360e11b8152600481018390526024016108bc565b60015f838152600580860160205260409091205460ff16908111156119e4576119e4614d6c565b14611a17575f8281526005840160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614efe565b5f8281526004840160205260408120611a2f91614a9e565b5f828152600584016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917f8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b910160405180910390a250505050565b5f611ac7612aaa565b611ad3848484346130ea565b9050611aeb60015f80516020615b2383398151915255565b9392505050565b5f611afb612849565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115611b3457611b34614d6c565b6003811115611b4557611b45614d6c565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611bbe57611bbe614d6c565b14158015611bdf5750600381516003811115611bdc57611bdc614d6c565b14155b15611c00578051604051633b0d540d60e21b81526108bc919060040161552a565b5f611c0e8260400151611eb8565b905080606001516001600160401b03165f03611c40576040516339b894f960e21b8152600481018590526024016108bc565b60408083015160608301516080840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93611cae93906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015611cc8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cef9190810190615007565b6040518263ffffffff1660e01b8152600401611d0b9190615038565b6020604051808303815f875af1158015611d27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611138919061504a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040902080545f80516020615ae38339815191529190611d9290614ecc565b90505f03611db65760405163089938b360e11b8152600481018390526024016108bc565b60015f838152600580840160205260409091205460ff1690811115611ddd57611ddd614d6c565b14611e10575f8281526005820160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614efe565b5f8281526004808301602052604091829020915163ee5b48eb60e01b81526005600160991b019263ee5b48eb92611e4792016155b3565b6020604051808303815f875af1158015611e63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610730919061504a565b5f611e90612aaa565b611e9b82333461325f565b9050611eb360015f80516020615b2383398151915255565b919050565b611ec0614ad5565b5f8281525f80516020615b03833981519152602052604090819020815160e0810190925280545f80516020615ae3833981519152929190829060ff166005811115611f0d57611f0d614d6c565b6005811115611f1e57611f1e614d6c565b8152602001600182018054611f3290614ecc565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5e90614ecc565b8015611fa95780601f10611f8057610100808354040283529160200191611fa9565b820191905f5260205f20905b815481529060010190602001808311611f8c57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6001600160a01b0381166120395760405163caa903f960e01b81526001600160a01b03821660048201526024016108bc565b5f612042612849565b5f8481526007820160205260409020549091506001600160a01b0361010090910416331461207057336117d5565b5f928352600901602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6040515f905f80516020615ae3833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06906120e1908690869061563d565b90815260200160405180910390205491505092915050565b61210584848484612136565b6109bf57604051631036cf9160e11b8152600481018590526024016108bc565b61212d613498565b61121a816134e3565b5f80612140612849565b5f878152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561217957612179614d6c565b600381111561218a5761218a614d6c565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61220082611eb8565b905060028351600381111561221757612217614d6c565b14612238578251604051633b0d540d60e21b81526108bc919060040161552a565b60208301516001600160a01b031633146122d4575f8281526006850160205260409020546001600160a01b0316331461227157336117d5565b5f82815260068501602052604090205460a08201516122a091600160b01b90046001600160401b0316906152df565b6001600160401b03164210156122d45760405163fb6ce63f60e01b81526001600160401b03421660048201526024016108bc565b6002815160058111156122e9576122e9614d6c565b0361240b576002840154608084015161230b916001600160401b0316906152df565b6001600160401b031642101561233f5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016108bc565b87156123515761234f82886125aa565b505b5f8981526007850160205260409020805460ff191660031790556060830151608082015161238a918491612385919061564c565b61355d565b505f8a8152600786016020526040812060020180546001600160401b03909316600160c01b026001600160c01b03909316929092179091556123cd84888c613734565b9050828a7f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5760405160405180910390a3151594506124639350505050565b60048151600581111561242057612420614d6c565b036124475761243083878b613734565b5061243a89612f15565b6001945050505050612463565b805160405163170cc93360e21b81526108bc9190600401614efe565b949350505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156124cf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124f6919081019061566c565b915091508061251857604051636b2f19e960e01b815260040160405180910390fd5b81511561253e578151604051636ba589a560e01b815260048101919091526024016108bc565b60208201516001600160a01b03161561257a576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016108bc565b5092915050565b5f8061258b612849565b5f938452600601602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156125f5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261261c919081019061566c565b915091508061263e57604051636b2f19e960e01b815260040160405180910390fd5b5f612647612849565b6005810154845191925014612675578251604051636ba589a560e01b815260048101919091526024016108bc565b60208301516001600160a01b0316156126b1576020830151604051624de75d60e31b81526001600160a01b0390911660048201526024016108bc565b60208301516001600160a01b0316156126ed576020830151604051624de75d60e31b81526001600160a01b0390911660048201526024016108bc565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b815260040161272a9190615038565b6040805180830381865af4158015612744573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061276891906156fc565b9150915081881461278f5760405163089938b360e11b8152600481018990526024016108bc565b5f8881526006840160205260409020600101546001600160401b039081169082161115612820575f888152600684016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261283e565b505f8781526006830160205260409020600101546001600160401b03165b979650505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f80612877612849565b90505f61288387613922565b905061288e87612581565b61289d57600192505050612463565b5f8781526006830160205260409020546001600160a01b031633146128c257336117d5565b5f87815260068301602052604090205460a08201516128f191600160b01b90046001600160401b0316906152df565b6001600160401b03168160c001516001600160401b031610156129385760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016108bc565b5f86156129505761294988876125aa565b905061296e565b505f8781526006830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f90612993906114f1565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156129fc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a20919061504a565b90506001600160a01b038616612a4c575f8981526006850160205260409020546001600160a01b031695505b5f898152600a8501602052604081208054839290612a6b90849061571f565b90915550505f898152600b909401602052604090932080546001600160a01b0387166001600160a01b0319909116179055505015159050949350505050565b5f80516020615b23833981519152805460011901612adb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612aea614ad5565b5f80516020615ae38339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f612b1d8861246b565b604001516040518263ffffffff1660e01b8152600401612b3d9190615038565b6040805180830381865af4158015612b57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b7b9190615590565b915091508015612ba257604051632d07135360e01b815281151560048201526024016108bc565b5f82815260058085016020526040808320815160e08101909252805491929091839160ff90911690811115612bd957612bd9614d6c565b6005811115612bea57612bea614d6c565b8152602001600182018054612bfe90614ecc565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2a90614ecc565b8015612c755780601f10612c4c57610100808354040283529160200191612c75565b820191905f5260205f20905b815481529060010190602001808311612c5857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612ce057612ce0614d6c565b14158015612d015750600181516005811115612cfe57612cfe614d6c565b14155b15612d2257805160405163170cc93360e21b81526108bc9190600401614efe565b600381516005811115612d3757612d37614d6c565b03612d455760048152612d4a565b600581525b836006018160200151604051612d6091906151bb565b90815260408051602092819003830190205f90819055858152600587810190935220825181548493839160ff1916906001908490811115612da357612da3614d6c565b021790555060208201516001820190612dbc9082615210565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612e6257612e62614d6c565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f612ea2612849565b5f838152600a82016020526040812080549190559091506109bf8482613c07565b6117736001600160a01b03831682613c65565b60015f80516020615b2383398151915255565b612ef58484848461286d565b6109bf57604051635bff683f60e11b8152600481018590526024016108bc565b5f612f1e612849565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115612f5757612f57614d6c565b6003811115612f6857612f68614d6c565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612fdc613cf8565b602001518260800151612fef91906152df565b6001600160401b03164210156130235760405163fb6ce63f60e01b81526001600160401b03421660048201526024016108bc565b5f848152600784016020908152604080832080546001600160a81b03191681556001810184905560020183905560098601909152902080546001600160a01b031981169091556001600160a01b03168061307e575060208201515b5f8061308b838886613d59565b915091506130a485602001516111f987606001516114f1565b6040805183815260208101839052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f806130f4612849565b600281015490915061ffff600160401b9091048116908616108061311d575061271061ffff8616115b1561314157604051635f12e6c360e11b815261ffff861660048201526024016108bc565b60028101546001600160401b03908116908516101561317d576040516202a06d60e11b81526001600160401b03851660048201526024016108bc565b805483108061318f5750806001015483115b156131b05760405163222d164360e21b8152600481018490526024016108bc565b825f6131bb826110d8565b90505f6131c88983613e06565b5f818152600686016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600b9096019095529790932080546001600160a01b031916909617909555509395945050505050565b5f80613269612849565b90505f613275846110d8565b90505f61328187611eb8565b905061328c87612581565b6132ac576040516330efa98b60e01b8152600481018890526024016108bc565b6002815160058111156132c1576132c1614d6c565b146132e257805160405163170cc93360e21b81526108bc9190600401614efe565b5f8282608001516132f391906152df565b6002850154604084015191925061331591600160501b90910460ff1690615321565b6001600160401b0316816001600160401b0316111561335257604051636d51fe0560e11b81526001600160401b03821660048201526024016108bc565b5f8061335e8a8461355d565b915091505f8a8360405160200161338c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260078b019093529120805491925060019160ff1916828002179055505f8181526007880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a2234269060800160405180910390a49a9950505050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166134e157604051631afcd79f60e31b815260040160405180910390fd5b565b6134eb613498565b6134f481614378565b6134fc614391565b61121a6060820135608083013561351960c0850160a08601614cb1565b61352960e0860160c08701615732565b61353a610100870160e0880161574b565b61010087013561355261014089016101208a01615061565b8861014001356143a1565b5f8281525f80516020615b03833981519152602052604081206002015481905f80516020615ae383398151915290600160801b90046001600160401b03166135a5858261455e565b5f6135af876147c8565b5f888152600585016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af4158015613658573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261367f9190810190615007565b6040518263ffffffff1660e01b815260040161369b9190615038565b6020604051808303815f875af11580156136b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136db919061504a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8061373e612849565b90505f61374e8660400151611eb8565b90505f60038251600581111561376657613766614d6c565b1480613784575060048251600581111561378257613782614d6c565b145b15613794575060c08101516137d1565b6002825160058111156137a9576137a9614d6c565b036137b55750426137d1565b815160405163170cc93360e21b81526108bc9190600401614efe565b86608001516001600160401b0316816001600160401b0316116137f9575f9350505050611aeb565b600483015460608801515f916001600160a01b031690634f22429f9061381e906114f1565b60a086015160808c01516040808e01515f90815260068b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa15801561389f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138c3919061504a565b90506001600160a01b0387166138db57876020015196505b5f8681526008850160209081526040808320849055600990960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b61392a614ad5565b5f8281525f80516020615b038339815191526020526040808220815160e0810190925280545f80516020615ae383398151915293929190829060ff16600581111561397757613977614d6c565b600581111561398857613988614d6c565b815260200160018201805461399c90614ecc565b80601f01602080910402602001604051908101604052809291908181526020018280546139c890614ecc565b8015613a135780601f106139ea57610100808354040283529160200191613a13565b820191905f5260205f20905b8154815290600101906020018083116139f657829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613a8157613a81614d6c565b14613ab4575f8481526005830160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614efe565b60038152426001600160401b031660c08201525f84815260058381016020526040909120825181548493839160ff1916906001908490811115613af957613af9614d6c565b021790555060208201516001820190613b129082615210565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613bb0858261355d565b6080840151604080516001600160401b03909216825242602083015291935083925087917ffbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42910160405180910390a3509392505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015613c53575f80fd5b505af115801561134d573d5f803e3d5ffd5b80471015613c885760405163cd78605960e01b81523060048201526024016108bc565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613cd1576040519150601f19603f3d011682016040523d82523d5f602084013e613cd6565b606091505b505090508061073057604051630a12f52160e11b815260040160405180910390fd5b604080516060810182525f80825260208201819052918101829052905f80516020615ae383398151915260408051606081018252825481526001909201546001600160401b0381166020840152600160401b900460ff169082015292915050565b5f805f613d64612849565b5f86815260088201602052604081208054908290559192509081908015613df8575f87815260068501602052604090205461271090613dae90600160a01b900461ffff1683615579565b613db8919061550b565b91508184600a015f8981526020019081526020015f205f828254613ddc919061571f565b90915550613dec9050828261576b565b9250613df88984613c07565b509097909650945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f9060ff16613e4a57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615ae383398151915242613e696060860160408701614cb1565b6001600160401b0316111580613ea35750613e876202a3004261571f565b613e976060860160408701614cb1565b6001600160401b031610155b15613edd57613eb86060850160408601614cb1565b604051635879da1360e11b81526001600160401b0390911660048201526024016108bc565b60038101546001600160401b0390613f0090600160401b9004821685831661571f565b1115613f2a57604051633e1a785160e01b81526001600160401b03841660048201526024016108bc565b613f3f613f3a606086018661577e565b61483d565b613f4f613f3a608086018661577e565b6030613f5e6020860186615792565b905014613f9057613f726020850185615792565b6040516326475b2f60e11b81526108bc925060040190815260200190565b613f9a8480615792565b90505f03613fc757613fac8480615792565b604051633e08a12560e11b81526004016108bc9291906157d4565b5f60068201613fd68680615792565b604051613fe492919061563d565b9081526020016040518091039020541461401d576140028480615792565b60405163a41f772f60e01b81526004016108bc9291906157d4565b614027835f61455e565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce5190602081016140648a80615792565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906140ac908b018b615792565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016140f560608b0160408c01614cb1565b6001600160401b0316815260200161411060608b018b61577e565b614119906157e7565b815260200161412b60808b018b61577e565b614134906157e7565b8152602001886001600160401b03168152506040518263ffffffff1660e01b81526004016141629190615914565b5f60405180830381865af415801561417c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526141a391908101906159cb565b5f828152600486016020526040902091935091506141c18282615210565b5081600684016141d18880615792565b6040516141df92919061563d565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061421b908590600401615038565b6020604051808303815f875af1158015614237573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061425b919061504a565b5f8481526005860160205260409020805460ff1916600117905590506142818780615792565b5f85815260058701602052604090206001019161429f919083615a0e565b505f83815260058501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff19169055806142fe8880615792565b60405161430c92919061563d565b6040518091039020847fd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49898b604001602081019061434a9190614cb1565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614380613498565b6143886149a6565b61121a816149ae565b614399613498565b6134e1614a96565b6143a9613498565b5f6143b2612849565b905061ffff861615806143ca575061271061ffff8716115b156143ee57604051635f12e6c360e11b815261ffff871660048201526024016108bc565b878911156144125760405163222d164360e21b8152600481018a90526024016108bc565b60ff851615806144255750600a60ff8616115b156144485760405163170db35960e31b815260ff861660048201526024016108bc565b614450613cf8565b602001516001600160401b0316876001600160401b03161015614490576040516202a06d60e11b81526001600160401b03881660048201526024016108bc565b835f036144b05760405163a733007160e01b815260040160405180910390fd5b816144d157604051632f6bd1db60e01b8152600481018390526024016108bc565b978855600188019690965560028701805460ff909416600160501b0260ff60501b1961ffff909616600160401b0269ffffffffffffffffffff199095166001600160401b0390971696909617939093179390931693909317905560038401919091556004830180546001600160a01b039092166001600160a01b0319909216919091179055600590910155565b5f80516020615ae38339815191525f6001600160401b0380841690851611156145925761458b838561564c565b905061459f565b61459c848461564c565b90505b60408051608081018252600284015480825260038501546001600160401b038082166020850152600160401b8204811694840194909452600160801b900490921660608201524291158061460c575060018401548151614608916001600160401b03169061571f565b8210155b15614634576001600160401b0380841660608301528282526040820151166020820152614653565b828160600181815161464691906152df565b6001600160401b03169052505b6060810151614663906064615321565b602082015160018601546001600160401b03929092169161468e9190600160401b900460ff16615321565b6001600160401b031610156146c757606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016108bc565b85816040018181516146d991906152df565b6001600160401b03169052506040810180518691906146f990839061564c565b6001600160401b03169052506001840154604082015160649161472791600160401b90910460ff1690615321565b6001600160401b03161015614760576040808201519051633e1a785160e01b81526001600160401b0390911660048201526024016108bc565b8051600285015560208101516003909401805460408301516060909301516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b0319909316919097161717919091169390931790925550505050565b5f8181525f80516020615b038339815191526020526040812060020180545f80516020615ae3833981519152919060089061481290600160401b90046001600160401b0316615ac7565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61484a6020820182614c84565b63ffffffff1615801561486a5750614865602082018261507c565b151590505b156148b15761487c6020820182614c84565b614889602083018361507c565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016108bc565b6148be602082018261507c565b90506148cd6020830183614c84565b63ffffffff1611156148e65761487c6020820182614c84565b60015b6148f6602083018361507c565b90508110156117735761490c602083018361507c565b61491760018461576b565b818110614926576149266150c1565b905060200201602081019061493b9190615061565b6001600160a01b0316614951602084018461507c565b83818110614961576149616150c1565b90506020020160208101906149769190615061565b6001600160a01b0316101561499e57604051630dbc8d5f60e31b815260040160405180910390fd5b6001016148e9565b6134e1613498565b6149b6613498565b80355f80516020615ae383398151915290815560146149db606084016040850161574b565b60ff1611806149fa57506149f5606083016040840161574b565b60ff16155b15614a2e57614a0f606083016040840161574b565b604051634a59bbff60e11b815260ff90911660048201526024016108bc565b614a3e606083016040840161574b565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614a6f6040830160208401614cb1565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ed6613498565b508054614aaa90614ecc565b5f825580601f10614ab9575050565b601f0160209004905f5260205f209081019061121a9190614b12565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614b26575f8155600101614b13565b5090565b801515811461121a575f80fd5b803563ffffffff81168114611eb3575f80fd5b5f805f60608486031215614b5c575f80fd5b833592506020840135614b6e81614b2a565b9150614b7c60408501614b37565b90509250925092565b5f60208284031215614b95575f80fd5b5035919050565b5f6101608284031215614bad575f80fd5b50919050565b5f8060408385031215614bc4575f80fd5b82356001600160401b03811115614bd9575f80fd5b830160808186031215614bea575f80fd5b9150614bf860208401614b37565b90509250929050565b5f8060408385031215614c12575f80fd5b82359150614bf860208401614b37565b6001600160a01b038116811461121a575f80fd5b5f805f8060808587031215614c49575f80fd5b843593506020850135614c5b81614b2a565b9250614c6960408601614b37565b91506060850135614c7981614c22565b939692955090935050565b5f60208284031215614c94575f80fd5b611aeb82614b37565b6001600160401b038116811461121a575f80fd5b5f60208284031215614cc1575f80fd5b8135611aeb81614c9d565b5f8060408385031215614cdd575f80fd5b823591506020830135614cef81614c22565b809150509250929050565b803561ffff81168114611eb3575f80fd5b5f805f60608486031215614d1d575f80fd5b83356001600160401b03811115614d32575f80fd5b840160a08187031215614d43575f80fd5b9250614d5160208501614cfa565b91506040840135614d6181614c9d565b809150509250925092565b634e487b7160e01b5f52602160045260245ffd5b60068110614d9057614d90614d6c565b9052565b5f5b83811015614dae578181015183820152602001614d96565b50505f910152565b5f8151808452614dcd816020860160208601614d94565b601f01601f19169290920160200192915050565b60208152614df3602082018351614d80565b5f602083015160e06040840152614e0e610100840182614db6565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215614e72575f80fd5b82356001600160401b0380821115614e88575f80fd5b818501915085601f830112614e9b575f80fd5b813581811115614ea9575f80fd5b866020828501011115614eba575f80fd5b60209290920196919550909350505050565b600181811c90821680614ee057607f821691505b602082108103614bad57634e487b7160e01b5f52602260045260245ffd5b602081016111268284614d80565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f4257614f42614f0c565b60405290565b604080519081016001600160401b0381118282101715614f4257614f42614f0c565b604051601f8201601f191681016001600160401b0381118282101715614f9257614f92614f0c565b604052919050565b5f6001600160401b03821115614fb257614fb2614f0c565b50601f01601f191660200190565b5f82601f830112614fcf575f80fd5b8151614fe2614fdd82614f9a565b614f6a565b818152846020838601011115614ff6575f80fd5b612463826020830160208701614d94565b5f60208284031215615017575f80fd5b81516001600160401b0381111561502c575f80fd5b61246384828501614fc0565b602081525f611aeb6020830184614db6565b5f6020828403121561505a575f80fd5b5051919050565b5f60208284031215615071575f80fd5b8135611aeb81614c22565b5f808335601e19843603018112615091575f80fd5b8301803591506001600160401b038211156150aa575f80fd5b6020019150600581901b360382131561372d575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126150e9575f80fd5b9190910192915050565b5f82601f830112615102575f80fd5b8135615110614fdd82614f9a565b818152846020838601011115615124575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615150575f80fd5b615158614f20565b82356001600160401b038082111561516e575f80fd5b61517a368387016150f3565b8352602085013591508082111561518f575f80fd5b5061519c368286016150f3565b60208301525060408301356151b081614c9d565b604082015292915050565b5f82516150e9818460208701614d94565b601f82111561073057805f5260205f20601f840160051c810160208510156151f15750805b601f840160051c820191505b81811015611138575f81556001016151fd565b81516001600160401b0381111561522957615229614f0c565b61523d816152378454614ecc565b846151cc565b602080601f831160018114615270575f84156152595750858301515b5f19600386901b1c1916600185901b17855561134d565b5f85815260208120601f198616915b8281101561529e5788860151825594840194600190910190840161527f565b50858210156152bb57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111561257a5761257a6152cb565b5f63ffffffff808316818103615317576153176152cb565b6001019392505050565b6001600160401b03818116838216028082169190828114615344576153446152cb565b505092915050565b5f808335601e19843603018112615361575f80fd5b83016020810192503590506001600160401b0381111561537f575f80fd5b80360382131561372d575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b8781101561546a57848303601f19018952813536889003605e190181126153f1575f80fd5b870160606153ff828061534c565b82875261540f838801828461538d565b9250505061541f8683018361534c565b8683038888015261543183828461538d565b92505050604080830135925061544683614c9d565b6001600160401b0392909216949091019390935297830197908301906001016153cc565b5090979650505050505050565b6020815281356020820152602082013560408201525f604083013561549b81614c22565b6001600160a01b031660608381019190915283013536849003601e190181126154c2575f80fd5b83016020810190356001600160401b038111156154dd575f80fd5b8060051b36038213156154ee575f80fd5b60808085015261550260a0850182846153b5565b95945050505050565b5f8261552557634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061553e5761553e614d6c565b91905290565b5f805f60608486031215615556575f80fd5b83519250602084015161556881614c9d565b6040850151909250614d6181614c9d565b8082028115828204841417611126576111266152cb565b5f80604083850312156155a1575f80fd5b825191506020830151614cef81614b2a565b5f60208083525f84546155c581614ecc565b806020870152604060018084165f81146155e657600181146156025761562f565b60ff19851660408a0152604084151560051b8a0101955061562f565b895f5260205f205f5b858110156156265781548b820186015290830190880161560b565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0382811682821603908082111561257a5761257a6152cb565b5f806040838503121561567d575f80fd5b82516001600160401b0380821115615693575f80fd5b90840190606082870312156156a6575f80fd5b6156ae614f20565b8251815260208301516156c081614c22565b60208201526040830151828111156156d6575f80fd5b6156e288828601614fc0565b6040830152508094505050506020830151614cef81614b2a565b5f806040838503121561570d575f80fd5b825191506020830151614cef81614c9d565b80820180821115611126576111266152cb565b5f60208284031215615742575f80fd5b611aeb82614cfa565b5f6020828403121561575b575f80fd5b813560ff81168114611aeb575f80fd5b81810381811115611126576111266152cb565b5f8235603e198336030181126150e9575f80fd5b5f808335601e198436030181126157a7575f80fd5b8301803591506001600160401b038211156157c0575f80fd5b60200191503681900382131561372d575f80fd5b602081525f61246360208301848661538d565b5f604082360312156157f7575f80fd5b6157ff614f48565b61580883614b37565b81526020808401356001600160401b0380821115615824575f80fd5b9085019036601f830112615836575f80fd5b81358181111561584857615848614f0c565b8060051b9150615859848301614f6a565b8181529183018401918481019036841115615872575f80fd5b938501935b8385101561589c578435925061588c83614c22565b8282529385019390850190615877565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b808310156159095784516001600160a01b031682529383019360019290920191908301906158e0565b509695505050505050565b60208152815160208201525f602083015160e0604084015261593a610100840182614db6565b90506040840151601f19808584030160608601526159588383614db6565b92506001600160401b03606087015116608086015260808601519150808584030160a086015261598883836158ae565b925060a08601519150808584030160c0860152506159a682826158ae565b91505060c08401516159c360e08501826001600160401b03169052565b509392505050565b5f80604083850312156159dc575f80fd5b8251915060208301516001600160401b038111156159f8575f80fd5b615a0485828601614fc0565b9150509250929050565b6001600160401b03831115615a2557615a25614f0c565b615a3983615a338354614ecc565b836151cc565b5f601f841160018114615a6a575f8515615a535750838201355b5f19600387901b1c1916600186901b178355611138565b5f83815260208120601f198716915b82811015615a995786850135825560209485019460019092019101615a79565b5086821015615ab5575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f6001600160401b03808316818103615317576153176152cb56fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb059b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a264697066735822122008a48a8feb5f4b2f22d97ada5d0068b988757c656ef72fe8ca1a5792a84a581e64736f6c63430008190033", + ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidBLSKeyLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encodedConversionID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedConversionID\",\"type\":\"bytes32\"}],\"name\":\"InvalidConversionID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"}],\"name\":\"InvalidDelegationFee\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidDelegationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumDelegatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidDelegatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"name\":\"InvalidMaximumChurnPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"InvalidMinStakeDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"InvalidNodeID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"InvalidRegistrationExpiry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"InvalidRewardRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"}],\"name\":\"InvalidStakeMultiplier\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InvalidTotalWeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidUptimeBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"}],\"name\":\"InvalidValidatorManagerAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidatorManagerBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"name\":\"MaxChurnRateExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newValidatorWeight\",\"type\":\"uint64\"}],\"name\":\"MaxWeightExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"MinStakeDurationNotPassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"NodeAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PChainOwnerAddressesNotSorted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorNotPoS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroWeightToValueFactor\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"DelegationEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"DelegatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BIPS_CONVERSION_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_MINTER\",\"outputs\":[{\"internalType\":\"contractINativeMinter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"startingWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endedAt\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"baseSettings\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"minimumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"minimumStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"weightToValueFactor\",\"type\":\"uint256\"},{\"internalType\":\"contractIRewardCalculator\",\"name\":\"rewardCalculator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"internalType\":\"structPoSValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"initializeDelegatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"}],\"internalType\":\"structValidatorRegistrationInput\",\"name\":\"registrationInput\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"initializeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"registeredValidators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"valueToWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"weightToValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615cc5380380615cc583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615b788061014d5f395ff3fe608060405260043610610233575f3560e01c80637d8d2f7711610129578063b771b3bc116100a8578063c974d1b61161006d578063c974d1b614610690578063d5f20ff6146106a4578063df93d8de146106d0578063fb8b11dd146106e6578063fd7ac5e714610705575f80fd5b8063b771b3bc14610605578063ba3a4b971461061f578063bc5fbfec1461063e578063bee0a03f1461065e578063c599e24f1461067d575f80fd5b80639ae06447116100ee5780639ae0644714610581578063a3a65e48146105a0578063a9778a7a14610387578063af2f5feb146105bf578063afb98096146105d2575f80fd5b80637d8d2f77146104f157806380dd672f146105105780638280a25a1461052f5780638ef34c981461054357806393e2459814610562575f80fd5b806337b9be8f116101b557806360ad77841161017a57806360ad778414610454578063620658561461047357806366435abf146104a0578063732214f8146104bf57806376f78621146104d2575f80fd5b806337b9be8f146103af5780633a1cfff6146103ce578063467ef06f146103ed5780635dd6a6cb1461040c57806360305d621461042b575f80fd5b806320d91b7a116101fb57806320d91b7a146102e057806325e1c776146102ff5780632e2194d81461031e578063329c3e121461035557806335455ded14610387575f80fd5b80630118acc4146102375780630322ed98146102585780630ba512d114610277578063151d30d1146102965780631ec44724146102c1575b5f80fd5b348015610242575f80fd5b50610256610251366004614b4a565b610724565b005b348015610263575f80fd5b50610256610272366004614b85565b610735565b348015610282575f80fd5b50610256610291366004614b9c565b6109c5565b3480156102a1575f80fd5b506102aa600a81565b60405160ff90911681526020015b60405180910390f35b3480156102cc575f80fd5b506102566102db366004614b4a565b610aa2565b3480156102eb575f80fd5b506102566102fa366004614bb3565b610aae565b34801561030a575f80fd5b50610256610319366004614c01565b611064565b348015610329575f80fd5b5061033d610338366004614b85565b6110d8565b6040516001600160401b0390911681526020016102b8565b348015610360575f80fd5b5061036f6001600160991b0181565b6040516001600160a01b0390911681526020016102b8565b348015610392575f80fd5b5061039c61271081565b60405161ffff90911681526020016102b8565b3480156103ba575f80fd5b506102566103c9366004614c36565b61112c565b3480156103d9575f80fd5b506102566103e8366004614b4a565b61113f565b3480156103f8575f80fd5b50610256610407366004614c84565b61114b565b348015610417575f80fd5b50610256610426366004614c36565b61121d565b348015610436575f80fd5b5061043f601481565b60405163ffffffff90911681526020016102b8565b34801561045f575f80fd5b5061025661046e366004614c01565b611229565b34801561047e575f80fd5b5061049261048d366004614cb1565b6114f1565b6040519081526020016102b8565b3480156104ab575f80fd5b5061033d6104ba366004614b85565b611511565b3480156104ca575f80fd5b506104925f81565b3480156104dd575f80fd5b506102566104ec366004614b4a565b611525565b3480156104fc575f80fd5b5061025661050b366004614c36565b611531565b34801561051b575f80fd5b5061025661052a366004614c01565b61153d565b34801561053a575f80fd5b506102aa603081565b34801561054e575f80fd5b5061025661055d366004614ccc565b611777565b34801561056d575f80fd5b5061025661057c366004614b85565b611828565b34801561058c575f80fd5b5061025661059b366004614c36565b6118bc565b3480156105ab575f80fd5b506102566105ba366004614c84565b6118c8565b6104926105cd366004614d0b565b611abe565b3480156105dd575f80fd5b506104927f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b348015610610575f80fd5b5061036f6005600160991b0181565b34801561062a575f80fd5b50610256610639366004614b85565b611af2565b348015610649575f80fd5b506104925f80516020615ae383398151915281565b348015610669575f80fd5b50610256610678366004614b85565b611d4b565b61049261068b366004614b85565b611e87565b34801561069b575f80fd5b506102aa601481565b3480156106af575f80fd5b506106c36106be366004614b85565b611eb8565b6040516102b89190614de1565b3480156106db575f80fd5b5061033d6202a30081565b3480156106f1575f80fd5b50610256610700366004614ccc565b612007565b348015610710575f80fd5b5061049261071f366004614e61565b61209e565b6107308383835f6120f9565b505050565b5f8181525f80516020615b038339815191526020526040808220815160e0810190925280545f80516020615ae383398151915293929190829060ff16600581111561078257610782614d6c565b600581111561079357610793614d6c565b81526020016001820180546107a790614ecc565b80601f01602080910402602001604051908101604052809291908181526020018280546107d390614ecc565b801561081e5780601f106107f55761010080835404028352916020019161081e565b820191905f5260205f20905b81548152906001019060200180831161080157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561088957610889614d6c565b146108c5575f8381526005830160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614efe565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af415801561093c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109639190810190615007565b6040518263ffffffff1660e01b815260040161097f9190615038565b6020604051808303815f875af115801561099b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bf919061504a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a0e575080546001600160401b03808416911610155b15610a2c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5683612125565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6109bf8383835f612136565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f80516020615ae38339815191529060ff1615610b0057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b67919061504a565b836020013514610b90576040516372b0a7e760e11b8152602084013560048201526024016108bc565b30610ba16060850160408601615061565b6001600160a01b031614610be457610bbf6060840160408501615061565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016108bc565b5f610bf2606085018561507c565b905090505f805b828163ffffffff161015610e5a575f610c15606088018861507c565b8363ffffffff16818110610c2b57610c2b6150c1565b9050602002810190610c3d91906150d5565b610c4690615140565b80516040519192505f916006880191610c5e916151bb565b90815260200160405180910390205414610c8e57805160405163a41f772f60e01b81526108bc9190600401615038565b5f6002885f013584604051602001610cbd92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610cd7916151bb565b602060405180830381855afa158015610cf2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d15919061504a565b90508086600601835f0151604051610d2d91906151bb565b90815260408051918290036020908101909220929092555f8381526005890190915220805460ff191660021781558251600190910190610d6d9082615210565b50604082810180515f84815260058a016020529290922060028101805492516001600160401b039485166001600160c01b031990941693909317600160801b85851602176001600160c01b0316600160c01b429590951694909402939093179092556003909101805467ffffffffffffffff19169055610ded90856152df565b8251604051919550610dfe916151bb565b60408051918290038220908401516001600160401b031682529082907ffe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c9060200160405180910390a3505080610e53906152ff565b9050610bf9565b5060038301805467ffffffffffffffff60401b1916600160401b6001600160401b0384168102919091179091556001840154606491610e9d910460ff1683615321565b6001600160401b03161015610ed057604051633e1a785160e01b81526001600160401b03821660048201526024016108bc565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d847884610ef48761246b565b604001516040518263ffffffff1660e01b8152600401610f149190615038565b602060405180830381865af4158015610f2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f53919061504a565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610f8d9190615477565b5f60405180830381865af4158015610fa7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fce9190810190615007565b90505f600282604051610fe191906151bb565b602060405180830381855afa158015610ffc573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061101f919061504a565b905082811461104b5760405163baaea89d60e01b815260048101829052602481018490526044016108bc565b5050506007909201805460ff1916600117905550505050565b61106d82612581565b61108d576040516330efa98b60e01b8152600481018390526024016108bc565b5f61109783611eb8565b51905060028160058111156110ae576110ae614d6c565b146110ce578060405163170cc93360e21b81526004016108bc9190614efe565b6109bf83836125aa565b5f806110e2612849565b600301546110f0908461550b565b905080158061110557506001600160401b0381115b156111265760405163222d164360e21b8152600481018490526024016108bc565b92915050565b61113884848484612136565b5050505050565b6109bf8383835f61286d565b611153612aaa565b5f61115c612849565b90505f8061116984612ae1565b9150915061117682612581565b61118257505050611204565b5f828152600684016020908152604080832054600b870190925290912080546001600160a01b031981169091556001600160a01b039182169116806111c45750805b6004835160058111156111d9576111d9614d6c565b036111e8576111e88185612e99565b6111fe826111f985604001516114f1565b612ec3565b50505050505b61121a60015f80516020615b2383398151915255565b50565b6109bf84848484612ee9565b5f611232612849565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561126b5761126b614d6c565b600381111561127c5761127c614d6c565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6112f282611eb8565b905060018351600381111561130957611309614d6c565b1461132a578251604051633b0d540d60e21b81526108bc919060040161552a565b60048151600581111561133f5761133f614d6c565b036113555761134d86612f15565b505050505050565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f61137a8961246b565b604001516040518263ffffffff1660e01b815260040161139a9190615038565b606060405180830381865af41580156113b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d99190615544565b509150915081841461140657846040015160405163089938b360e11b81526004016108bc91815260200190565b806001600160401b031683606001516001600160401b0316108061143f5750806001600160401b03168560a001516001600160401b0316115b1561146857604051632e19bc2d60e11b81526001600160401b03821660048201526024016108bc565b5f888152600787016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b810267ffffffffffffffff60401b1990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f6114fa612849565b60030154611126906001600160401b038416615579565b5f61151b82611eb8565b6080015192915050565b6107308383835f612ee9565b6111388484848461286d565b611545612aaa565b5f61154e612849565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561158757611587614d6c565b600381111561159857611598614d6c565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561161157611611614d6c565b14611632578051604051633b0d540d60e21b81526108bc919060040161552a565b60046116418260400151611eb8565b51600581111561165357611653614d6c565b14611752575f6116628461246b565b90505f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f84604001516040518263ffffffff1660e01b81526004016116a19190615038565b606060405180830381865af41580156116bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e09190615544565b50915091508184604001511461170c5760405163089938b360e11b8152600481018390526024016108bc565b806001600160401b03168460c001516001600160401b0316111561174e57604051632e19bc2d60e11b81526001600160401b03821660048201526024016108bc565b5050505b61175b84612f15565b505061177360015f80516020615b2383398151915255565b5050565b5f611780612849565b90506001600160a01b0382166117b45760405163caa903f960e01b81526001600160a01b03831660048201526024016108bc565b5f8381526006820160205260409020546001600160a01b031633146117fa57335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016108bc565b5f928352600b01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f611831612849565b90505f61183d83611eb8565b519050600481600581111561185457611854614d6c565b14611874578060405163170cc93360e21b81526004016108bc9190614efe565b5f8381526006830160205260409020546001600160a01b0316331461189957336117d5565b5f838152600683016020526040902054610730906001600160a01b031684612e99565b6109bf848484846120f9565b5f80516020615ae38339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f6118fb8661246b565b604001516040518263ffffffff1660e01b815260040161191b9190615038565b6040805180830381865af4158015611935573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119599190615590565b915091508061197f57604051632d07135360e01b815281151560048201526024016108bc565b5f8281526004840160205260409020805461199990614ecc565b90505f036119bd5760405163089938b360e11b8152600481018390526024016108bc565b60015f838152600580860160205260409091205460ff16908111156119e4576119e4614d6c565b14611a17575f8281526005840160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614efe565b5f8281526004840160205260408120611a2f91614a9e565b5f828152600584016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917f8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b910160405180910390a250505050565b5f611ac7612aaa565b611ad3848484346130ea565b9050611aeb60015f80516020615b2383398151915255565b9392505050565b5f611afb612849565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115611b3457611b34614d6c565b6003811115611b4557611b45614d6c565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611bbe57611bbe614d6c565b14158015611bdf5750600381516003811115611bdc57611bdc614d6c565b14155b15611c00578051604051633b0d540d60e21b81526108bc919060040161552a565b5f611c0e8260400151611eb8565b905080606001516001600160401b03165f03611c40576040516339b894f960e21b8152600481018590526024016108bc565b60408083015160608301516080840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93611cae93906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015611cc8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cef9190810190615007565b6040518263ffffffff1660e01b8152600401611d0b9190615038565b6020604051808303815f875af1158015611d27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611138919061504a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040902080545f80516020615ae38339815191529190611d9290614ecc565b90505f03611db65760405163089938b360e11b8152600481018390526024016108bc565b60015f838152600580840160205260409091205460ff1690811115611ddd57611ddd614d6c565b14611e10575f8281526005820160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614efe565b5f8281526004808301602052604091829020915163ee5b48eb60e01b81526005600160991b019263ee5b48eb92611e4792016155b3565b6020604051808303815f875af1158015611e63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610730919061504a565b5f611e90612aaa565b611e9b82333461325f565b9050611eb360015f80516020615b2383398151915255565b919050565b611ec0614ad5565b5f8281525f80516020615b03833981519152602052604090819020815160e0810190925280545f80516020615ae3833981519152929190829060ff166005811115611f0d57611f0d614d6c565b6005811115611f1e57611f1e614d6c565b8152602001600182018054611f3290614ecc565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5e90614ecc565b8015611fa95780601f10611f8057610100808354040283529160200191611fa9565b820191905f5260205f20905b815481529060010190602001808311611f8c57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6001600160a01b0381166120395760405163caa903f960e01b81526001600160a01b03821660048201526024016108bc565b5f612042612849565b5f8481526007820160205260409020549091506001600160a01b0361010090910416331461207057336117d5565b5f928352600901602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6040515f905f80516020615ae3833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06906120e1908690869061563d565b90815260200160405180910390205491505092915050565b61210584848484612136565b6109bf57604051631036cf9160e11b8152600481018590526024016108bc565b61212d613498565b61121a816134e3565b5f80612140612849565b5f878152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561217957612179614d6c565b600381111561218a5761218a614d6c565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61220082611eb8565b905060028351600381111561221757612217614d6c565b14612238578251604051633b0d540d60e21b81526108bc919060040161552a565b60208301516001600160a01b031633146122d4575f8281526006850160205260409020546001600160a01b0316331461227157336117d5565b5f82815260068501602052604090205460a08201516122a091600160b01b90046001600160401b0316906152df565b6001600160401b03164210156122d45760405163fb6ce63f60e01b81526001600160401b03421660048201526024016108bc565b6002815160058111156122e9576122e9614d6c565b0361240b576002840154608084015161230b916001600160401b0316906152df565b6001600160401b031642101561233f5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016108bc565b87156123515761234f82886125aa565b505b5f8981526007850160205260409020805460ff191660031790556060830151608082015161238a918491612385919061564c565b61355d565b505f8a8152600786016020526040812060020180546001600160401b03909316600160c01b026001600160c01b03909316929092179091556123cd84888c613734565b9050828a7f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5760405160405180910390a3151594506124639350505050565b60048151600581111561242057612420614d6c565b036124475761243083878b613734565b5061243a89612f15565b6001945050505050612463565b805160405163170cc93360e21b81526108bc9190600401614efe565b949350505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156124cf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124f6919081019061566c565b915091508061251857604051636b2f19e960e01b815260040160405180910390fd5b81511561253e578151604051636ba589a560e01b815260048101919091526024016108bc565b60208201516001600160a01b03161561257a576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016108bc565b5092915050565b5f8061258b612849565b5f938452600601602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156125f5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261261c919081019061566c565b915091508061263e57604051636b2f19e960e01b815260040160405180910390fd5b5f612647612849565b6005810154845191925014612675578251604051636ba589a560e01b815260048101919091526024016108bc565b60208301516001600160a01b0316156126b1576020830151604051624de75d60e31b81526001600160a01b0390911660048201526024016108bc565b60208301516001600160a01b0316156126ed576020830151604051624de75d60e31b81526001600160a01b0390911660048201526024016108bc565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b815260040161272a9190615038565b6040805180830381865af4158015612744573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061276891906156fc565b9150915081881461278f5760405163089938b360e11b8152600481018990526024016108bc565b5f8881526006840160205260409020600101546001600160401b039081169082161115612820575f888152600684016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261283e565b505f8781526006830160205260409020600101546001600160401b03165b979650505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f80612877612849565b90505f61288387613922565b905061288e87612581565b61289d57600192505050612463565b5f8781526006830160205260409020546001600160a01b031633146128c257336117d5565b5f87815260068301602052604090205460a08201516128f191600160b01b90046001600160401b0316906152df565b6001600160401b03168160c001516001600160401b031610156129385760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016108bc565b5f86156129505761294988876125aa565b905061296e565b505f8781526006830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f90612993906114f1565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156129fc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a20919061504a565b90506001600160a01b038616612a4c575f8981526006850160205260409020546001600160a01b031695505b5f898152600a8501602052604081208054839290612a6b90849061571f565b90915550505f898152600b909401602052604090932080546001600160a01b0387166001600160a01b0319909116179055505015159050949350505050565b5f80516020615b23833981519152805460011901612adb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612aea614ad5565b5f80516020615ae38339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f612b1d8861246b565b604001516040518263ffffffff1660e01b8152600401612b3d9190615038565b6040805180830381865af4158015612b57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b7b9190615590565b915091508015612ba257604051632d07135360e01b815281151560048201526024016108bc565b5f82815260058085016020526040808320815160e08101909252805491929091839160ff90911690811115612bd957612bd9614d6c565b6005811115612bea57612bea614d6c565b8152602001600182018054612bfe90614ecc565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2a90614ecc565b8015612c755780601f10612c4c57610100808354040283529160200191612c75565b820191905f5260205f20905b815481529060010190602001808311612c5857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612ce057612ce0614d6c565b14158015612d015750600181516005811115612cfe57612cfe614d6c565b14155b15612d2257805160405163170cc93360e21b81526108bc9190600401614efe565b600381516005811115612d3757612d37614d6c565b03612d455760048152612d4a565b600581525b836006018160200151604051612d6091906151bb565b90815260408051602092819003830190205f90819055858152600587810190935220825181548493839160ff1916906001908490811115612da357612da3614d6c565b021790555060208201516001820190612dbc9082615210565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612e6257612e62614d6c565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f612ea2612849565b5f838152600a82016020526040812080549190559091506109bf8482613c07565b6117736001600160a01b03831682613c65565b60015f80516020615b2383398151915255565b612ef58484848461286d565b6109bf57604051635bff683f60e11b8152600481018590526024016108bc565b5f612f1e612849565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115612f5757612f57614d6c565b6003811115612f6857612f68614d6c565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612fdc613cf8565b602001518260800151612fef91906152df565b6001600160401b03164210156130235760405163fb6ce63f60e01b81526001600160401b03421660048201526024016108bc565b5f848152600784016020908152604080832080546001600160a81b03191681556001810184905560020183905560098601909152902080546001600160a01b031981169091556001600160a01b03168061307e575060208201515b5f8061308b838886613d59565b915091506130a485602001516111f987606001516114f1565b6040805183815260208101839052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f806130f4612849565b600281015490915061ffff600160401b9091048116908616108061311d575061271061ffff8616115b1561314157604051635f12e6c360e11b815261ffff861660048201526024016108bc565b60028101546001600160401b03908116908516101561317d576040516202a06d60e11b81526001600160401b03851660048201526024016108bc565b805483108061318f5750806001015483115b156131b05760405163222d164360e21b8152600481018490526024016108bc565b825f6131bb826110d8565b90505f6131c88983613e06565b5f818152600686016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600b9096019095529790932080546001600160a01b031916909617909555509395945050505050565b5f80613269612849565b90505f613275846110d8565b90505f61328187611eb8565b905061328c87612581565b6132ac576040516330efa98b60e01b8152600481018890526024016108bc565b6002815160058111156132c1576132c1614d6c565b146132e257805160405163170cc93360e21b81526108bc9190600401614efe565b5f8282608001516132f391906152df565b6002850154604084015191925061331591600160501b90910460ff1690615321565b6001600160401b0316816001600160401b0316111561335257604051636d51fe0560e11b81526001600160401b03821660048201526024016108bc565b5f8061335e8a8461355d565b915091505f8a8360405160200161338c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260078b019093529120805491925060019160ff1916828002179055505f8181526007880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a2234269060800160405180910390a49a9950505050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166134e157604051631afcd79f60e31b815260040160405180910390fd5b565b6134eb613498565b6134f481614378565b6134fc614391565b61121a6060820135608083013561351960c0850160a08601614cb1565b61352960e0860160c08701615732565b61353a610100870160e0880161574b565b61010087013561355261014089016101208a01615061565b8861014001356143a1565b5f8281525f80516020615b03833981519152602052604081206002015481905f80516020615ae383398151915290600160801b90046001600160401b03166135a5858261455e565b5f6135af876147c8565b5f888152600585016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af4158015613658573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261367f9190810190615007565b6040518263ffffffff1660e01b815260040161369b9190615038565b6020604051808303815f875af11580156136b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136db919061504a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8061373e612849565b90505f61374e8660400151611eb8565b90505f60038251600581111561376657613766614d6c565b1480613784575060048251600581111561378257613782614d6c565b145b15613794575060c08101516137d1565b6002825160058111156137a9576137a9614d6c565b036137b55750426137d1565b815160405163170cc93360e21b81526108bc9190600401614efe565b86608001516001600160401b0316816001600160401b0316116137f9575f9350505050611aeb565b600483015460608801515f916001600160a01b031690634f22429f9061381e906114f1565b60a086015160808c01516040808e01515f90815260068b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa15801561389f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138c3919061504a565b90506001600160a01b0387166138db57876020015196505b5f8681526008850160209081526040808320849055600990960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b61392a614ad5565b5f8281525f80516020615b038339815191526020526040808220815160e0810190925280545f80516020615ae383398151915293929190829060ff16600581111561397757613977614d6c565b600581111561398857613988614d6c565b815260200160018201805461399c90614ecc565b80601f01602080910402602001604051908101604052809291908181526020018280546139c890614ecc565b8015613a135780601f106139ea57610100808354040283529160200191613a13565b820191905f5260205f20905b8154815290600101906020018083116139f657829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613a8157613a81614d6c565b14613ab4575f8481526005830160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614efe565b60038152426001600160401b031660c08201525f84815260058381016020526040909120825181548493839160ff1916906001908490811115613af957613af9614d6c565b021790555060208201516001820190613b129082615210565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613bb0858261355d565b6080840151604080516001600160401b03909216825242602083015291935083925087917ffbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42910160405180910390a3509392505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015613c53575f80fd5b505af115801561134d573d5f803e3d5ffd5b80471015613c885760405163cd78605960e01b81523060048201526024016108bc565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613cd1576040519150601f19603f3d011682016040523d82523d5f602084013e613cd6565b606091505b505090508061073057604051630a12f52160e11b815260040160405180910390fd5b604080516060810182525f80825260208201819052918101829052905f80516020615ae383398151915260408051606081018252825481526001909201546001600160401b0381166020840152600160401b900460ff169082015292915050565b5f805f613d64612849565b5f86815260088201602052604081208054908290559192509081908015613df8575f87815260068501602052604090205461271090613dae90600160a01b900461ffff1683615579565b613db8919061550b565b91508184600a015f8981526020019081526020015f205f828254613ddc919061571f565b90915550613dec9050828261576b565b9250613df88984613c07565b509097909650945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f9060ff16613e4a57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615ae383398151915242613e696060860160408701614cb1565b6001600160401b0316111580613ea35750613e876202a3004261571f565b613e976060860160408701614cb1565b6001600160401b031610155b15613edd57613eb86060850160408601614cb1565b604051635879da1360e11b81526001600160401b0390911660048201526024016108bc565b60038101546001600160401b0390613f0090600160401b9004821685831661571f565b1115613f2a57604051633e1a785160e01b81526001600160401b03841660048201526024016108bc565b613f3f613f3a606086018661577e565b61483d565b613f4f613f3a608086018661577e565b6030613f5e6020860186615792565b905014613f9057613f726020850185615792565b6040516326475b2f60e11b81526108bc925060040190815260200190565b613f9a8480615792565b90505f03613fc757613fac8480615792565b604051633e08a12560e11b81526004016108bc9291906157d4565b5f60068201613fd68680615792565b604051613fe492919061563d565b9081526020016040518091039020541461401d576140028480615792565b60405163a41f772f60e01b81526004016108bc9291906157d4565b614027835f61455e565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce5190602081016140648a80615792565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906140ac908b018b615792565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016140f560608b0160408c01614cb1565b6001600160401b0316815260200161411060608b018b61577e565b614119906157e7565b815260200161412b60808b018b61577e565b614134906157e7565b8152602001886001600160401b03168152506040518263ffffffff1660e01b81526004016141629190615914565b5f60405180830381865af415801561417c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526141a391908101906159cb565b5f828152600486016020526040902091935091506141c18282615210565b5081600684016141d18880615792565b6040516141df92919061563d565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061421b908590600401615038565b6020604051808303815f875af1158015614237573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061425b919061504a565b5f8481526005860160205260409020805460ff1916600117905590506142818780615792565b5f85815260058701602052604090206001019161429f919083615a0e565b505f83815260058501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff19169055806142fe8880615792565b60405161430c92919061563d565b6040518091039020847fd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49898b604001602081019061434a9190614cb1565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614380613498565b6143886149a6565b61121a816149ae565b614399613498565b6134e1614a96565b6143a9613498565b5f6143b2612849565b905061ffff861615806143ca575061271061ffff8716115b156143ee57604051635f12e6c360e11b815261ffff871660048201526024016108bc565b878911156144125760405163222d164360e21b8152600481018a90526024016108bc565b60ff851615806144255750600a60ff8616115b156144485760405163170db35960e31b815260ff861660048201526024016108bc565b614450613cf8565b602001516001600160401b0316876001600160401b03161015614490576040516202a06d60e11b81526001600160401b03881660048201526024016108bc565b835f036144b05760405163a733007160e01b815260040160405180910390fd5b816144d157604051632f6bd1db60e01b8152600481018390526024016108bc565b978855600188019690965560028701805460ff909416600160501b0260ff60501b1961ffff909616600160401b0269ffffffffffffffffffff199095166001600160401b0390971696909617939093179390931693909317905560038401919091556004830180546001600160a01b039092166001600160a01b0319909216919091179055600590910155565b5f80516020615ae38339815191525f6001600160401b0380841690851611156145925761458b838561564c565b905061459f565b61459c848461564c565b90505b60408051608081018252600284015480825260038501546001600160401b038082166020850152600160401b8204811694840194909452600160801b900490921660608201524291158061460c575060018401548151614608916001600160401b03169061571f565b8210155b15614634576001600160401b0380841660608301528282526040820151166020820152614653565b828160600181815161464691906152df565b6001600160401b03169052505b6060810151614663906064615321565b602082015160018601546001600160401b03929092169161468e9190600160401b900460ff16615321565b6001600160401b031610156146c757606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016108bc565b85816040018181516146d991906152df565b6001600160401b03169052506040810180518691906146f990839061564c565b6001600160401b03169052506001840154604082015160649161472791600160401b90910460ff1690615321565b6001600160401b03161015614760576040808201519051633e1a785160e01b81526001600160401b0390911660048201526024016108bc565b8051600285015560208101516003909401805460408301516060909301516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b0319909316919097161717919091169390931790925550505050565b5f8181525f80516020615b038339815191526020526040812060020180545f80516020615ae3833981519152919060089061481290600160401b90046001600160401b0316615ac7565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61484a6020820182614c84565b63ffffffff1615801561486a5750614865602082018261507c565b151590505b156148b15761487c6020820182614c84565b614889602083018361507c565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016108bc565b6148be602082018261507c565b90506148cd6020830183614c84565b63ffffffff1611156148e65761487c6020820182614c84565b60015b6148f6602083018361507c565b90508110156117735761490c602083018361507c565b61491760018461576b565b818110614926576149266150c1565b905060200201602081019061493b9190615061565b6001600160a01b0316614951602084018461507c565b83818110614961576149616150c1565b90506020020160208101906149769190615061565b6001600160a01b0316101561499e57604051630dbc8d5f60e31b815260040160405180910390fd5b6001016148e9565b6134e1613498565b6149b6613498565b80355f80516020615ae383398151915290815560146149db606084016040850161574b565b60ff1611806149fa57506149f5606083016040840161574b565b60ff16155b15614a2e57614a0f606083016040840161574b565b604051634a59bbff60e11b815260ff90911660048201526024016108bc565b614a3e606083016040840161574b565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614a6f6040830160208401614cb1565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ed6613498565b508054614aaa90614ecc565b5f825580601f10614ab9575050565b601f0160209004905f5260205f209081019061121a9190614b12565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614b26575f8155600101614b13565b5090565b801515811461121a575f80fd5b803563ffffffff81168114611eb3575f80fd5b5f805f60608486031215614b5c575f80fd5b833592506020840135614b6e81614b2a565b9150614b7c60408501614b37565b90509250925092565b5f60208284031215614b95575f80fd5b5035919050565b5f6101608284031215614bad575f80fd5b50919050565b5f8060408385031215614bc4575f80fd5b82356001600160401b03811115614bd9575f80fd5b830160808186031215614bea575f80fd5b9150614bf860208401614b37565b90509250929050565b5f8060408385031215614c12575f80fd5b82359150614bf860208401614b37565b6001600160a01b038116811461121a575f80fd5b5f805f8060808587031215614c49575f80fd5b843593506020850135614c5b81614b2a565b9250614c6960408601614b37565b91506060850135614c7981614c22565b939692955090935050565b5f60208284031215614c94575f80fd5b611aeb82614b37565b6001600160401b038116811461121a575f80fd5b5f60208284031215614cc1575f80fd5b8135611aeb81614c9d565b5f8060408385031215614cdd575f80fd5b823591506020830135614cef81614c22565b809150509250929050565b803561ffff81168114611eb3575f80fd5b5f805f60608486031215614d1d575f80fd5b83356001600160401b03811115614d32575f80fd5b840160a08187031215614d43575f80fd5b9250614d5160208501614cfa565b91506040840135614d6181614c9d565b809150509250925092565b634e487b7160e01b5f52602160045260245ffd5b60068110614d9057614d90614d6c565b9052565b5f5b83811015614dae578181015183820152602001614d96565b50505f910152565b5f8151808452614dcd816020860160208601614d94565b601f01601f19169290920160200192915050565b60208152614df3602082018351614d80565b5f602083015160e06040840152614e0e610100840182614db6565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215614e72575f80fd5b82356001600160401b0380821115614e88575f80fd5b818501915085601f830112614e9b575f80fd5b813581811115614ea9575f80fd5b866020828501011115614eba575f80fd5b60209290920196919550909350505050565b600181811c90821680614ee057607f821691505b602082108103614bad57634e487b7160e01b5f52602260045260245ffd5b602081016111268284614d80565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f4257614f42614f0c565b60405290565b604080519081016001600160401b0381118282101715614f4257614f42614f0c565b604051601f8201601f191681016001600160401b0381118282101715614f9257614f92614f0c565b604052919050565b5f6001600160401b03821115614fb257614fb2614f0c565b50601f01601f191660200190565b5f82601f830112614fcf575f80fd5b8151614fe2614fdd82614f9a565b614f6a565b818152846020838601011115614ff6575f80fd5b612463826020830160208701614d94565b5f60208284031215615017575f80fd5b81516001600160401b0381111561502c575f80fd5b61246384828501614fc0565b602081525f611aeb6020830184614db6565b5f6020828403121561505a575f80fd5b5051919050565b5f60208284031215615071575f80fd5b8135611aeb81614c22565b5f808335601e19843603018112615091575f80fd5b8301803591506001600160401b038211156150aa575f80fd5b6020019150600581901b360382131561372d575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126150e9575f80fd5b9190910192915050565b5f82601f830112615102575f80fd5b8135615110614fdd82614f9a565b818152846020838601011115615124575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615150575f80fd5b615158614f20565b82356001600160401b038082111561516e575f80fd5b61517a368387016150f3565b8352602085013591508082111561518f575f80fd5b5061519c368286016150f3565b60208301525060408301356151b081614c9d565b604082015292915050565b5f82516150e9818460208701614d94565b601f82111561073057805f5260205f20601f840160051c810160208510156151f15750805b601f840160051c820191505b81811015611138575f81556001016151fd565b81516001600160401b0381111561522957615229614f0c565b61523d816152378454614ecc565b846151cc565b602080601f831160018114615270575f84156152595750858301515b5f19600386901b1c1916600185901b17855561134d565b5f85815260208120601f198616915b8281101561529e5788860151825594840194600190910190840161527f565b50858210156152bb57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111561257a5761257a6152cb565b5f63ffffffff808316818103615317576153176152cb565b6001019392505050565b6001600160401b03818116838216028082169190828114615344576153446152cb565b505092915050565b5f808335601e19843603018112615361575f80fd5b83016020810192503590506001600160401b0381111561537f575f80fd5b80360382131561372d575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b8781101561546a57848303601f19018952813536889003605e190181126153f1575f80fd5b870160606153ff828061534c565b82875261540f838801828461538d565b9250505061541f8683018361534c565b8683038888015261543183828461538d565b92505050604080830135925061544683614c9d565b6001600160401b0392909216949091019390935297830197908301906001016153cc565b5090979650505050505050565b6020815281356020820152602082013560408201525f604083013561549b81614c22565b6001600160a01b031660608381019190915283013536849003601e190181126154c2575f80fd5b83016020810190356001600160401b038111156154dd575f80fd5b8060051b36038213156154ee575f80fd5b60808085015261550260a0850182846153b5565b95945050505050565b5f8261552557634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061553e5761553e614d6c565b91905290565b5f805f60608486031215615556575f80fd5b83519250602084015161556881614c9d565b6040850151909250614d6181614c9d565b8082028115828204841417611126576111266152cb565b5f80604083850312156155a1575f80fd5b825191506020830151614cef81614b2a565b5f60208083525f84546155c581614ecc565b806020870152604060018084165f81146155e657600181146156025761562f565b60ff19851660408a0152604084151560051b8a0101955061562f565b895f5260205f205f5b858110156156265781548b820186015290830190880161560b565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0382811682821603908082111561257a5761257a6152cb565b5f806040838503121561567d575f80fd5b82516001600160401b0380821115615693575f80fd5b90840190606082870312156156a6575f80fd5b6156ae614f20565b8251815260208301516156c081614c22565b60208201526040830151828111156156d6575f80fd5b6156e288828601614fc0565b6040830152508094505050506020830151614cef81614b2a565b5f806040838503121561570d575f80fd5b825191506020830151614cef81614c9d565b80820180821115611126576111266152cb565b5f60208284031215615742575f80fd5b611aeb82614cfa565b5f6020828403121561575b575f80fd5b813560ff81168114611aeb575f80fd5b81810381811115611126576111266152cb565b5f8235603e198336030181126150e9575f80fd5b5f808335601e198436030181126157a7575f80fd5b8301803591506001600160401b038211156157c0575f80fd5b60200191503681900382131561372d575f80fd5b602081525f61246360208301848661538d565b5f604082360312156157f7575f80fd5b6157ff614f48565b61580883614b37565b81526020808401356001600160401b0380821115615824575f80fd5b9085019036601f830112615836575f80fd5b81358181111561584857615848614f0c565b8060051b9150615859848301614f6a565b8181529183018401918481019036841115615872575f80fd5b938501935b8385101561589c578435925061588c83614c22565b8282529385019390850190615877565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b808310156159095784516001600160a01b031682529383019360019290920191908301906158e0565b509695505050505050565b60208152815160208201525f602083015160e0604084015261593a610100840182614db6565b90506040840151601f19808584030160608601526159588383614db6565b92506001600160401b03606087015116608086015260808601519150808584030160a086015261598883836158ae565b925060a08601519150808584030160c0860152506159a682826158ae565b91505060c08401516159c360e08501826001600160401b03169052565b509392505050565b5f80604083850312156159dc575f80fd5b8251915060208301516001600160401b038111156159f8575f80fd5b615a0485828601614fc0565b9150509250929050565b6001600160401b03831115615a2557615a25614f0c565b615a3983615a338354614ecc565b836151cc565b5f601f841160018114615a6a575f8515615a535750838201355b5f19600387901b1c1916600186901b178355611138565b5f83815260208120601f198716915b82811015615a995786850135825560209485019460019092019101615a79565b5086821015615ab5575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f6001600160401b03808316818103615317576153176152cb56fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb059b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220413c4e05aeedabd68ce0d1fe5d361a957d76839f0063156be130f1ff43e2ed2d64736f6c63430008190033", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -3123,8 +3123,8 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValida // ValidatorMessagesMetaData contains all meta data concerning the ValidatorMessages contract. var ValidatorMessagesMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"InvalidBLSPublicKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"}],\"name\":\"InvalidCodecID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"actual\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"}],\"name\":\"InvalidMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageType\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"}],\"name\":\"packConversionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"valid\",\"type\":\"bool\"}],\"name\":\"packL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"packL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"validationPeriod\",\"type\":\"tuple\"}],\"name\":\"packRegisterL1ValidatorMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"conversionID\",\"type\":\"bytes32\"}],\"name\":\"packSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"packValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackRegisterL1ValidatorMessage\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x61217b610034600b8282823980515f1a607314602857634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100b1575f3560e01c8063854a893f11610079578063854a893f146101b257806387418b8e1461020f5780639b83546514610222578063a699c13514610242578063e1d68f3014610255578063eb97ce5114610268575f80fd5b8063021de88f146100b5578063088c2463146100e25780634d8478841461011257806350782b0f146101335780637f7c427a1461016b575b5f80fd5b6100c86100c33660046118a9565b610289565b604080519283529015156020830152015b60405180910390f35b6100f56100f03660046118a9565b61044a565b604080519283526001600160401b039091166020830152016100d9565b6101256101203660046118a9565b61063b565b6040519081526020016100d9565b6101466101413660046118a9565b6107c8565b604080519384526001600160401b0392831660208501529116908201526060016100d9565b6101a56101793660046118e2565b604080515f60208201819052602282015260268082019390935281518082039093018352604601905290565b6040516100d99190611946565b6101a56101c036600461197a565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6101a561021d3660046119eb565b610a1e565b6102356102303660046118a9565b610b60565b6040516100d99190611bb4565b6101a5610250366004611c6b565b6114ab565b6101a5610263366004611c9d565b6114ef565b61027b610276366004611d80565b611525565b6040516100d9929190611e7c565b5f8082516027146102c457825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044015b60405180910390fd5b5f805b6002811015610313576102db816001611ea8565b6102e6906008611ebb565b61ffff168582815181106102fc576102fc611ed2565b016020015160f81c901b91909117906001016102c7565b5061ffff81161561033d5760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561039857610354816003611ea8565b61035f906008611ebb565b63ffffffff1686610371836002611ee6565b8151811061038157610381611ed2565b016020015160f81c901b9190911790600101610340565b5063ffffffff81166002146103c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015610415576103d781601f611ea8565b6103e2906008611ebb565b876103ee836006611ee6565b815181106103fe576103fe611ed2565b016020015160f81c901b91909117906001016103c3565b505f8660268151811061042a5761042a611ed2565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461048057825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016102bb565b5f805b60028110156104cf57610497816001611ea8565b6104a2906008611ebb565b61ffff168582815181106104b8576104b8611ed2565b016020015160f81c901b9190911790600101610483565b5061ffff8116156104f95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561055457610510816003611ea8565b61051b906008611ebb565b63ffffffff168661052d836002611ee6565b8151811061053d5761053d611ed2565b016020015160f81c901b91909117906001016104fc565b5063ffffffff81161561057a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156105cf5761059181601f611ea8565b61059c906008611ebb565b876105a8836006611ee6565b815181106105b8576105b8611ed2565b016020015160f81c901b919091179060010161057d565b505f805b600881101561062e576105e7816007611ea8565b6105f2906008611ebb565b6001600160401b031688610607836026611ee6565b8151811061061757610617611ed2565b016020015160f81c901b91909117906001016105d3565b5090969095509350505050565b5f815160261461067057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016102bb565b5f805b60028110156106bf57610687816001611ea8565b610692906008611ebb565b61ffff168482815181106106a8576106a8611ed2565b016020015160f81c901b9190911790600101610673565b5061ffff8116156106e95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561074457610700816003611ea8565b61070b906008611ebb565b63ffffffff168561071d836002611ee6565b8151811061072d5761072d611ed2565b016020015160f81c901b91909117906001016106ec565b5063ffffffff81161561076a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156107bf5761078181601f611ea8565b61078c906008611ebb565b86610798836006611ee6565b815181106107a8576107a8611ed2565b016020015160f81c901b919091179060010161076d565b50949350505050565b5f805f83516036146107ff57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016102bb565b5f805b600281101561084e57610816816001611ea8565b610821906008611ebb565b61ffff1686828151811061083757610837611ed2565b016020015160f81c901b9190911790600101610802565b5061ffff8116156108785760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b60048110156108d35761088f816003611ea8565b61089a906008611ebb565b63ffffffff16876108ac836002611ee6565b815181106108bc576108bc611ed2565b016020015160f81c901b919091179060010161087b565b5063ffffffff81166003146108fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156109505761091281601f611ea8565b61091d906008611ebb565b88610929836006611ee6565b8151811061093957610939611ed2565b016020015160f81c901b91909117906001016108fe565b505f805b60088110156109af57610968816007611ea8565b610973906008611ebb565b6001600160401b031689610988836026611ee6565b8151811061099857610998611ed2565b016020015160f81c901b9190911790600101610954565b505f805b6008811015610a0e576109c7816007611ea8565b6109d2906008611ebb565b6001600160401b03168a6109e783602e611ee6565b815181106109f7576109f7611ed2565b016020015160f81c901b91909117906001016109b3565b5091989097509095509350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b836060015151811015610b59578184606001518281518110610aba57610aba611ed2565b60200260200101515f01515185606001518381518110610adc57610adc611ed2565b60200260200101515f015186606001518481518110610afd57610afd611ed2565b60200260200101516020015187606001518581518110610b1f57610b1f611ed2565b602002602001015160400151604051602001610b3f959493929190611ef9565b60408051601f198184030181529190529150600101610a96565b5092915050565b610b68611712565b5f610b71611712565b5f805b6002811015610bcf57610b88816001611ea8565b610b93906008611ebb565b61ffff1686610ba863ffffffff871684611ee6565b81518110610bb857610bb8611ed2565b016020015160f81c901b9190911790600101610b74565b5061ffff811615610bf95760405163407b587360e01b815261ffff821660048201526024016102bb565b610c04600284611f72565b9250505f805b6004811015610c6957610c1e816003611ea8565b610c29906008611ebb565b63ffffffff16868563ffffffff1683610c429190611ee6565b81518110610c5257610c52611ed2565b016020015160f81c901b9190911790600101610c0a565b5063ffffffff8116600114610c9157604051635b60892f60e01b815260040160405180910390fd5b610c9c600484611f72565b9250505f805b6020811015610cf957610cb681601f611ea8565b610cc1906008611ebb565b86610cd263ffffffff871684611ee6565b81518110610ce257610ce2611ed2565b016020015160f81c901b9190911790600101610ca2565b50808252610d08602084611f72565b9250505f805b6004811015610d6d57610d22816003611ea8565b610d2d906008611ebb565b63ffffffff16868563ffffffff1683610d469190611ee6565b81518110610d5657610d56611ed2565b016020015160f81c901b9190911790600101610d0e565b50610d79600484611f72565b92505f8163ffffffff166001600160401b03811115610d9a57610d9a61176c565b6040519080825280601f01601f191660200182016040528015610dc4576020820181803683370190505b5090505f5b8263ffffffff16811015610e335786610de863ffffffff871683611ee6565b81518110610df857610df8611ed2565b602001015160f81c60f81b828281518110610e1557610e15611ed2565b60200101906001600160f81b03191690815f1a905350600101610dc9565b5060208301819052610e458285611f72565b604080516030808252606082019092529195505f92506020820181803683370190505090505f5b6030811015610ed15786610e8663ffffffff871683611ee6565b81518110610e9657610e96611ed2565b602001015160f81c60f81b828281518110610eb357610eb3611ed2565b60200101906001600160f81b03191690815f1a905350600101610e6c565b5060408301819052610ee4603085611f72565b9350505f805b6008811015610f4a57610efe816007611ea8565b610f09906008611ebb565b6001600160401b031687610f2363ffffffff881684611ee6565b81518110610f3357610f33611ed2565b016020015160f81c901b9190911790600101610eea565b506001600160401b0381166060840152610f65600885611f72565b9350505f805f5b6004811015610fcb57610f80816003611ea8565b610f8b906008611ebb565b63ffffffff16888763ffffffff1683610fa49190611ee6565b81518110610fb457610fb4611ed2565b016020015160f81c901b9190911790600101610f6c565b50610fd7600486611f72565b94505f5b600481101561103a57610fef816003611ea8565b610ffa906008611ebb565b63ffffffff16888763ffffffff16836110139190611ee6565b8151811061102357611023611ed2565b016020015160f81c901b9290921791600101610fdb565b50611046600486611f72565b94505f8263ffffffff166001600160401b038111156110675761106761176c565b604051908082528060200260200182016040528015611090578160200160208202803683370190505b5090505f5b8363ffffffff16811015611178576040805160148082528183019092525f916020820181803683370190505090505f5b601481101561112a578a6110df63ffffffff8b1683611ee6565b815181106110ef576110ef611ed2565b602001015160f81c60f81b82828151811061110c5761110c611ed2565b60200101906001600160f81b03191690815f1a9053506001016110c5565b505f601482015190508084848151811061114657611146611ed2565b6001600160a01b039092166020928302919091019091015261116960148a611f72565b98505050806001019050611095565b506040805180820190915263ffffffff9092168252602082015260808401525f80805b60048110156111fa576111af816003611ea8565b6111ba906008611ebb565b63ffffffff16898863ffffffff16836111d39190611ee6565b815181106111e3576111e3611ed2565b016020015160f81c901b919091179060010161119b565b50611206600487611f72565b95505f5b60048110156112695761121e816003611ea8565b611229906008611ebb565b63ffffffff16898863ffffffff16836112429190611ee6565b8151811061125257611252611ed2565b016020015160f81c901b929092179160010161120a565b50611275600487611f72565b95505f8263ffffffff166001600160401b038111156112965761129661176c565b6040519080825280602002602001820160405280156112bf578160200160208202803683370190505b5090505f5b8363ffffffff168110156113a7576040805160148082528183019092525f916020820181803683370190505090505f5b6014811015611359578b61130e63ffffffff8c1683611ee6565b8151811061131e5761131e611ed2565b602001015160f81c60f81b82828151811061133b5761133b611ed2565b60200101906001600160f81b03191690815f1a9053506001016112f4565b505f601482015190508084848151811061137557611375611ed2565b6001600160a01b039092166020928302919091019091015261139860148b611f72565b995050508060010190506112c4565b506040805180820190915263ffffffff9092168252602082015260a08501525f6113d18284611f72565b6113dc906014611f8f565b6113e785607a611f72565b6113f19190611f72565b90508063ffffffff1688511461142d57875160405163cc92daa160e01b815263ffffffff918216600482015290821660248201526044016102bb565b5f805b600881101561149057611444816007611ea8565b61144f906008611ebb565b6001600160401b03168a61146963ffffffff8b1684611ee6565b8151811061147957611479611ed2565b016020015160f81c901b9190911790600101611430565b506001600160401b031660c086015250929695505050505050565b6040515f6020820152600160e11b60228201526026810183905281151560f81b60468201526060906047015b60405160208183030381529060405290505b92915050565b6040515f602082018190526022820152602681018390526001600160c01b031960c083901b166046820152606090604e016114d7565b5f606082604001515160301461154e5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861158f988a986001989297929690959094909390929101611fb7565b60405160208183030381529060405290505f5b84608001516020015151811015611601578185608001516020015182815181106115ce576115ce611ed2565b60200260200101516040516020016115e7929190612071565b60408051601f1981840301815291905291506001016115a2565b5060a08401518051602091820151516040516116219385939291016120a7565b60405160208183030381529060405290505f5b8460a00151602001515181101561169357818560a0015160200151828151811061166057611660611ed2565b6020026020010151604051602001611679929190612071565b60408051601f198184030181529190529150600101611634565b5060c08401516040516116aa9183916020016120e2565b60405160208183030381529060405290506002816040516116cb9190612113565b602060405180830381855afa1580156116e6573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611709919061212e565b94909350915050565b6040805160e0810182525f808252606060208084018290528385018290528184018390528451808601865283815280820183905260808501528451808601909552918452908301529060a082019081525f60209091015290565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156117a2576117a261176c565b60405290565b604051606081016001600160401b03811182821017156117a2576117a261176c565b604080519081016001600160401b03811182821017156117a2576117a261176c565b60405160e081016001600160401b03811182821017156117a2576117a261176c565b604051601f8201601f191681016001600160401b03811182821017156118365761183661176c565b604052919050565b5f82601f83011261184d575f80fd5b81356001600160401b038111156118665761186661176c565b611879601f8201601f191660200161180e565b81815284602083860101111561188d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156118b9575f80fd5b81356001600160401b038111156118ce575f80fd5b6118da8482850161183e565b949350505050565b5f602082840312156118f2575f80fd5b5035919050565b5f5b838110156119135781810151838201526020016118fb565b50505f910152565b5f81518084526119328160208601602086016118f9565b601f01601f19169290920160200192915050565b602081525f611958602083018461191b565b9392505050565b80356001600160401b0381168114611975575f80fd5b919050565b5f805f6060848603121561198c575f80fd5b8335925061199c6020850161195f565b91506119aa6040850161195f565b90509250925092565b80356001600160a01b0381168114611975575f80fd5b5f6001600160401b038211156119e1576119e161176c565b5060051b60200190565b5f60208083850312156119fc575f80fd5b82356001600160401b0380821115611a12575f80fd5b9084019060808287031215611a25575f80fd5b611a2d611780565b823581528383013584820152611a45604084016119b3565b604082015260608084013583811115611a5c575f80fd5b80850194505087601f850112611a70575f80fd5b8335611a83611a7e826119c9565b61180e565b81815260059190911b8501860190868101908a831115611aa1575f80fd5b8787015b83811015611b3a57803587811115611abb575f80fd5b8801808d03601f1901861315611acf575f80fd5b611ad76117a8565b8a82013589811115611ae7575f80fd5b611af58f8d8386010161183e565b825250604082013589811115611b09575f80fd5b611b178f8d8386010161183e565b8c83015250611b2787830161195f565b6040820152845250918801918801611aa5565b506060850152509198975050505050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015611ba95784516001600160a01b03168252938301936001929092019190830190611b80565b509695505050505050565b60208152815160208201525f602083015160e06040840152611bda61010084018261191b565b90506040840151601f1980858403016060860152611bf8838361191b565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152611c288383611b4e565b925060a08601519150808584030160c086015250611c468282611b4e565b91505060c0840151611c6360e08501826001600160401b03169052565b509392505050565b5f8060408385031215611c7c575f80fd5b8235915060208301358015158114611c92575f80fd5b809150509250929050565b5f8060408385031215611cae575f80fd5b82359150611cbe6020840161195f565b90509250929050565b5f60408284031215611cd7575f80fd5b611cdf6117ca565b9050813563ffffffff81168114611cf4575f80fd5b81526020828101356001600160401b03811115611d0f575f80fd5b8301601f81018513611d1f575f80fd5b8035611d2d611a7e826119c9565b81815260059190911b82018301908381019087831115611d4b575f80fd5b928401925b82841015611d7057611d61846119b3565b82529284019290840190611d50565b8085870152505050505092915050565b5f60208284031215611d90575f80fd5b81356001600160401b0380821115611da6575f80fd5b9083019060e08286031215611db9575f80fd5b611dc16117ec565b82358152602083013582811115611dd6575f80fd5b611de28782860161183e565b602083015250604083013582811115611df9575f80fd5b611e058782860161183e565b604083015250611e176060840161195f565b6060820152608083013582811115611e2d575f80fd5b611e3987828601611cc7565b60808301525060a083013582811115611e50575f80fd5b611e5c87828601611cc7565b60a083015250611e6e60c0840161195f565b60c082015295945050505050565b828152604060208201525f6118da604083018461191b565b634e487b7160e01b5f52601160045260245ffd5b818103818111156114e9576114e9611e94565b80820281158282048414176114e9576114e9611e94565b634e487b7160e01b5f52603260045260245ffd5b808201808211156114e9576114e9611e94565b5f8651611f0a818460208b016118f9565b60e087901b6001600160e01b0319169083019081528551611f32816004840160208a016118f9565b8551910190611f488160048401602089016118f9565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b63ffffffff818116838216019080821115610b5957610b59611e94565b63ffffffff818116838216028082169190828114611faf57611faf611e94565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651611ffd81602a850160208b016118f9565b86519083019061201481602a840160208b016118f9565b60c087901b6001600160c01b031916602a9290910191820152612046603282018660e01b6001600160e01b0319169052565b61205f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516120828184602088016118f9565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516120b88184602089016118f9565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516120f38184602088016118f9565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f82516121248184602087016118f9565b9190910192915050565b5f6020828403121561213e575f80fd5b505191905056fea26469706673582212203eff6412f7c7baf5a74defc914c1b4770aa5110fc94bc4e80bc185b10586511764736f6c63430008190033", + ABI: "[{\"inputs\":[],\"name\":\"InvalidBLSPublicKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"}],\"name\":\"InvalidCodecID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"actual\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"}],\"name\":\"InvalidMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageType\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"}],\"name\":\"packConversionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"valid\",\"type\":\"bool\"}],\"name\":\"packL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"packL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"validationPeriod\",\"type\":\"tuple\"}],\"name\":\"packRegisterL1ValidatorMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"conversionID\",\"type\":\"bytes32\"}],\"name\":\"packSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"packValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackRegisterL1ValidatorMessage\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x61217b610034600b8282823980515f1a607314602857634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100b1575f3560e01c8063854a893f11610079578063854a893f146101b257806387418b8e1461020f5780639b83546514610222578063a699c13514610242578063e1d68f3014610255578063eb97ce5114610268575f80fd5b8063021de88f146100b5578063088c2463146100e25780634d8478841461011257806350782b0f146101335780637f7c427a1461016b575b5f80fd5b6100c86100c33660046118a9565b610289565b604080519283529015156020830152015b60405180910390f35b6100f56100f03660046118a9565b61044a565b604080519283526001600160401b039091166020830152016100d9565b6101256101203660046118a9565b61063b565b6040519081526020016100d9565b6101466101413660046118a9565b6107c8565b604080519384526001600160401b0392831660208501529116908201526060016100d9565b6101a56101793660046118e2565b604080515f60208201819052602282015260268082019390935281518082039093018352604601905290565b6040516100d99190611946565b6101a56101c036600461197a565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6101a561021d3660046119eb565b610a1e565b6102356102303660046118a9565b610b60565b6040516100d99190611bb4565b6101a5610250366004611c6b565b6114ab565b6101a5610263366004611c9d565b6114ef565b61027b610276366004611d80565b611525565b6040516100d9929190611e7c565b5f8082516027146102c457825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044015b60405180910390fd5b5f805b6002811015610313576102db816001611ea8565b6102e6906008611ebb565b61ffff168582815181106102fc576102fc611ed2565b016020015160f81c901b91909117906001016102c7565b5061ffff81161561033d5760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561039857610354816003611ea8565b61035f906008611ebb565b63ffffffff1686610371836002611ee6565b8151811061038157610381611ed2565b016020015160f81c901b9190911790600101610340565b5063ffffffff81166002146103c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015610415576103d781601f611ea8565b6103e2906008611ebb565b876103ee836006611ee6565b815181106103fe576103fe611ed2565b016020015160f81c901b91909117906001016103c3565b505f8660268151811061042a5761042a611ed2565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461048057825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016102bb565b5f805b60028110156104cf57610497816001611ea8565b6104a2906008611ebb565b61ffff168582815181106104b8576104b8611ed2565b016020015160f81c901b9190911790600101610483565b5061ffff8116156104f95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561055457610510816003611ea8565b61051b906008611ebb565b63ffffffff168661052d836002611ee6565b8151811061053d5761053d611ed2565b016020015160f81c901b91909117906001016104fc565b5063ffffffff81161561057a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156105cf5761059181601f611ea8565b61059c906008611ebb565b876105a8836006611ee6565b815181106105b8576105b8611ed2565b016020015160f81c901b919091179060010161057d565b505f805b600881101561062e576105e7816007611ea8565b6105f2906008611ebb565b6001600160401b031688610607836026611ee6565b8151811061061757610617611ed2565b016020015160f81c901b91909117906001016105d3565b5090969095509350505050565b5f815160261461067057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016102bb565b5f805b60028110156106bf57610687816001611ea8565b610692906008611ebb565b61ffff168482815181106106a8576106a8611ed2565b016020015160f81c901b9190911790600101610673565b5061ffff8116156106e95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561074457610700816003611ea8565b61070b906008611ebb565b63ffffffff168561071d836002611ee6565b8151811061072d5761072d611ed2565b016020015160f81c901b91909117906001016106ec565b5063ffffffff81161561076a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156107bf5761078181601f611ea8565b61078c906008611ebb565b86610798836006611ee6565b815181106107a8576107a8611ed2565b016020015160f81c901b919091179060010161076d565b50949350505050565b5f805f83516036146107ff57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016102bb565b5f805b600281101561084e57610816816001611ea8565b610821906008611ebb565b61ffff1686828151811061083757610837611ed2565b016020015160f81c901b9190911790600101610802565b5061ffff8116156108785760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b60048110156108d35761088f816003611ea8565b61089a906008611ebb565b63ffffffff16876108ac836002611ee6565b815181106108bc576108bc611ed2565b016020015160f81c901b919091179060010161087b565b5063ffffffff81166003146108fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156109505761091281601f611ea8565b61091d906008611ebb565b88610929836006611ee6565b8151811061093957610939611ed2565b016020015160f81c901b91909117906001016108fe565b505f805b60088110156109af57610968816007611ea8565b610973906008611ebb565b6001600160401b031689610988836026611ee6565b8151811061099857610998611ed2565b016020015160f81c901b9190911790600101610954565b505f805b6008811015610a0e576109c7816007611ea8565b6109d2906008611ebb565b6001600160401b03168a6109e783602e611ee6565b815181106109f7576109f7611ed2565b016020015160f81c901b91909117906001016109b3565b5091989097509095509350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b836060015151811015610b59578184606001518281518110610aba57610aba611ed2565b60200260200101515f01515185606001518381518110610adc57610adc611ed2565b60200260200101515f015186606001518481518110610afd57610afd611ed2565b60200260200101516020015187606001518581518110610b1f57610b1f611ed2565b602002602001015160400151604051602001610b3f959493929190611ef9565b60408051601f198184030181529190529150600101610a96565b5092915050565b610b68611712565b5f610b71611712565b5f805b6002811015610bcf57610b88816001611ea8565b610b93906008611ebb565b61ffff1686610ba863ffffffff871684611ee6565b81518110610bb857610bb8611ed2565b016020015160f81c901b9190911790600101610b74565b5061ffff811615610bf95760405163407b587360e01b815261ffff821660048201526024016102bb565b610c04600284611f72565b9250505f805b6004811015610c6957610c1e816003611ea8565b610c29906008611ebb565b63ffffffff16868563ffffffff1683610c429190611ee6565b81518110610c5257610c52611ed2565b016020015160f81c901b9190911790600101610c0a565b5063ffffffff8116600114610c9157604051635b60892f60e01b815260040160405180910390fd5b610c9c600484611f72565b9250505f805b6020811015610cf957610cb681601f611ea8565b610cc1906008611ebb565b86610cd263ffffffff871684611ee6565b81518110610ce257610ce2611ed2565b016020015160f81c901b9190911790600101610ca2565b50808252610d08602084611f72565b9250505f805b6004811015610d6d57610d22816003611ea8565b610d2d906008611ebb565b63ffffffff16868563ffffffff1683610d469190611ee6565b81518110610d5657610d56611ed2565b016020015160f81c901b9190911790600101610d0e565b50610d79600484611f72565b92505f8163ffffffff166001600160401b03811115610d9a57610d9a61176c565b6040519080825280601f01601f191660200182016040528015610dc4576020820181803683370190505b5090505f5b8263ffffffff16811015610e335786610de863ffffffff871683611ee6565b81518110610df857610df8611ed2565b602001015160f81c60f81b828281518110610e1557610e15611ed2565b60200101906001600160f81b03191690815f1a905350600101610dc9565b5060208301819052610e458285611f72565b604080516030808252606082019092529195505f92506020820181803683370190505090505f5b6030811015610ed15786610e8663ffffffff871683611ee6565b81518110610e9657610e96611ed2565b602001015160f81c60f81b828281518110610eb357610eb3611ed2565b60200101906001600160f81b03191690815f1a905350600101610e6c565b5060408301819052610ee4603085611f72565b9350505f805b6008811015610f4a57610efe816007611ea8565b610f09906008611ebb565b6001600160401b031687610f2363ffffffff881684611ee6565b81518110610f3357610f33611ed2565b016020015160f81c901b9190911790600101610eea565b506001600160401b0381166060840152610f65600885611f72565b9350505f805f5b6004811015610fcb57610f80816003611ea8565b610f8b906008611ebb565b63ffffffff16888763ffffffff1683610fa49190611ee6565b81518110610fb457610fb4611ed2565b016020015160f81c901b9190911790600101610f6c565b50610fd7600486611f72565b94505f5b600481101561103a57610fef816003611ea8565b610ffa906008611ebb565b63ffffffff16888763ffffffff16836110139190611ee6565b8151811061102357611023611ed2565b016020015160f81c901b9290921791600101610fdb565b50611046600486611f72565b94505f8263ffffffff166001600160401b038111156110675761106761176c565b604051908082528060200260200182016040528015611090578160200160208202803683370190505b5090505f5b8363ffffffff16811015611178576040805160148082528183019092525f916020820181803683370190505090505f5b601481101561112a578a6110df63ffffffff8b1683611ee6565b815181106110ef576110ef611ed2565b602001015160f81c60f81b82828151811061110c5761110c611ed2565b60200101906001600160f81b03191690815f1a9053506001016110c5565b505f601482015190508084848151811061114657611146611ed2565b6001600160a01b039092166020928302919091019091015261116960148a611f72565b98505050806001019050611095565b506040805180820190915263ffffffff9092168252602082015260808401525f80805b60048110156111fa576111af816003611ea8565b6111ba906008611ebb565b63ffffffff16898863ffffffff16836111d39190611ee6565b815181106111e3576111e3611ed2565b016020015160f81c901b919091179060010161119b565b50611206600487611f72565b95505f5b60048110156112695761121e816003611ea8565b611229906008611ebb565b63ffffffff16898863ffffffff16836112429190611ee6565b8151811061125257611252611ed2565b016020015160f81c901b929092179160010161120a565b50611275600487611f72565b95505f8263ffffffff166001600160401b038111156112965761129661176c565b6040519080825280602002602001820160405280156112bf578160200160208202803683370190505b5090505f5b8363ffffffff168110156113a7576040805160148082528183019092525f916020820181803683370190505090505f5b6014811015611359578b61130e63ffffffff8c1683611ee6565b8151811061131e5761131e611ed2565b602001015160f81c60f81b82828151811061133b5761133b611ed2565b60200101906001600160f81b03191690815f1a9053506001016112f4565b505f601482015190508084848151811061137557611375611ed2565b6001600160a01b039092166020928302919091019091015261139860148b611f72565b995050508060010190506112c4565b506040805180820190915263ffffffff9092168252602082015260a08501525f6113d18284611f72565b6113dc906014611f8f565b6113e785607a611f72565b6113f19190611f72565b90508063ffffffff1688511461142d57875160405163cc92daa160e01b815263ffffffff918216600482015290821660248201526044016102bb565b5f805b600881101561149057611444816007611ea8565b61144f906008611ebb565b6001600160401b03168a61146963ffffffff8b1684611ee6565b8151811061147957611479611ed2565b016020015160f81c901b9190911790600101611430565b506001600160401b031660c086015250929695505050505050565b6040515f6020820152600160e11b60228201526026810183905281151560f81b60468201526060906047015b60405160208183030381529060405290505b92915050565b6040515f602082018190526022820152602681018390526001600160c01b031960c083901b166046820152606090604e016114d7565b5f606082604001515160301461154e5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861158f988a986001989297929690959094909390929101611fb7565b60405160208183030381529060405290505f5b84608001516020015151811015611601578185608001516020015182815181106115ce576115ce611ed2565b60200260200101516040516020016115e7929190612071565b60408051601f1981840301815291905291506001016115a2565b5060a08401518051602091820151516040516116219385939291016120a7565b60405160208183030381529060405290505f5b8460a00151602001515181101561169357818560a0015160200151828151811061166057611660611ed2565b6020026020010151604051602001611679929190612071565b60408051601f198184030181529190529150600101611634565b5060c08401516040516116aa9183916020016120e2565b60405160208183030381529060405290506002816040516116cb9190612113565b602060405180830381855afa1580156116e6573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611709919061212e565b94909350915050565b6040805160e0810182525f808252606060208084018290528385018290528184018390528451808601865283815280820183905260808501528451808601909552918452908301529060a082019081525f60209091015290565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156117a2576117a261176c565b60405290565b604051606081016001600160401b03811182821017156117a2576117a261176c565b604080519081016001600160401b03811182821017156117a2576117a261176c565b60405160e081016001600160401b03811182821017156117a2576117a261176c565b604051601f8201601f191681016001600160401b03811182821017156118365761183661176c565b604052919050565b5f82601f83011261184d575f80fd5b81356001600160401b038111156118665761186661176c565b611879601f8201601f191660200161180e565b81815284602083860101111561188d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156118b9575f80fd5b81356001600160401b038111156118ce575f80fd5b6118da8482850161183e565b949350505050565b5f602082840312156118f2575f80fd5b5035919050565b5f5b838110156119135781810151838201526020016118fb565b50505f910152565b5f81518084526119328160208601602086016118f9565b601f01601f19169290920160200192915050565b602081525f611958602083018461191b565b9392505050565b80356001600160401b0381168114611975575f80fd5b919050565b5f805f6060848603121561198c575f80fd5b8335925061199c6020850161195f565b91506119aa6040850161195f565b90509250925092565b80356001600160a01b0381168114611975575f80fd5b5f6001600160401b038211156119e1576119e161176c565b5060051b60200190565b5f60208083850312156119fc575f80fd5b82356001600160401b0380821115611a12575f80fd5b9084019060808287031215611a25575f80fd5b611a2d611780565b823581528383013584820152611a45604084016119b3565b604082015260608084013583811115611a5c575f80fd5b80850194505087601f850112611a70575f80fd5b8335611a83611a7e826119c9565b61180e565b81815260059190911b8501860190868101908a831115611aa1575f80fd5b8787015b83811015611b3a57803587811115611abb575f80fd5b8801808d03601f1901861315611acf575f80fd5b611ad76117a8565b8a82013589811115611ae7575f80fd5b611af58f8d8386010161183e565b825250604082013589811115611b09575f80fd5b611b178f8d8386010161183e565b8c83015250611b2787830161195f565b6040820152845250918801918801611aa5565b506060850152509198975050505050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015611ba95784516001600160a01b03168252938301936001929092019190830190611b80565b509695505050505050565b60208152815160208201525f602083015160e06040840152611bda61010084018261191b565b90506040840151601f1980858403016060860152611bf8838361191b565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152611c288383611b4e565b925060a08601519150808584030160c086015250611c468282611b4e565b91505060c0840151611c6360e08501826001600160401b03169052565b509392505050565b5f8060408385031215611c7c575f80fd5b8235915060208301358015158114611c92575f80fd5b809150509250929050565b5f8060408385031215611cae575f80fd5b82359150611cbe6020840161195f565b90509250929050565b5f60408284031215611cd7575f80fd5b611cdf6117ca565b9050813563ffffffff81168114611cf4575f80fd5b81526020828101356001600160401b03811115611d0f575f80fd5b8301601f81018513611d1f575f80fd5b8035611d2d611a7e826119c9565b81815260059190911b82018301908381019087831115611d4b575f80fd5b928401925b82841015611d7057611d61846119b3565b82529284019290840190611d50565b8085870152505050505092915050565b5f60208284031215611d90575f80fd5b81356001600160401b0380821115611da6575f80fd5b9083019060e08286031215611db9575f80fd5b611dc16117ec565b82358152602083013582811115611dd6575f80fd5b611de28782860161183e565b602083015250604083013582811115611df9575f80fd5b611e058782860161183e565b604083015250611e176060840161195f565b6060820152608083013582811115611e2d575f80fd5b611e3987828601611cc7565b60808301525060a083013582811115611e50575f80fd5b611e5c87828601611cc7565b60a083015250611e6e60c0840161195f565b60c082015295945050505050565b828152604060208201525f6118da604083018461191b565b634e487b7160e01b5f52601160045260245ffd5b818103818111156114e9576114e9611e94565b80820281158282048414176114e9576114e9611e94565b634e487b7160e01b5f52603260045260245ffd5b808201808211156114e9576114e9611e94565b5f8651611f0a818460208b016118f9565b60e087901b6001600160e01b0319169083019081528551611f32816004840160208a016118f9565b8551910190611f488160048401602089016118f9565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b63ffffffff818116838216019080821115610b5957610b59611e94565b63ffffffff818116838216028082169190828114611faf57611faf611e94565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651611ffd81602a850160208b016118f9565b86519083019061201481602a840160208b016118f9565b60c087901b6001600160c01b031916602a9290910191820152612046603282018660e01b6001600160e01b0319169052565b61205f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516120828184602088016118f9565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516120b88184602089016118f9565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516120f38184602088016118f9565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f82516121248184602087016118f9565b9190910192915050565b5f6020828403121561213e575f80fd5b505191905056fea264697066735822122021bc83cb762d019261a415f663497547f82a60b24f9f9026058db0ae0972d18e64736f6c63430008190033", } // ValidatorMessagesABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go index 467e7b7a5..6fbc41d55 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -31,7 +31,7 @@ var ( // ConversionData is an auto generated low-level Go binding around an user-defined struct. type ConversionData struct { - SubnetID [32]byte + L1ID [32]byte ValidatorManagerBlockchainID [32]byte ValidatorManagerAddress common.Address InitialValidators []InitialValidator @@ -63,14 +63,14 @@ type Validator struct { // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { - SubnetID [32]byte + L1ID [32]byte ChurnPeriodSeconds uint64 MaximumChurnPercentage uint8 } // ValidatorMessagesValidationPeriod is an auto generated low-level Go binding around an user-defined struct. type ValidatorMessagesValidationPeriod struct { - SubnetID [32]byte + L1ID [32]byte NodeID []byte BlsPublicKey []byte RegistrationExpiry uint64 @@ -90,8 +90,8 @@ type ValidatorRegistrationInput struct { // PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. var PoAValidatorManagerMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidBLSKeyLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encodedConversionID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedConversionID\",\"type\":\"bytes32\"}],\"name\":\"InvalidConversionID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"name\":\"InvalidMaximumChurnPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"InvalidNodeID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"InvalidRegistrationExpiry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InvalidTotalWeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"}],\"name\":\"InvalidValidatorManagerAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidatorManagerBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"name\":\"MaxChurnRateExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"NodeAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PChainOwnerAddressesNotSorted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"startingWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endedAt\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"}],\"internalType\":\"structValidatorRegistrationInput\",\"name\":\"registrationInput\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"initializeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"registeredValidators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161380838038061380883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6136bb8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b61014961014436600461280a565b610312565b005b610149610159366004612839565b6105a2565b61014961016c366004612887565b610b5d565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a136600461280a565b610b6b565b6040516001600160401b03909116815260200161018a565b610149610b7f565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b61014961024736600461280a565b610b92565b6101cd61025a3660046128b6565b610ba7565b61014961026d366004612887565b610bc3565b6102216005600160991b0181565b6101cd5f8051602061364683398151915281565b6101496102a236600461280a565b610db9565b6101e3601481565b6101496102bd36600461290f565b610ef5565b6102d56102d036600461280a565b611003565b60405161018a91906129cc565b6101a66202a30081565b6101496102fa366004612a4c565b611152565b6101cd61030d366004612a6e565b61118f565b5f8181525f805160206136668339815191526020526040808220815160e0810190925280545f8051602061364683398151915293929190829060ff16600581111561035f5761035f61294b565b60058111156103705761037061294b565b815260200160018201805461038490612ad9565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612ad9565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156104665761046661294b565b146104a2575f8381526005830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612b11565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af4158015610519573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105409190810190612c22565b6040518263ffffffff1660e01b815260040161055c9190612c53565b6020604051808303815f875af1158015610578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059c9190612c65565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f805160206136468339815191529060ff16156105f457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065b9190612c65565b836020013514610684576040516372b0a7e760e11b815260208401356004820152602401610499565b306106956060850160408601612a4c565b6001600160a01b0316146106d8576106b36060840160408501612a4c565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f6106e66060850185612c7c565b905090505f805b828163ffffffff16101561094e575f6107096060880188612c7c565b8363ffffffff1681811061071f5761071f612cc1565b90506020028101906107319190612cd5565b61073a90612d40565b80516040519192505f91600688019161075291612db9565b9081526020016040518091039020541461078257805160405163a41f772f60e01b81526104999190600401612c53565b5f6002885f0135846040516020016107b192919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526107cb91612db9565b602060405180830381855afa1580156107e6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108099190612c65565b90508086600601835f01516040516108219190612db9565b90815260408051918290036020908101909220929092555f8381526005890190915220805460ff1916600217815582516001909101906108619082612e15565b50604082810180515f84815260058a016020529290922060028101805492516001600160401b039485166001600160c01b031990941693909317600160801b85851602176001600160c01b0316600160c01b429590951694909402939093179092556003909101805467ffffffffffffffff191690556108e19085612ee8565b82516040519195506108f291612db9565b60408051918290038220908401516001600160401b031682529082907ffe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c9060200160405180910390a350508061094790612f08565b90506106ed565b506003830180546fffffffffffffffff00000000000000001916600160401b6001600160401b0384168102919091179091556001840154606491610996910460ff1683612f2a565b6001600160401b031610156109c957604051633e1a785160e01b81526001600160401b0382166004820152602401610499565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d8478846109ed876111ea565b604001516040518263ffffffff1660e01b8152600401610a0d9190612c53565b602060405180830381865af4158015610a28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4c9190612c65565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610a869190613078565b5f60405180830381865af4158015610aa0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ac79190810190612c22565b90505f600282604051610ada9190612db9565b602060405180830381855afa158015610af5573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b189190612c65565b9050828114610b445760405163baaea89d60e01b81526004810182905260248101849052604401610499565b5050506007909201805460ff1916600117905550505050565b610b6681611300565b505050565b5f610b7582611003565b6080015192915050565b610b876116b8565b610b905f611713565b565b610b9a6116b8565b610ba381611783565b5050565b5f610bb06116b8565b610bba8383611a68565b90505b92915050565b5f805160206136468339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f610bf6866111ea565b604001516040518263ffffffff1660e01b8152600401610c169190612c53565b6040805180830381865af4158015610c30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c54919061311b565b9150915080610c7a57604051632d07135360e01b81528115156004820152602401610499565b5f82815260048401602052604090208054610c9490612ad9565b90505f03610cb85760405163089938b360e11b815260048101839052602401610499565b60015f838152600580860160205260409091205460ff1690811115610cdf57610cdf61294b565b14610d12575f8281526005840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612b11565b5f8281526004840160205260408120610d2a9161277e565b5f828152600584016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917f8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040902080545f805160206136468339815191529190610e0090612ad9565b90505f03610e245760405163089938b360e11b815260048101839052602401610499565b60015f838152600580840160205260409091205460ff1690811115610e4b57610e4b61294b565b14610e7e575f8281526005820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612b11565b5f8281526004808301602052604091829020915163ee5b48eb60e01b81526005600160991b019263ee5b48eb92610eb5920161313c565b6020604051808303815f875af1158015610ed1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b669190612c65565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610f395750825b90505f826001600160401b03166001148015610f545750303b155b905081158015610f62575080155b15610f805760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610faa57845460ff60401b1916600160401b1785555b610fb48787611fda565b8315610ffa57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61100b6127b5565b5f8281525f80516020613666833981519152602052604090819020815160e0810190925280545f80516020613646833981519152929190829060ff1660058111156110585761105861294b565b60058111156110695761106961294b565b815260200160018201805461107d90612ad9565b80601f01602080910402602001604051908101604052809291908181526020018280546110a990612ad9565b80156110f45780601f106110cb576101008083540402835291602001916110f4565b820191905f5260205f20905b8154815290600101906020018083116110d757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b61115a6116b8565b6001600160a01b03811661118357604051631e4fbdf760e01b81525f6004820152602401610499565b61118c81611713565b50565b6040515f905f80516020613646833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06906111d290869086906131c6565b90815260200160405180910390205491505092915050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561124e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261127591908101906131d5565b915091508061129757604051636b2f19e960e01b815260040160405180910390fd5b8151156112bd578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b0316156112f9576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f6113096127b5565b5f805160206136468339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f61133c886111ea565b604001516040518263ffffffff1660e01b815260040161135c9190612c53565b6040805180830381865af4158015611376573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139a919061311b565b9150915080156113c157604051632d07135360e01b81528115156004820152602401610499565b5f82815260058085016020526040808320815160e08101909252805491929091839160ff909116908111156113f8576113f861294b565b60058111156114095761140961294b565b815260200160018201805461141d90612ad9565b80601f016020809104026020016040519081016040528092919081815260200182805461144990612ad9565b80156114945780601f1061146b57610100808354040283529160200191611494565b820191905f5260205f20905b81548152906001019060200180831161147757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156114ff576114ff61294b565b14158015611520575060018151600581111561151d5761151d61294b565b14155b1561154157805160405163170cc93360e21b81526104999190600401612b11565b6003815160058111156115565761155661294b565b036115645760048152611569565b600581525b83600601816020015160405161157f9190612db9565b90815260408051602092819003830190205f90819055858152600587810190935220825181548493839160ff19169060019084908111156115c2576115c261294b565b0217905550602082015160018201906115db9082612e15565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156116815761168161294b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336116ea7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b905760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b61178b6127b5565b5f8281525f805160206136668339815191526020526040808220815160e0810190925280545f8051602061364683398151915293929190829060ff1660058111156117d8576117d861294b565b60058111156117e9576117e961294b565b81526020016001820180546117fd90612ad9565b80601f016020809104026020016040519081016040528092919081815260200182805461182990612ad9565b80156118745780601f1061184b57610100808354040283529160200191611874565b820191905f5260205f20905b81548152906001019060200180831161185757829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a090910152909150815160058111156118e2576118e261294b565b14611915575f8481526005830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612b11565b60038152426001600160401b031660c08201525f84815260058381016020526040909120825181548493839160ff191690600190849081111561195a5761195a61294b565b0217905550602082015160018201906119739082612e15565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611a118582611ff4565b6080840151604080516001600160401b03909216825242602083015291935083925087917ffbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f9060ff16611aac57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061364683398151915242611acb6060860160408701613262565b6001600160401b0316111580611b055750611ae96202a3004261327b565b611af96060860160408701613262565b6001600160401b031610155b15611b3f57611b1a6060850160408601613262565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b60038101546001600160401b0390611b6290600160401b9004821685831661327b565b1115611b8c57604051633e1a785160e01b81526001600160401b0384166004820152602401610499565b611ba1611b9c606086018661328e565b6121cb565b611bb1611b9c608086018661328e565b6030611bc060208601866132a2565b905014611bf257611bd460208501856132a2565b6040516326475b2f60e11b8152610499925060040190815260200190565b611bfc84806132a2565b90505f03611c2957611c0e84806132a2565b604051633e08a12560e11b81526004016104999291906132e4565b5f60068201611c3886806132a2565b604051611c469291906131c6565b90815260200160405180910390205414611c7f57611c6484806132a2565b60405163a41f772f60e01b81526004016104999291906132e4565b611c89835f612334565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce519060208101611cc68a806132a2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611d0e908b018b6132a2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611d5760608b0160408c01613262565b6001600160401b03168152602001611d7260608b018b61328e565b611d7b906132f7565b8152602001611d8d60808b018b61328e565b611d96906132f7565b8152602001886001600160401b03168152506040518263ffffffff1660e01b8152600401611dc49190613424565b5f60405180830381865af4158015611dde573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e0591908101906134db565b5f82815260048601602052604090209193509150611e238282612e15565b508160068401611e3388806132a2565b604051611e419291906131c6565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e7d908590600401612c53565b6020604051808303815f875af1158015611e99573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ebd9190612c65565b5f8481526005860160205260409020805460ff191660011790559050611ee387806132a2565b5f858152600587016020526040902060010191611f0191908361351e565b505f83815260058501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff1916905580611f6088806132a2565b604051611f6e9291906131c6565b6040518091039020847fd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49898b6040016020810190611fac9190613262565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611fe261259e565b611feb826125e7565b610ba381612600565b5f8281525f80516020613666833981519152602052604081206002015481905f8051602061364683398151915290600160801b90046001600160401b031661203c8582612334565b5f61204687612611565b5f888152600585016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af41580156120ef573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121169190810190612c22565b6040518263ffffffff1660e01b81526004016121329190612c53565b6020604051808303815f875af115801561214e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121729190612c65565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6121d86020820182612887565b63ffffffff161580156121f857506121f36020820182612c7c565b151590505b1561223f5761220a6020820182612887565b6122176020830183612c7c565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610499565b61224c6020820182612c7c565b905061225b6020830183612887565b63ffffffff1611156122745761220a6020820182612887565b60015b6122846020830183612c7c565b9050811015610ba35761229a6020830183612c7c565b6122a56001846135d7565b8181106122b4576122b4612cc1565b90506020020160208101906122c99190612a4c565b6001600160a01b03166122df6020840184612c7c565b838181106122ef576122ef612cc1565b90506020020160208101906123049190612a4c565b6001600160a01b0316101561232c57604051630dbc8d5f60e31b815260040160405180910390fd5b600101612277565b5f805160206136468339815191525f6001600160401b0380841690851611156123685761236183856135ea565b9050612375565b61237284846135ea565b90505b60408051608081018252600284015480825260038501546001600160401b038082166020850152600160401b8204811694840194909452600160801b90049092166060820152429115806123e25750600184015481516123de916001600160401b03169061327b565b8210155b1561240a576001600160401b0380841660608301528282526040820151166020820152612429565b828160600181815161241c9190612ee8565b6001600160401b03169052505b6060810151612439906064612f2a565b602082015160018601546001600160401b0392909216916124649190600160401b900460ff16612f2a565b6001600160401b0316101561249d57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b85816040018181516124af9190612ee8565b6001600160401b03169052506040810180518691906124cf9083906135ea565b6001600160401b0316905250600184015460408201516064916124fd91600160401b90910460ff1690612f2a565b6001600160401b03161015612536576040808201519051633e1a785160e01b81526001600160401b039091166004820152602401610499565b8051600285015560208101516003909401805460408301516060909301516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b0319909316919097161717919091169390931790925550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b9057604051631afcd79f60e31b815260040160405180910390fd5b6125ef61259e565b6125f7612686565b61118c8161268e565b61260861259e565b61118c81612776565b5f8181525f805160206136668339815191526020526040812060020180545f80516020613646833981519152919060089061265b90600160401b90046001600160401b031661360a565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610b9061259e565b61269661259e565b80355f8051602061364683398151915290815560146126bb6060840160408501613625565b60ff1611806126da57506126d56060830160408401613625565b60ff16155b1561270e576126ef6060830160408401613625565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b61271e6060830160408401613625565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561274f6040830160208401613262565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61115a61259e565b50805461278a90612ad9565b5f825580601f10612799575050565b601f0160209004905f5260205f209081019061118c91906127f2565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612806575f81556001016127f3565b5090565b5f6020828403121561281a575f80fd5b5035919050565b803563ffffffff81168114612834575f80fd5b919050565b5f806040838503121561284a575f80fd5b82356001600160401b0381111561285f575f80fd5b830160808186031215612870575f80fd5b915061287e60208401612821565b90509250929050565b5f60208284031215612897575f80fd5b610bba82612821565b80356001600160401b0381168114612834575f80fd5b5f80604083850312156128c7575f80fd5b82356001600160401b038111156128dc575f80fd5b830160a081860312156128ed575f80fd5b915061287e602084016128a0565b6001600160a01b038116811461118c575f80fd5b5f808284036080811215612921575f80fd5b606081121561292e575f80fd5b508291506060830135612940816128fb565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b6006811061297b57634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612999578181015183820152602001612981565b50505f910152565b5f81518084526129b881602086016020860161297f565b601f01601f19169290920160200192915050565b602081526129de60208201835161295f565b5f602083015160e060408401526129f96101008401826129a1565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612a5c575f80fd5b8135612a67816128fb565b9392505050565b5f8060208385031215612a7f575f80fd5b82356001600160401b0380821115612a95575f80fd5b818501915085601f830112612aa8575f80fd5b813581811115612ab6575f80fd5b866020828501011115612ac7575f80fd5b60209290920196919550909350505050565b600181811c90821680612aed57607f821691505b602082108103612b0b57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610bbd828461295f565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612b5557612b55612b1f565b60405290565b604080519081016001600160401b0381118282101715612b5557612b55612b1f565b604051601f8201601f191681016001600160401b0381118282101715612ba557612ba5612b1f565b604052919050565b5f6001600160401b03821115612bc557612bc5612b1f565b50601f01601f191660200190565b5f82601f830112612be2575f80fd5b8151612bf5612bf082612bad565b612b7d565b818152846020838601011115612c09575f80fd5b612c1a82602083016020870161297f565b949350505050565b5f60208284031215612c32575f80fd5b81516001600160401b03811115612c47575f80fd5b612c1a84828501612bd3565b602081525f610bba60208301846129a1565b5f60208284031215612c75575f80fd5b5051919050565b5f808335601e19843603018112612c91575f80fd5b8301803591506001600160401b03821115612caa575f80fd5b6020019150600581901b36038213156121c4575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612ce9575f80fd5b9190910192915050565b5f82601f830112612d02575f80fd5b8135612d10612bf082612bad565b818152846020838601011115612d24575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215612d50575f80fd5b612d58612b33565b82356001600160401b0380821115612d6e575f80fd5b612d7a36838701612cf3565b83526020850135915080821115612d8f575f80fd5b50612d9c36828601612cf3565b602083015250612dae604084016128a0565b604082015292915050565b5f8251612ce981846020870161297f565b601f821115610b6657805f5260205f20601f840160051c81016020851015612def5750805b601f840160051c820191505b81811015612e0e575f8155600101612dfb565b5050505050565b81516001600160401b03811115612e2e57612e2e612b1f565b612e4281612e3c8454612ad9565b84612dca565b602080601f831160018114612e75575f8415612e5e5750858301515b5f19600386901b1c1916600185901b178555612ecc565b5f85815260208120601f198616915b82811015612ea357888601518255948401946001909101908401612e84565b5085821015612ec057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156112f9576112f9612ed4565b5f63ffffffff808316818103612f2057612f20612ed4565b6001019392505050565b6001600160401b03818116838216028082169190828114612f4d57612f4d612ed4565b505092915050565b5f808335601e19843603018112612f6a575f80fd5b83016020810192503590506001600160401b03811115612f88575f80fd5b8036038213156121c4575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b8781101561306b57848303601f19018952813536889003605e19018112612ffa575f80fd5b870160606130088280612f55565b8287526130188388018284612f96565b9250505061302886830183612f55565b8683038888015261303a838284612f96565b9250505060406001600160401b036130538285016128a0565b16950194909452509783019790830190600101612fd5565b5090979650505050505050565b6020815281356020820152602082013560408201525f604083013561309c816128fb565b6001600160a01b031660608381019190915283013536849003601e190181126130c3575f80fd5b83016020810190356001600160401b038111156130de575f80fd5b8060051b36038213156130ef575f80fd5b60808085015261310360a085018284612fbe565b95945050505050565b80518015158114612834575f80fd5b5f806040838503121561312c575f80fd5b8251915061287e6020840161310c565b5f60208083525f845461314e81612ad9565b806020870152604060018084165f811461316f576001811461318b576131b8565b60ff19851660408a0152604084151560051b8a010195506131b8565b895f5260205f205f5b858110156131af5781548b8201860152908301908801613194565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b5f80604083850312156131e6575f80fd5b82516001600160401b03808211156131fc575f80fd5b908401906060828703121561320f575f80fd5b613217612b33565b825181526020830151613229816128fb565b602082015260408301518281111561323f575f80fd5b61324b88828601612bd3565b604083015250935061287e9150506020840161310c565b5f60208284031215613272575f80fd5b610bba826128a0565b80820180821115610bbd57610bbd612ed4565b5f8235603e19833603018112612ce9575f80fd5b5f808335601e198436030181126132b7575f80fd5b8301803591506001600160401b038211156132d0575f80fd5b6020019150368190038213156121c4575f80fd5b602081525f612c1a602083018486612f96565b5f60408236031215613307575f80fd5b61330f612b5b565b61331883612821565b81526020808401356001600160401b0380821115613334575f80fd5b9085019036601f830112613346575f80fd5b81358181111561335857613358612b1f565b8060051b9150613369848301612b7d565b8181529183018401918481019036841115613382575f80fd5b938501935b838510156133ac578435925061339c836128fb565b8282529385019390850190613387565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b808310156134195784516001600160a01b031682529383019360019290920191908301906133f0565b509695505050505050565b60208152815160208201525f602083015160e0604084015261344a6101008401826129a1565b90506040840151601f198085840301606086015261346883836129a1565b92506001600160401b03606087015116608086015260808601519150808584030160a086015261349883836133be565b925060a08601519150808584030160c0860152506134b682826133be565b91505060c08401516134d360e08501826001600160401b03169052565b509392505050565b5f80604083850312156134ec575f80fd5b8251915060208301516001600160401b03811115613508575f80fd5b61351485828601612bd3565b9150509250929050565b6001600160401b0383111561353557613535612b1f565b613549836135438354612ad9565b83612dca565b5f601f84116001811461357a575f85156135635750838201355b5f19600387901b1c1916600186901b178355612e0e565b5f83815260208120601f198716915b828110156135a95786850135825560209485019460019092019101613589565b50868210156135c5575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81810381811115610bbd57610bbd612ed4565b6001600160401b038281168282160390808211156112f9576112f9612ed4565b5f6001600160401b03808316818103612f2057612f20612ed4565b5f60208284031215613635575f80fd5b813560ff81168114612a67575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05a2646970667358221220b05e59f90c65e1f7f041659a6e74acd77f500b014faa3feabbe2aa3c1bf2ecb364736f6c63430008190033", + ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidBLSKeyLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encodedConversionID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedConversionID\",\"type\":\"bytes32\"}],\"name\":\"InvalidConversionID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"name\":\"InvalidMaximumChurnPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"InvalidNodeID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"InvalidRegistrationExpiry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InvalidTotalWeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"}],\"name\":\"InvalidValidatorManagerAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidatorManagerBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"name\":\"MaxChurnRateExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"NodeAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PChainOwnerAddressesNotSorted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"startingWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endedAt\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"}],\"internalType\":\"structValidatorRegistrationInput\",\"name\":\"registrationInput\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"initializeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"registeredValidators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161380838038061380883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6136bb8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b61014961014436600461280a565b610312565b005b610149610159366004612839565b6105a2565b61014961016c366004612887565b610b5d565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a136600461280a565b610b6b565b6040516001600160401b03909116815260200161018a565b610149610b7f565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b61014961024736600461280a565b610b92565b6101cd61025a3660046128b6565b610ba7565b61014961026d366004612887565b610bc3565b6102216005600160991b0181565b6101cd5f8051602061364683398151915281565b6101496102a236600461280a565b610db9565b6101e3601481565b6101496102bd36600461290f565b610ef5565b6102d56102d036600461280a565b611003565b60405161018a91906129cc565b6101a66202a30081565b6101496102fa366004612a4c565b611152565b6101cd61030d366004612a6e565b61118f565b5f8181525f805160206136668339815191526020526040808220815160e0810190925280545f8051602061364683398151915293929190829060ff16600581111561035f5761035f61294b565b60058111156103705761037061294b565b815260200160018201805461038490612ad9565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612ad9565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156104665761046661294b565b146104a2575f8381526005830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612b11565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af4158015610519573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105409190810190612c22565b6040518263ffffffff1660e01b815260040161055c9190612c53565b6020604051808303815f875af1158015610578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059c9190612c65565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f805160206136468339815191529060ff16156105f457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065b9190612c65565b836020013514610684576040516372b0a7e760e11b815260208401356004820152602401610499565b306106956060850160408601612a4c565b6001600160a01b0316146106d8576106b36060840160408501612a4c565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f6106e66060850185612c7c565b905090505f805b828163ffffffff16101561094e575f6107096060880188612c7c565b8363ffffffff1681811061071f5761071f612cc1565b90506020028101906107319190612cd5565b61073a90612d40565b80516040519192505f91600688019161075291612db9565b9081526020016040518091039020541461078257805160405163a41f772f60e01b81526104999190600401612c53565b5f6002885f0135846040516020016107b192919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526107cb91612db9565b602060405180830381855afa1580156107e6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108099190612c65565b90508086600601835f01516040516108219190612db9565b90815260408051918290036020908101909220929092555f8381526005890190915220805460ff1916600217815582516001909101906108619082612e15565b50604082810180515f84815260058a016020529290922060028101805492516001600160401b039485166001600160c01b031990941693909317600160801b85851602176001600160c01b0316600160c01b429590951694909402939093179092556003909101805467ffffffffffffffff191690556108e19085612ee8565b82516040519195506108f291612db9565b60408051918290038220908401516001600160401b031682529082907ffe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c9060200160405180910390a350508061094790612f08565b90506106ed565b506003830180546fffffffffffffffff00000000000000001916600160401b6001600160401b0384168102919091179091556001840154606491610996910460ff1683612f2a565b6001600160401b031610156109c957604051633e1a785160e01b81526001600160401b0382166004820152602401610499565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d8478846109ed876111ea565b604001516040518263ffffffff1660e01b8152600401610a0d9190612c53565b602060405180830381865af4158015610a28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4c9190612c65565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610a869190613078565b5f60405180830381865af4158015610aa0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ac79190810190612c22565b90505f600282604051610ada9190612db9565b602060405180830381855afa158015610af5573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b189190612c65565b9050828114610b445760405163baaea89d60e01b81526004810182905260248101849052604401610499565b5050506007909201805460ff1916600117905550505050565b610b6681611300565b505050565b5f610b7582611003565b6080015192915050565b610b876116b8565b610b905f611713565b565b610b9a6116b8565b610ba381611783565b5050565b5f610bb06116b8565b610bba8383611a68565b90505b92915050565b5f805160206136468339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f610bf6866111ea565b604001516040518263ffffffff1660e01b8152600401610c169190612c53565b6040805180830381865af4158015610c30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c54919061311b565b9150915080610c7a57604051632d07135360e01b81528115156004820152602401610499565b5f82815260048401602052604090208054610c9490612ad9565b90505f03610cb85760405163089938b360e11b815260048101839052602401610499565b60015f838152600580860160205260409091205460ff1690811115610cdf57610cdf61294b565b14610d12575f8281526005840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612b11565b5f8281526004840160205260408120610d2a9161277e565b5f828152600584016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917f8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040902080545f805160206136468339815191529190610e0090612ad9565b90505f03610e245760405163089938b360e11b815260048101839052602401610499565b60015f838152600580840160205260409091205460ff1690811115610e4b57610e4b61294b565b14610e7e575f8281526005820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612b11565b5f8281526004808301602052604091829020915163ee5b48eb60e01b81526005600160991b019263ee5b48eb92610eb5920161313c565b6020604051808303815f875af1158015610ed1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b669190612c65565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610f395750825b90505f826001600160401b03166001148015610f545750303b155b905081158015610f62575080155b15610f805760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610faa57845460ff60401b1916600160401b1785555b610fb48787611fda565b8315610ffa57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61100b6127b5565b5f8281525f80516020613666833981519152602052604090819020815160e0810190925280545f80516020613646833981519152929190829060ff1660058111156110585761105861294b565b60058111156110695761106961294b565b815260200160018201805461107d90612ad9565b80601f01602080910402602001604051908101604052809291908181526020018280546110a990612ad9565b80156110f45780601f106110cb576101008083540402835291602001916110f4565b820191905f5260205f20905b8154815290600101906020018083116110d757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b61115a6116b8565b6001600160a01b03811661118357604051631e4fbdf760e01b81525f6004820152602401610499565b61118c81611713565b50565b6040515f905f80516020613646833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06906111d290869086906131c6565b90815260200160405180910390205491505092915050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561124e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261127591908101906131d5565b915091508061129757604051636b2f19e960e01b815260040160405180910390fd5b8151156112bd578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b0316156112f9576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f6113096127b5565b5f805160206136468339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f61133c886111ea565b604001516040518263ffffffff1660e01b815260040161135c9190612c53565b6040805180830381865af4158015611376573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139a919061311b565b9150915080156113c157604051632d07135360e01b81528115156004820152602401610499565b5f82815260058085016020526040808320815160e08101909252805491929091839160ff909116908111156113f8576113f861294b565b60058111156114095761140961294b565b815260200160018201805461141d90612ad9565b80601f016020809104026020016040519081016040528092919081815260200182805461144990612ad9565b80156114945780601f1061146b57610100808354040283529160200191611494565b820191905f5260205f20905b81548152906001019060200180831161147757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156114ff576114ff61294b565b14158015611520575060018151600581111561151d5761151d61294b565b14155b1561154157805160405163170cc93360e21b81526104999190600401612b11565b6003815160058111156115565761155661294b565b036115645760048152611569565b600581525b83600601816020015160405161157f9190612db9565b90815260408051602092819003830190205f90819055858152600587810190935220825181548493839160ff19169060019084908111156115c2576115c261294b565b0217905550602082015160018201906115db9082612e15565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156116815761168161294b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336116ea7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b905760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b61178b6127b5565b5f8281525f805160206136668339815191526020526040808220815160e0810190925280545f8051602061364683398151915293929190829060ff1660058111156117d8576117d861294b565b60058111156117e9576117e961294b565b81526020016001820180546117fd90612ad9565b80601f016020809104026020016040519081016040528092919081815260200182805461182990612ad9565b80156118745780601f1061184b57610100808354040283529160200191611874565b820191905f5260205f20905b81548152906001019060200180831161185757829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a090910152909150815160058111156118e2576118e261294b565b14611915575f8481526005830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612b11565b60038152426001600160401b031660c08201525f84815260058381016020526040909120825181548493839160ff191690600190849081111561195a5761195a61294b565b0217905550602082015160018201906119739082612e15565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611a118582611ff4565b6080840151604080516001600160401b03909216825242602083015291935083925087917ffbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f9060ff16611aac57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061364683398151915242611acb6060860160408701613262565b6001600160401b0316111580611b055750611ae96202a3004261327b565b611af96060860160408701613262565b6001600160401b031610155b15611b3f57611b1a6060850160408601613262565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b60038101546001600160401b0390611b6290600160401b9004821685831661327b565b1115611b8c57604051633e1a785160e01b81526001600160401b0384166004820152602401610499565b611ba1611b9c606086018661328e565b6121cb565b611bb1611b9c608086018661328e565b6030611bc060208601866132a2565b905014611bf257611bd460208501856132a2565b6040516326475b2f60e11b8152610499925060040190815260200190565b611bfc84806132a2565b90505f03611c2957611c0e84806132a2565b604051633e08a12560e11b81526004016104999291906132e4565b5f60068201611c3886806132a2565b604051611c469291906131c6565b90815260200160405180910390205414611c7f57611c6484806132a2565b60405163a41f772f60e01b81526004016104999291906132e4565b611c89835f612334565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce519060208101611cc68a806132a2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611d0e908b018b6132a2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611d5760608b0160408c01613262565b6001600160401b03168152602001611d7260608b018b61328e565b611d7b906132f7565b8152602001611d8d60808b018b61328e565b611d96906132f7565b8152602001886001600160401b03168152506040518263ffffffff1660e01b8152600401611dc49190613424565b5f60405180830381865af4158015611dde573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e0591908101906134db565b5f82815260048601602052604090209193509150611e238282612e15565b508160068401611e3388806132a2565b604051611e419291906131c6565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e7d908590600401612c53565b6020604051808303815f875af1158015611e99573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ebd9190612c65565b5f8481526005860160205260409020805460ff191660011790559050611ee387806132a2565b5f858152600587016020526040902060010191611f0191908361351e565b505f83815260058501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff1916905580611f6088806132a2565b604051611f6e9291906131c6565b6040518091039020847fd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49898b6040016020810190611fac9190613262565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611fe261259e565b611feb826125e7565b610ba381612600565b5f8281525f80516020613666833981519152602052604081206002015481905f8051602061364683398151915290600160801b90046001600160401b031661203c8582612334565b5f61204687612611565b5f888152600585016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af41580156120ef573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121169190810190612c22565b6040518263ffffffff1660e01b81526004016121329190612c53565b6020604051808303815f875af115801561214e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121729190612c65565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6121d86020820182612887565b63ffffffff161580156121f857506121f36020820182612c7c565b151590505b1561223f5761220a6020820182612887565b6122176020830183612c7c565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610499565b61224c6020820182612c7c565b905061225b6020830183612887565b63ffffffff1611156122745761220a6020820182612887565b60015b6122846020830183612c7c565b9050811015610ba35761229a6020830183612c7c565b6122a56001846135d7565b8181106122b4576122b4612cc1565b90506020020160208101906122c99190612a4c565b6001600160a01b03166122df6020840184612c7c565b838181106122ef576122ef612cc1565b90506020020160208101906123049190612a4c565b6001600160a01b0316101561232c57604051630dbc8d5f60e31b815260040160405180910390fd5b600101612277565b5f805160206136468339815191525f6001600160401b0380841690851611156123685761236183856135ea565b9050612375565b61237284846135ea565b90505b60408051608081018252600284015480825260038501546001600160401b038082166020850152600160401b8204811694840194909452600160801b90049092166060820152429115806123e25750600184015481516123de916001600160401b03169061327b565b8210155b1561240a576001600160401b0380841660608301528282526040820151166020820152612429565b828160600181815161241c9190612ee8565b6001600160401b03169052505b6060810151612439906064612f2a565b602082015160018601546001600160401b0392909216916124649190600160401b900460ff16612f2a565b6001600160401b0316101561249d57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b85816040018181516124af9190612ee8565b6001600160401b03169052506040810180518691906124cf9083906135ea565b6001600160401b0316905250600184015460408201516064916124fd91600160401b90910460ff1690612f2a565b6001600160401b03161015612536576040808201519051633e1a785160e01b81526001600160401b039091166004820152602401610499565b8051600285015560208101516003909401805460408301516060909301516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b0319909316919097161717919091169390931790925550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b9057604051631afcd79f60e31b815260040160405180910390fd5b6125ef61259e565b6125f7612686565b61118c8161268e565b61260861259e565b61118c81612776565b5f8181525f805160206136668339815191526020526040812060020180545f80516020613646833981519152919060089061265b90600160401b90046001600160401b031661360a565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610b9061259e565b61269661259e565b80355f8051602061364683398151915290815560146126bb6060840160408501613625565b60ff1611806126da57506126d56060830160408401613625565b60ff16155b1561270e576126ef6060830160408401613625565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b61271e6060830160408401613625565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561274f6040830160208401613262565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61115a61259e565b50805461278a90612ad9565b5f825580601f10612799575050565b601f0160209004905f5260205f209081019061118c91906127f2565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612806575f81556001016127f3565b5090565b5f6020828403121561281a575f80fd5b5035919050565b803563ffffffff81168114612834575f80fd5b919050565b5f806040838503121561284a575f80fd5b82356001600160401b0381111561285f575f80fd5b830160808186031215612870575f80fd5b915061287e60208401612821565b90509250929050565b5f60208284031215612897575f80fd5b610bba82612821565b80356001600160401b0381168114612834575f80fd5b5f80604083850312156128c7575f80fd5b82356001600160401b038111156128dc575f80fd5b830160a081860312156128ed575f80fd5b915061287e602084016128a0565b6001600160a01b038116811461118c575f80fd5b5f808284036080811215612921575f80fd5b606081121561292e575f80fd5b508291506060830135612940816128fb565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b6006811061297b57634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612999578181015183820152602001612981565b50505f910152565b5f81518084526129b881602086016020860161297f565b601f01601f19169290920160200192915050565b602081526129de60208201835161295f565b5f602083015160e060408401526129f96101008401826129a1565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612a5c575f80fd5b8135612a67816128fb565b9392505050565b5f8060208385031215612a7f575f80fd5b82356001600160401b0380821115612a95575f80fd5b818501915085601f830112612aa8575f80fd5b813581811115612ab6575f80fd5b866020828501011115612ac7575f80fd5b60209290920196919550909350505050565b600181811c90821680612aed57607f821691505b602082108103612b0b57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610bbd828461295f565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612b5557612b55612b1f565b60405290565b604080519081016001600160401b0381118282101715612b5557612b55612b1f565b604051601f8201601f191681016001600160401b0381118282101715612ba557612ba5612b1f565b604052919050565b5f6001600160401b03821115612bc557612bc5612b1f565b50601f01601f191660200190565b5f82601f830112612be2575f80fd5b8151612bf5612bf082612bad565b612b7d565b818152846020838601011115612c09575f80fd5b612c1a82602083016020870161297f565b949350505050565b5f60208284031215612c32575f80fd5b81516001600160401b03811115612c47575f80fd5b612c1a84828501612bd3565b602081525f610bba60208301846129a1565b5f60208284031215612c75575f80fd5b5051919050565b5f808335601e19843603018112612c91575f80fd5b8301803591506001600160401b03821115612caa575f80fd5b6020019150600581901b36038213156121c4575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612ce9575f80fd5b9190910192915050565b5f82601f830112612d02575f80fd5b8135612d10612bf082612bad565b818152846020838601011115612d24575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215612d50575f80fd5b612d58612b33565b82356001600160401b0380821115612d6e575f80fd5b612d7a36838701612cf3565b83526020850135915080821115612d8f575f80fd5b50612d9c36828601612cf3565b602083015250612dae604084016128a0565b604082015292915050565b5f8251612ce981846020870161297f565b601f821115610b6657805f5260205f20601f840160051c81016020851015612def5750805b601f840160051c820191505b81811015612e0e575f8155600101612dfb565b5050505050565b81516001600160401b03811115612e2e57612e2e612b1f565b612e4281612e3c8454612ad9565b84612dca565b602080601f831160018114612e75575f8415612e5e5750858301515b5f19600386901b1c1916600185901b178555612ecc565b5f85815260208120601f198616915b82811015612ea357888601518255948401946001909101908401612e84565b5085821015612ec057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156112f9576112f9612ed4565b5f63ffffffff808316818103612f2057612f20612ed4565b6001019392505050565b6001600160401b03818116838216028082169190828114612f4d57612f4d612ed4565b505092915050565b5f808335601e19843603018112612f6a575f80fd5b83016020810192503590506001600160401b03811115612f88575f80fd5b8036038213156121c4575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b8781101561306b57848303601f19018952813536889003605e19018112612ffa575f80fd5b870160606130088280612f55565b8287526130188388018284612f96565b9250505061302886830183612f55565b8683038888015261303a838284612f96565b9250505060406001600160401b036130538285016128a0565b16950194909452509783019790830190600101612fd5565b5090979650505050505050565b6020815281356020820152602082013560408201525f604083013561309c816128fb565b6001600160a01b031660608381019190915283013536849003601e190181126130c3575f80fd5b83016020810190356001600160401b038111156130de575f80fd5b8060051b36038213156130ef575f80fd5b60808085015261310360a085018284612fbe565b95945050505050565b80518015158114612834575f80fd5b5f806040838503121561312c575f80fd5b8251915061287e6020840161310c565b5f60208083525f845461314e81612ad9565b806020870152604060018084165f811461316f576001811461318b576131b8565b60ff19851660408a0152604084151560051b8a010195506131b8565b895f5260205f205f5b858110156131af5781548b8201860152908301908801613194565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b5f80604083850312156131e6575f80fd5b82516001600160401b03808211156131fc575f80fd5b908401906060828703121561320f575f80fd5b613217612b33565b825181526020830151613229816128fb565b602082015260408301518281111561323f575f80fd5b61324b88828601612bd3565b604083015250935061287e9150506020840161310c565b5f60208284031215613272575f80fd5b610bba826128a0565b80820180821115610bbd57610bbd612ed4565b5f8235603e19833603018112612ce9575f80fd5b5f808335601e198436030181126132b7575f80fd5b8301803591506001600160401b038211156132d0575f80fd5b6020019150368190038213156121c4575f80fd5b602081525f612c1a602083018486612f96565b5f60408236031215613307575f80fd5b61330f612b5b565b61331883612821565b81526020808401356001600160401b0380821115613334575f80fd5b9085019036601f830112613346575f80fd5b81358181111561335857613358612b1f565b8060051b9150613369848301612b7d565b8181529183018401918481019036841115613382575f80fd5b938501935b838510156133ac578435925061339c836128fb565b8282529385019390850190613387565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b808310156134195784516001600160a01b031682529383019360019290920191908301906133f0565b509695505050505050565b60208152815160208201525f602083015160e0604084015261344a6101008401826129a1565b90506040840151601f198085840301606086015261346883836129a1565b92506001600160401b03606087015116608086015260808601519150808584030160a086015261349883836133be565b925060a08601519150808584030160c0860152506134b682826133be565b91505060c08401516134d360e08501826001600160401b03169052565b509392505050565b5f80604083850312156134ec575f80fd5b8251915060208301516001600160401b03811115613508575f80fd5b61351485828601612bd3565b9150509250929050565b6001600160401b0383111561353557613535612b1f565b613549836135438354612ad9565b83612dca565b5f601f84116001811461357a575f85156135635750838201355b5f19600387901b1c1916600186901b178355612e0e565b5f83815260208120601f198716915b828110156135a95786850135825560209485019460019092019101613589565b50868210156135c5575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81810381811115610bbd57610bbd612ed4565b6001600160401b038281168282160390808211156112f9576112f9612ed4565b5f6001600160401b03808316818103612f2057612f20612ed4565b5f60208284031215613635575f80fd5b813560ff81168114612a67575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05a264697066735822122007bd4cddc3bbe2253b823d40d3b6713e559cad02b19b6941689bf62d91393e5c64736f6c63430008190033", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -2031,8 +2031,8 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorWeightUpd // ValidatorMessagesMetaData contains all meta data concerning the ValidatorMessages contract. var ValidatorMessagesMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"InvalidBLSPublicKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"}],\"name\":\"InvalidCodecID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"actual\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"}],\"name\":\"InvalidMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageType\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"}],\"name\":\"packConversionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"valid\",\"type\":\"bool\"}],\"name\":\"packL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"packL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"validationPeriod\",\"type\":\"tuple\"}],\"name\":\"packRegisterL1ValidatorMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"conversionID\",\"type\":\"bytes32\"}],\"name\":\"packSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"packValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackRegisterL1ValidatorMessage\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x61217b610034600b8282823980515f1a607314602857634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100b1575f3560e01c8063854a893f11610079578063854a893f146101b257806387418b8e1461020f5780639b83546514610222578063a699c13514610242578063e1d68f3014610255578063eb97ce5114610268575f80fd5b8063021de88f146100b5578063088c2463146100e25780634d8478841461011257806350782b0f146101335780637f7c427a1461016b575b5f80fd5b6100c86100c33660046118a9565b610289565b604080519283529015156020830152015b60405180910390f35b6100f56100f03660046118a9565b61044a565b604080519283526001600160401b039091166020830152016100d9565b6101256101203660046118a9565b61063b565b6040519081526020016100d9565b6101466101413660046118a9565b6107c8565b604080519384526001600160401b0392831660208501529116908201526060016100d9565b6101a56101793660046118e2565b604080515f60208201819052602282015260268082019390935281518082039093018352604601905290565b6040516100d99190611946565b6101a56101c036600461197a565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6101a561021d3660046119eb565b610a1e565b6102356102303660046118a9565b610b60565b6040516100d99190611bb4565b6101a5610250366004611c6b565b6114ab565b6101a5610263366004611c9d565b6114ef565b61027b610276366004611d80565b611525565b6040516100d9929190611e7c565b5f8082516027146102c457825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044015b60405180910390fd5b5f805b6002811015610313576102db816001611ea8565b6102e6906008611ebb565b61ffff168582815181106102fc576102fc611ed2565b016020015160f81c901b91909117906001016102c7565b5061ffff81161561033d5760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561039857610354816003611ea8565b61035f906008611ebb565b63ffffffff1686610371836002611ee6565b8151811061038157610381611ed2565b016020015160f81c901b9190911790600101610340565b5063ffffffff81166002146103c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015610415576103d781601f611ea8565b6103e2906008611ebb565b876103ee836006611ee6565b815181106103fe576103fe611ed2565b016020015160f81c901b91909117906001016103c3565b505f8660268151811061042a5761042a611ed2565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461048057825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016102bb565b5f805b60028110156104cf57610497816001611ea8565b6104a2906008611ebb565b61ffff168582815181106104b8576104b8611ed2565b016020015160f81c901b9190911790600101610483565b5061ffff8116156104f95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561055457610510816003611ea8565b61051b906008611ebb565b63ffffffff168661052d836002611ee6565b8151811061053d5761053d611ed2565b016020015160f81c901b91909117906001016104fc565b5063ffffffff81161561057a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156105cf5761059181601f611ea8565b61059c906008611ebb565b876105a8836006611ee6565b815181106105b8576105b8611ed2565b016020015160f81c901b919091179060010161057d565b505f805b600881101561062e576105e7816007611ea8565b6105f2906008611ebb565b6001600160401b031688610607836026611ee6565b8151811061061757610617611ed2565b016020015160f81c901b91909117906001016105d3565b5090969095509350505050565b5f815160261461067057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016102bb565b5f805b60028110156106bf57610687816001611ea8565b610692906008611ebb565b61ffff168482815181106106a8576106a8611ed2565b016020015160f81c901b9190911790600101610673565b5061ffff8116156106e95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561074457610700816003611ea8565b61070b906008611ebb565b63ffffffff168561071d836002611ee6565b8151811061072d5761072d611ed2565b016020015160f81c901b91909117906001016106ec565b5063ffffffff81161561076a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156107bf5761078181601f611ea8565b61078c906008611ebb565b86610798836006611ee6565b815181106107a8576107a8611ed2565b016020015160f81c901b919091179060010161076d565b50949350505050565b5f805f83516036146107ff57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016102bb565b5f805b600281101561084e57610816816001611ea8565b610821906008611ebb565b61ffff1686828151811061083757610837611ed2565b016020015160f81c901b9190911790600101610802565b5061ffff8116156108785760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b60048110156108d35761088f816003611ea8565b61089a906008611ebb565b63ffffffff16876108ac836002611ee6565b815181106108bc576108bc611ed2565b016020015160f81c901b919091179060010161087b565b5063ffffffff81166003146108fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156109505761091281601f611ea8565b61091d906008611ebb565b88610929836006611ee6565b8151811061093957610939611ed2565b016020015160f81c901b91909117906001016108fe565b505f805b60088110156109af57610968816007611ea8565b610973906008611ebb565b6001600160401b031689610988836026611ee6565b8151811061099857610998611ed2565b016020015160f81c901b9190911790600101610954565b505f805b6008811015610a0e576109c7816007611ea8565b6109d2906008611ebb565b6001600160401b03168a6109e783602e611ee6565b815181106109f7576109f7611ed2565b016020015160f81c901b91909117906001016109b3565b5091989097509095509350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b836060015151811015610b59578184606001518281518110610aba57610aba611ed2565b60200260200101515f01515185606001518381518110610adc57610adc611ed2565b60200260200101515f015186606001518481518110610afd57610afd611ed2565b60200260200101516020015187606001518581518110610b1f57610b1f611ed2565b602002602001015160400151604051602001610b3f959493929190611ef9565b60408051601f198184030181529190529150600101610a96565b5092915050565b610b68611712565b5f610b71611712565b5f805b6002811015610bcf57610b88816001611ea8565b610b93906008611ebb565b61ffff1686610ba863ffffffff871684611ee6565b81518110610bb857610bb8611ed2565b016020015160f81c901b9190911790600101610b74565b5061ffff811615610bf95760405163407b587360e01b815261ffff821660048201526024016102bb565b610c04600284611f72565b9250505f805b6004811015610c6957610c1e816003611ea8565b610c29906008611ebb565b63ffffffff16868563ffffffff1683610c429190611ee6565b81518110610c5257610c52611ed2565b016020015160f81c901b9190911790600101610c0a565b5063ffffffff8116600114610c9157604051635b60892f60e01b815260040160405180910390fd5b610c9c600484611f72565b9250505f805b6020811015610cf957610cb681601f611ea8565b610cc1906008611ebb565b86610cd263ffffffff871684611ee6565b81518110610ce257610ce2611ed2565b016020015160f81c901b9190911790600101610ca2565b50808252610d08602084611f72565b9250505f805b6004811015610d6d57610d22816003611ea8565b610d2d906008611ebb565b63ffffffff16868563ffffffff1683610d469190611ee6565b81518110610d5657610d56611ed2565b016020015160f81c901b9190911790600101610d0e565b50610d79600484611f72565b92505f8163ffffffff166001600160401b03811115610d9a57610d9a61176c565b6040519080825280601f01601f191660200182016040528015610dc4576020820181803683370190505b5090505f5b8263ffffffff16811015610e335786610de863ffffffff871683611ee6565b81518110610df857610df8611ed2565b602001015160f81c60f81b828281518110610e1557610e15611ed2565b60200101906001600160f81b03191690815f1a905350600101610dc9565b5060208301819052610e458285611f72565b604080516030808252606082019092529195505f92506020820181803683370190505090505f5b6030811015610ed15786610e8663ffffffff871683611ee6565b81518110610e9657610e96611ed2565b602001015160f81c60f81b828281518110610eb357610eb3611ed2565b60200101906001600160f81b03191690815f1a905350600101610e6c565b5060408301819052610ee4603085611f72565b9350505f805b6008811015610f4a57610efe816007611ea8565b610f09906008611ebb565b6001600160401b031687610f2363ffffffff881684611ee6565b81518110610f3357610f33611ed2565b016020015160f81c901b9190911790600101610eea565b506001600160401b0381166060840152610f65600885611f72565b9350505f805f5b6004811015610fcb57610f80816003611ea8565b610f8b906008611ebb565b63ffffffff16888763ffffffff1683610fa49190611ee6565b81518110610fb457610fb4611ed2565b016020015160f81c901b9190911790600101610f6c565b50610fd7600486611f72565b94505f5b600481101561103a57610fef816003611ea8565b610ffa906008611ebb565b63ffffffff16888763ffffffff16836110139190611ee6565b8151811061102357611023611ed2565b016020015160f81c901b9290921791600101610fdb565b50611046600486611f72565b94505f8263ffffffff166001600160401b038111156110675761106761176c565b604051908082528060200260200182016040528015611090578160200160208202803683370190505b5090505f5b8363ffffffff16811015611178576040805160148082528183019092525f916020820181803683370190505090505f5b601481101561112a578a6110df63ffffffff8b1683611ee6565b815181106110ef576110ef611ed2565b602001015160f81c60f81b82828151811061110c5761110c611ed2565b60200101906001600160f81b03191690815f1a9053506001016110c5565b505f601482015190508084848151811061114657611146611ed2565b6001600160a01b039092166020928302919091019091015261116960148a611f72565b98505050806001019050611095565b506040805180820190915263ffffffff9092168252602082015260808401525f80805b60048110156111fa576111af816003611ea8565b6111ba906008611ebb565b63ffffffff16898863ffffffff16836111d39190611ee6565b815181106111e3576111e3611ed2565b016020015160f81c901b919091179060010161119b565b50611206600487611f72565b95505f5b60048110156112695761121e816003611ea8565b611229906008611ebb565b63ffffffff16898863ffffffff16836112429190611ee6565b8151811061125257611252611ed2565b016020015160f81c901b929092179160010161120a565b50611275600487611f72565b95505f8263ffffffff166001600160401b038111156112965761129661176c565b6040519080825280602002602001820160405280156112bf578160200160208202803683370190505b5090505f5b8363ffffffff168110156113a7576040805160148082528183019092525f916020820181803683370190505090505f5b6014811015611359578b61130e63ffffffff8c1683611ee6565b8151811061131e5761131e611ed2565b602001015160f81c60f81b82828151811061133b5761133b611ed2565b60200101906001600160f81b03191690815f1a9053506001016112f4565b505f601482015190508084848151811061137557611375611ed2565b6001600160a01b039092166020928302919091019091015261139860148b611f72565b995050508060010190506112c4565b506040805180820190915263ffffffff9092168252602082015260a08501525f6113d18284611f72565b6113dc906014611f8f565b6113e785607a611f72565b6113f19190611f72565b90508063ffffffff1688511461142d57875160405163cc92daa160e01b815263ffffffff918216600482015290821660248201526044016102bb565b5f805b600881101561149057611444816007611ea8565b61144f906008611ebb565b6001600160401b03168a61146963ffffffff8b1684611ee6565b8151811061147957611479611ed2565b016020015160f81c901b9190911790600101611430565b506001600160401b031660c086015250929695505050505050565b6040515f6020820152600160e11b60228201526026810183905281151560f81b60468201526060906047015b60405160208183030381529060405290505b92915050565b6040515f602082018190526022820152602681018390526001600160c01b031960c083901b166046820152606090604e016114d7565b5f606082604001515160301461154e5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861158f988a986001989297929690959094909390929101611fb7565b60405160208183030381529060405290505f5b84608001516020015151811015611601578185608001516020015182815181106115ce576115ce611ed2565b60200260200101516040516020016115e7929190612071565b60408051601f1981840301815291905291506001016115a2565b5060a08401518051602091820151516040516116219385939291016120a7565b60405160208183030381529060405290505f5b8460a00151602001515181101561169357818560a0015160200151828151811061166057611660611ed2565b6020026020010151604051602001611679929190612071565b60408051601f198184030181529190529150600101611634565b5060c08401516040516116aa9183916020016120e2565b60405160208183030381529060405290506002816040516116cb9190612113565b602060405180830381855afa1580156116e6573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611709919061212e565b94909350915050565b6040805160e0810182525f808252606060208084018290528385018290528184018390528451808601865283815280820183905260808501528451808601909552918452908301529060a082019081525f60209091015290565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156117a2576117a261176c565b60405290565b604051606081016001600160401b03811182821017156117a2576117a261176c565b604080519081016001600160401b03811182821017156117a2576117a261176c565b60405160e081016001600160401b03811182821017156117a2576117a261176c565b604051601f8201601f191681016001600160401b03811182821017156118365761183661176c565b604052919050565b5f82601f83011261184d575f80fd5b81356001600160401b038111156118665761186661176c565b611879601f8201601f191660200161180e565b81815284602083860101111561188d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156118b9575f80fd5b81356001600160401b038111156118ce575f80fd5b6118da8482850161183e565b949350505050565b5f602082840312156118f2575f80fd5b5035919050565b5f5b838110156119135781810151838201526020016118fb565b50505f910152565b5f81518084526119328160208601602086016118f9565b601f01601f19169290920160200192915050565b602081525f611958602083018461191b565b9392505050565b80356001600160401b0381168114611975575f80fd5b919050565b5f805f6060848603121561198c575f80fd5b8335925061199c6020850161195f565b91506119aa6040850161195f565b90509250925092565b80356001600160a01b0381168114611975575f80fd5b5f6001600160401b038211156119e1576119e161176c565b5060051b60200190565b5f60208083850312156119fc575f80fd5b82356001600160401b0380821115611a12575f80fd5b9084019060808287031215611a25575f80fd5b611a2d611780565b823581528383013584820152611a45604084016119b3565b604082015260608084013583811115611a5c575f80fd5b80850194505087601f850112611a70575f80fd5b8335611a83611a7e826119c9565b61180e565b81815260059190911b8501860190868101908a831115611aa1575f80fd5b8787015b83811015611b3a57803587811115611abb575f80fd5b8801808d03601f1901861315611acf575f80fd5b611ad76117a8565b8a82013589811115611ae7575f80fd5b611af58f8d8386010161183e565b825250604082013589811115611b09575f80fd5b611b178f8d8386010161183e565b8c83015250611b2787830161195f565b6040820152845250918801918801611aa5565b506060850152509198975050505050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015611ba95784516001600160a01b03168252938301936001929092019190830190611b80565b509695505050505050565b60208152815160208201525f602083015160e06040840152611bda61010084018261191b565b90506040840151601f1980858403016060860152611bf8838361191b565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152611c288383611b4e565b925060a08601519150808584030160c086015250611c468282611b4e565b91505060c0840151611c6360e08501826001600160401b03169052565b509392505050565b5f8060408385031215611c7c575f80fd5b8235915060208301358015158114611c92575f80fd5b809150509250929050565b5f8060408385031215611cae575f80fd5b82359150611cbe6020840161195f565b90509250929050565b5f60408284031215611cd7575f80fd5b611cdf6117ca565b9050813563ffffffff81168114611cf4575f80fd5b81526020828101356001600160401b03811115611d0f575f80fd5b8301601f81018513611d1f575f80fd5b8035611d2d611a7e826119c9565b81815260059190911b82018301908381019087831115611d4b575f80fd5b928401925b82841015611d7057611d61846119b3565b82529284019290840190611d50565b8085870152505050505092915050565b5f60208284031215611d90575f80fd5b81356001600160401b0380821115611da6575f80fd5b9083019060e08286031215611db9575f80fd5b611dc16117ec565b82358152602083013582811115611dd6575f80fd5b611de28782860161183e565b602083015250604083013582811115611df9575f80fd5b611e058782860161183e565b604083015250611e176060840161195f565b6060820152608083013582811115611e2d575f80fd5b611e3987828601611cc7565b60808301525060a083013582811115611e50575f80fd5b611e5c87828601611cc7565b60a083015250611e6e60c0840161195f565b60c082015295945050505050565b828152604060208201525f6118da604083018461191b565b634e487b7160e01b5f52601160045260245ffd5b818103818111156114e9576114e9611e94565b80820281158282048414176114e9576114e9611e94565b634e487b7160e01b5f52603260045260245ffd5b808201808211156114e9576114e9611e94565b5f8651611f0a818460208b016118f9565b60e087901b6001600160e01b0319169083019081528551611f32816004840160208a016118f9565b8551910190611f488160048401602089016118f9565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b63ffffffff818116838216019080821115610b5957610b59611e94565b63ffffffff818116838216028082169190828114611faf57611faf611e94565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651611ffd81602a850160208b016118f9565b86519083019061201481602a840160208b016118f9565b60c087901b6001600160c01b031916602a9290910191820152612046603282018660e01b6001600160e01b0319169052565b61205f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516120828184602088016118f9565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516120b88184602089016118f9565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516120f38184602088016118f9565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f82516121248184602087016118f9565b9190910192915050565b5f6020828403121561213e575f80fd5b505191905056fea26469706673582212203eff6412f7c7baf5a74defc914c1b4770aa5110fc94bc4e80bc185b10586511764736f6c63430008190033", + ABI: "[{\"inputs\":[],\"name\":\"InvalidBLSPublicKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"}],\"name\":\"InvalidCodecID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"actual\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"}],\"name\":\"InvalidMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageType\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"}],\"name\":\"packConversionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"valid\",\"type\":\"bool\"}],\"name\":\"packL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"packL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"validationPeriod\",\"type\":\"tuple\"}],\"name\":\"packRegisterL1ValidatorMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"conversionID\",\"type\":\"bytes32\"}],\"name\":\"packSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"packValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackRegisterL1ValidatorMessage\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x61217b610034600b8282823980515f1a607314602857634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100b1575f3560e01c8063854a893f11610079578063854a893f146101b257806387418b8e1461020f5780639b83546514610222578063a699c13514610242578063e1d68f3014610255578063eb97ce5114610268575f80fd5b8063021de88f146100b5578063088c2463146100e25780634d8478841461011257806350782b0f146101335780637f7c427a1461016b575b5f80fd5b6100c86100c33660046118a9565b610289565b604080519283529015156020830152015b60405180910390f35b6100f56100f03660046118a9565b61044a565b604080519283526001600160401b039091166020830152016100d9565b6101256101203660046118a9565b61063b565b6040519081526020016100d9565b6101466101413660046118a9565b6107c8565b604080519384526001600160401b0392831660208501529116908201526060016100d9565b6101a56101793660046118e2565b604080515f60208201819052602282015260268082019390935281518082039093018352604601905290565b6040516100d99190611946565b6101a56101c036600461197a565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6101a561021d3660046119eb565b610a1e565b6102356102303660046118a9565b610b60565b6040516100d99190611bb4565b6101a5610250366004611c6b565b6114ab565b6101a5610263366004611c9d565b6114ef565b61027b610276366004611d80565b611525565b6040516100d9929190611e7c565b5f8082516027146102c457825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044015b60405180910390fd5b5f805b6002811015610313576102db816001611ea8565b6102e6906008611ebb565b61ffff168582815181106102fc576102fc611ed2565b016020015160f81c901b91909117906001016102c7565b5061ffff81161561033d5760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561039857610354816003611ea8565b61035f906008611ebb565b63ffffffff1686610371836002611ee6565b8151811061038157610381611ed2565b016020015160f81c901b9190911790600101610340565b5063ffffffff81166002146103c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015610415576103d781601f611ea8565b6103e2906008611ebb565b876103ee836006611ee6565b815181106103fe576103fe611ed2565b016020015160f81c901b91909117906001016103c3565b505f8660268151811061042a5761042a611ed2565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461048057825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016102bb565b5f805b60028110156104cf57610497816001611ea8565b6104a2906008611ebb565b61ffff168582815181106104b8576104b8611ed2565b016020015160f81c901b9190911790600101610483565b5061ffff8116156104f95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561055457610510816003611ea8565b61051b906008611ebb565b63ffffffff168661052d836002611ee6565b8151811061053d5761053d611ed2565b016020015160f81c901b91909117906001016104fc565b5063ffffffff81161561057a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156105cf5761059181601f611ea8565b61059c906008611ebb565b876105a8836006611ee6565b815181106105b8576105b8611ed2565b016020015160f81c901b919091179060010161057d565b505f805b600881101561062e576105e7816007611ea8565b6105f2906008611ebb565b6001600160401b031688610607836026611ee6565b8151811061061757610617611ed2565b016020015160f81c901b91909117906001016105d3565b5090969095509350505050565b5f815160261461067057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016102bb565b5f805b60028110156106bf57610687816001611ea8565b610692906008611ebb565b61ffff168482815181106106a8576106a8611ed2565b016020015160f81c901b9190911790600101610673565b5061ffff8116156106e95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561074457610700816003611ea8565b61070b906008611ebb565b63ffffffff168561071d836002611ee6565b8151811061072d5761072d611ed2565b016020015160f81c901b91909117906001016106ec565b5063ffffffff81161561076a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156107bf5761078181601f611ea8565b61078c906008611ebb565b86610798836006611ee6565b815181106107a8576107a8611ed2565b016020015160f81c901b919091179060010161076d565b50949350505050565b5f805f83516036146107ff57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016102bb565b5f805b600281101561084e57610816816001611ea8565b610821906008611ebb565b61ffff1686828151811061083757610837611ed2565b016020015160f81c901b9190911790600101610802565b5061ffff8116156108785760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b60048110156108d35761088f816003611ea8565b61089a906008611ebb565b63ffffffff16876108ac836002611ee6565b815181106108bc576108bc611ed2565b016020015160f81c901b919091179060010161087b565b5063ffffffff81166003146108fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156109505761091281601f611ea8565b61091d906008611ebb565b88610929836006611ee6565b8151811061093957610939611ed2565b016020015160f81c901b91909117906001016108fe565b505f805b60088110156109af57610968816007611ea8565b610973906008611ebb565b6001600160401b031689610988836026611ee6565b8151811061099857610998611ed2565b016020015160f81c901b9190911790600101610954565b505f805b6008811015610a0e576109c7816007611ea8565b6109d2906008611ebb565b6001600160401b03168a6109e783602e611ee6565b815181106109f7576109f7611ed2565b016020015160f81c901b91909117906001016109b3565b5091989097509095509350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b836060015151811015610b59578184606001518281518110610aba57610aba611ed2565b60200260200101515f01515185606001518381518110610adc57610adc611ed2565b60200260200101515f015186606001518481518110610afd57610afd611ed2565b60200260200101516020015187606001518581518110610b1f57610b1f611ed2565b602002602001015160400151604051602001610b3f959493929190611ef9565b60408051601f198184030181529190529150600101610a96565b5092915050565b610b68611712565b5f610b71611712565b5f805b6002811015610bcf57610b88816001611ea8565b610b93906008611ebb565b61ffff1686610ba863ffffffff871684611ee6565b81518110610bb857610bb8611ed2565b016020015160f81c901b9190911790600101610b74565b5061ffff811615610bf95760405163407b587360e01b815261ffff821660048201526024016102bb565b610c04600284611f72565b9250505f805b6004811015610c6957610c1e816003611ea8565b610c29906008611ebb565b63ffffffff16868563ffffffff1683610c429190611ee6565b81518110610c5257610c52611ed2565b016020015160f81c901b9190911790600101610c0a565b5063ffffffff8116600114610c9157604051635b60892f60e01b815260040160405180910390fd5b610c9c600484611f72565b9250505f805b6020811015610cf957610cb681601f611ea8565b610cc1906008611ebb565b86610cd263ffffffff871684611ee6565b81518110610ce257610ce2611ed2565b016020015160f81c901b9190911790600101610ca2565b50808252610d08602084611f72565b9250505f805b6004811015610d6d57610d22816003611ea8565b610d2d906008611ebb565b63ffffffff16868563ffffffff1683610d469190611ee6565b81518110610d5657610d56611ed2565b016020015160f81c901b9190911790600101610d0e565b50610d79600484611f72565b92505f8163ffffffff166001600160401b03811115610d9a57610d9a61176c565b6040519080825280601f01601f191660200182016040528015610dc4576020820181803683370190505b5090505f5b8263ffffffff16811015610e335786610de863ffffffff871683611ee6565b81518110610df857610df8611ed2565b602001015160f81c60f81b828281518110610e1557610e15611ed2565b60200101906001600160f81b03191690815f1a905350600101610dc9565b5060208301819052610e458285611f72565b604080516030808252606082019092529195505f92506020820181803683370190505090505f5b6030811015610ed15786610e8663ffffffff871683611ee6565b81518110610e9657610e96611ed2565b602001015160f81c60f81b828281518110610eb357610eb3611ed2565b60200101906001600160f81b03191690815f1a905350600101610e6c565b5060408301819052610ee4603085611f72565b9350505f805b6008811015610f4a57610efe816007611ea8565b610f09906008611ebb565b6001600160401b031687610f2363ffffffff881684611ee6565b81518110610f3357610f33611ed2565b016020015160f81c901b9190911790600101610eea565b506001600160401b0381166060840152610f65600885611f72565b9350505f805f5b6004811015610fcb57610f80816003611ea8565b610f8b906008611ebb565b63ffffffff16888763ffffffff1683610fa49190611ee6565b81518110610fb457610fb4611ed2565b016020015160f81c901b9190911790600101610f6c565b50610fd7600486611f72565b94505f5b600481101561103a57610fef816003611ea8565b610ffa906008611ebb565b63ffffffff16888763ffffffff16836110139190611ee6565b8151811061102357611023611ed2565b016020015160f81c901b9290921791600101610fdb565b50611046600486611f72565b94505f8263ffffffff166001600160401b038111156110675761106761176c565b604051908082528060200260200182016040528015611090578160200160208202803683370190505b5090505f5b8363ffffffff16811015611178576040805160148082528183019092525f916020820181803683370190505090505f5b601481101561112a578a6110df63ffffffff8b1683611ee6565b815181106110ef576110ef611ed2565b602001015160f81c60f81b82828151811061110c5761110c611ed2565b60200101906001600160f81b03191690815f1a9053506001016110c5565b505f601482015190508084848151811061114657611146611ed2565b6001600160a01b039092166020928302919091019091015261116960148a611f72565b98505050806001019050611095565b506040805180820190915263ffffffff9092168252602082015260808401525f80805b60048110156111fa576111af816003611ea8565b6111ba906008611ebb565b63ffffffff16898863ffffffff16836111d39190611ee6565b815181106111e3576111e3611ed2565b016020015160f81c901b919091179060010161119b565b50611206600487611f72565b95505f5b60048110156112695761121e816003611ea8565b611229906008611ebb565b63ffffffff16898863ffffffff16836112429190611ee6565b8151811061125257611252611ed2565b016020015160f81c901b929092179160010161120a565b50611275600487611f72565b95505f8263ffffffff166001600160401b038111156112965761129661176c565b6040519080825280602002602001820160405280156112bf578160200160208202803683370190505b5090505f5b8363ffffffff168110156113a7576040805160148082528183019092525f916020820181803683370190505090505f5b6014811015611359578b61130e63ffffffff8c1683611ee6565b8151811061131e5761131e611ed2565b602001015160f81c60f81b82828151811061133b5761133b611ed2565b60200101906001600160f81b03191690815f1a9053506001016112f4565b505f601482015190508084848151811061137557611375611ed2565b6001600160a01b039092166020928302919091019091015261139860148b611f72565b995050508060010190506112c4565b506040805180820190915263ffffffff9092168252602082015260a08501525f6113d18284611f72565b6113dc906014611f8f565b6113e785607a611f72565b6113f19190611f72565b90508063ffffffff1688511461142d57875160405163cc92daa160e01b815263ffffffff918216600482015290821660248201526044016102bb565b5f805b600881101561149057611444816007611ea8565b61144f906008611ebb565b6001600160401b03168a61146963ffffffff8b1684611ee6565b8151811061147957611479611ed2565b016020015160f81c901b9190911790600101611430565b506001600160401b031660c086015250929695505050505050565b6040515f6020820152600160e11b60228201526026810183905281151560f81b60468201526060906047015b60405160208183030381529060405290505b92915050565b6040515f602082018190526022820152602681018390526001600160c01b031960c083901b166046820152606090604e016114d7565b5f606082604001515160301461154e5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861158f988a986001989297929690959094909390929101611fb7565b60405160208183030381529060405290505f5b84608001516020015151811015611601578185608001516020015182815181106115ce576115ce611ed2565b60200260200101516040516020016115e7929190612071565b60408051601f1981840301815291905291506001016115a2565b5060a08401518051602091820151516040516116219385939291016120a7565b60405160208183030381529060405290505f5b8460a00151602001515181101561169357818560a0015160200151828151811061166057611660611ed2565b6020026020010151604051602001611679929190612071565b60408051601f198184030181529190529150600101611634565b5060c08401516040516116aa9183916020016120e2565b60405160208183030381529060405290506002816040516116cb9190612113565b602060405180830381855afa1580156116e6573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611709919061212e565b94909350915050565b6040805160e0810182525f808252606060208084018290528385018290528184018390528451808601865283815280820183905260808501528451808601909552918452908301529060a082019081525f60209091015290565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156117a2576117a261176c565b60405290565b604051606081016001600160401b03811182821017156117a2576117a261176c565b604080519081016001600160401b03811182821017156117a2576117a261176c565b60405160e081016001600160401b03811182821017156117a2576117a261176c565b604051601f8201601f191681016001600160401b03811182821017156118365761183661176c565b604052919050565b5f82601f83011261184d575f80fd5b81356001600160401b038111156118665761186661176c565b611879601f8201601f191660200161180e565b81815284602083860101111561188d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156118b9575f80fd5b81356001600160401b038111156118ce575f80fd5b6118da8482850161183e565b949350505050565b5f602082840312156118f2575f80fd5b5035919050565b5f5b838110156119135781810151838201526020016118fb565b50505f910152565b5f81518084526119328160208601602086016118f9565b601f01601f19169290920160200192915050565b602081525f611958602083018461191b565b9392505050565b80356001600160401b0381168114611975575f80fd5b919050565b5f805f6060848603121561198c575f80fd5b8335925061199c6020850161195f565b91506119aa6040850161195f565b90509250925092565b80356001600160a01b0381168114611975575f80fd5b5f6001600160401b038211156119e1576119e161176c565b5060051b60200190565b5f60208083850312156119fc575f80fd5b82356001600160401b0380821115611a12575f80fd5b9084019060808287031215611a25575f80fd5b611a2d611780565b823581528383013584820152611a45604084016119b3565b604082015260608084013583811115611a5c575f80fd5b80850194505087601f850112611a70575f80fd5b8335611a83611a7e826119c9565b61180e565b81815260059190911b8501860190868101908a831115611aa1575f80fd5b8787015b83811015611b3a57803587811115611abb575f80fd5b8801808d03601f1901861315611acf575f80fd5b611ad76117a8565b8a82013589811115611ae7575f80fd5b611af58f8d8386010161183e565b825250604082013589811115611b09575f80fd5b611b178f8d8386010161183e565b8c83015250611b2787830161195f565b6040820152845250918801918801611aa5565b506060850152509198975050505050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015611ba95784516001600160a01b03168252938301936001929092019190830190611b80565b509695505050505050565b60208152815160208201525f602083015160e06040840152611bda61010084018261191b565b90506040840151601f1980858403016060860152611bf8838361191b565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152611c288383611b4e565b925060a08601519150808584030160c086015250611c468282611b4e565b91505060c0840151611c6360e08501826001600160401b03169052565b509392505050565b5f8060408385031215611c7c575f80fd5b8235915060208301358015158114611c92575f80fd5b809150509250929050565b5f8060408385031215611cae575f80fd5b82359150611cbe6020840161195f565b90509250929050565b5f60408284031215611cd7575f80fd5b611cdf6117ca565b9050813563ffffffff81168114611cf4575f80fd5b81526020828101356001600160401b03811115611d0f575f80fd5b8301601f81018513611d1f575f80fd5b8035611d2d611a7e826119c9565b81815260059190911b82018301908381019087831115611d4b575f80fd5b928401925b82841015611d7057611d61846119b3565b82529284019290840190611d50565b8085870152505050505092915050565b5f60208284031215611d90575f80fd5b81356001600160401b0380821115611da6575f80fd5b9083019060e08286031215611db9575f80fd5b611dc16117ec565b82358152602083013582811115611dd6575f80fd5b611de28782860161183e565b602083015250604083013582811115611df9575f80fd5b611e058782860161183e565b604083015250611e176060840161195f565b6060820152608083013582811115611e2d575f80fd5b611e3987828601611cc7565b60808301525060a083013582811115611e50575f80fd5b611e5c87828601611cc7565b60a083015250611e6e60c0840161195f565b60c082015295945050505050565b828152604060208201525f6118da604083018461191b565b634e487b7160e01b5f52601160045260245ffd5b818103818111156114e9576114e9611e94565b80820281158282048414176114e9576114e9611e94565b634e487b7160e01b5f52603260045260245ffd5b808201808211156114e9576114e9611e94565b5f8651611f0a818460208b016118f9565b60e087901b6001600160e01b0319169083019081528551611f32816004840160208a016118f9565b8551910190611f488160048401602089016118f9565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b63ffffffff818116838216019080821115610b5957610b59611e94565b63ffffffff818116838216028082169190828114611faf57611faf611e94565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651611ffd81602a850160208b016118f9565b86519083019061201481602a840160208b016118f9565b60c087901b6001600160c01b031916602a9290910191820152612046603282018660e01b6001600160e01b0319169052565b61205f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516120828184602088016118f9565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516120b88184602089016118f9565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516120f38184602088016118f9565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f82516121248184602087016118f9565b9190910192915050565b5f6020828403121561213e575f80fd5b505191905056fea264697066735822122021bc83cb762d019261a415f663497547f82a60b24f9f9026058db0ae0972d18e64736f6c63430008190033", } // ValidatorMessagesABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/interfaces/IPoSValidatorManager/IPoSValidatorManager.go b/abi-bindings/go/validator-manager/interfaces/IPoSValidatorManager/IPoSValidatorManager.go index 5acc40a14..4e0a0ede3 100644 --- a/abi-bindings/go/validator-manager/interfaces/IPoSValidatorManager/IPoSValidatorManager.go +++ b/abi-bindings/go/validator-manager/interfaces/IPoSValidatorManager/IPoSValidatorManager.go @@ -31,7 +31,7 @@ var ( // ConversionData is an auto generated low-level Go binding around an user-defined struct. type ConversionData struct { - SubnetID [32]byte + L1ID [32]byte ValidatorManagerBlockchainID [32]byte ValidatorManagerAddress common.Address InitialValidators []InitialValidator @@ -46,7 +46,7 @@ type InitialValidator struct { // IPoSValidatorManagerMetaData contains all meta data concerning the IPoSValidatorManager contract. var IPoSValidatorManagerMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"DelegationEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"DelegatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"recipientAddress\",\"type\":\"address\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"recipientAddress\",\"type\":\"address\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"recipientAddress\",\"type\":\"address\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"recipientAddress\",\"type\":\"address\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messsageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"DelegationEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"DelegatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"recipientAddress\",\"type\":\"address\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"recipientAddress\",\"type\":\"address\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"recipientAddress\",\"type\":\"address\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"recipientAddress\",\"type\":\"address\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messsageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // IPoSValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/interfaces/IValidatorManager/IValidatorManager.go b/abi-bindings/go/validator-manager/interfaces/IValidatorManager/IValidatorManager.go index 9135c7b1b..82b2cc7aa 100644 --- a/abi-bindings/go/validator-manager/interfaces/IValidatorManager/IValidatorManager.go +++ b/abi-bindings/go/validator-manager/interfaces/IValidatorManager/IValidatorManager.go @@ -31,7 +31,7 @@ var ( // ConversionData is an auto generated low-level Go binding around an user-defined struct. type ConversionData struct { - SubnetID [32]byte + L1ID [32]byte ValidatorManagerBlockchainID [32]byte ValidatorManagerAddress common.Address InitialValidators []InitialValidator @@ -46,7 +46,7 @@ type InitialValidator struct { // IValidatorManagerMetaData contains all meta data concerning the IValidatorManager contract. var IValidatorManagerMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messsageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messsageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // IValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/cmd/teleporter-cli/README.md b/cmd/teleporter-cli/README.md index fe912c114..f3252e1b3 100644 --- a/cmd/teleporter-cli/README.md +++ b/cmd/teleporter-cli/README.md @@ -14,4 +14,4 @@ The supported subcommands include: - `event`: given a log event's topics and data, attempts to decode into a Teleporter event in a more readable format. - `message`: given a Teleporter message encoded as a hex string, attempts to decode into a Teleporter message in a more readable format. -- `transaction`: given a transaction hash, attempts to decode all relevant Teleporter and Warp log events in a more readable format. +- `transaction`: given a transaction hash, attempts to decode all relevant TeleporterMessenger and ICM log events in a more readable format. diff --git a/cmd/teleporter-cli/message.go b/cmd/teleporter-cli/message.go index 276d56ba4..435e367bd 100644 --- a/cmd/teleporter-cli/message.go +++ b/cmd/teleporter-cli/message.go @@ -13,8 +13,8 @@ import ( var messageCmd = &cobra.Command{ Use: "message MESSAGE_BYTES", - Short: "Decodes hex encoded Teleporter message bytes into a TeleporterMessage struct", - Long: `Given the hex encoded bytes of a Teleporter message, this command will decode + Short: "Decodes hex encoded TeleporterMessenger message bytes into a TeleporterMessage struct", + Long: `Given the hex encoded bytes of a TeleporterMessenger message, this command will decode the bytes into a TeleporterMessage struct and print the struct fields.`, Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { @@ -25,7 +25,7 @@ the bytes into a TeleporterMessage struct and print the struct fields.`, msg := teleportermessenger.TeleporterMessage{} err = msg.Unpack(b) cobra.CheckErr(err) - logger.Info("Teleporter Message unpacked", zap.Any("message", msg)) + logger.Info("TeleporterMessenger Message unpacked", zap.Any("message", msg)) cmd.Println("Message command ran successfully") }, } diff --git a/cmd/teleporter-cli/message_test.go b/cmd/teleporter-cli/message_test.go index 59443a2e6..d4fe5b397 100644 --- a/cmd/teleporter-cli/message_test.go +++ b/cmd/teleporter-cli/message_test.go @@ -23,7 +23,7 @@ func TestMessageCmd(t *testing.T) { name: "help", args: []string{"message", "--help"}, err: nil, - out: "Given the hex encoded bytes of a Teleporter message", + out: "Given the hex encoded bytes of a TeleporterMessenger message", }, } diff --git a/cmd/teleporter-cli/root.go b/cmd/teleporter-cli/root.go index c73416a34..b6fef09ac 100644 --- a/cmd/teleporter-cli/root.go +++ b/cmd/teleporter-cli/root.go @@ -22,7 +22,7 @@ var rootCmd = &cobra.Command{ Short: "A CLI that integrates with the Teleporter protocol", Long: `A CLI that integrates with the Teleporter protocol, and allows you to debug Teleporter on chain activity. The CLI can help decode -Teleporter and Warp events, as well as parsing Teleporter messages.`, +TeleporterMessenger and ICM events, as well as parsing Teleporter messages.`, } // Execute adds all child commands to the root command and sets flags appropriately. diff --git a/cmd/teleporter-cli/transaction.go b/cmd/teleporter-cli/transaction.go index f78048ef3..ad7316eb5 100644 --- a/cmd/teleporter-cli/transaction.go +++ b/cmd/teleporter-cli/transaction.go @@ -18,7 +18,7 @@ import ( ) const ( - warpPrecompileAddressHex = "0x0200000000000000000000000000000000000005" + ICMPrecompileAddressHex = "0x0200000000000000000000000000000000000005" ) var ( @@ -32,7 +32,7 @@ var transactionCmd = &cobra.Command{ Use: "transaction --rpc RPC_URL --teleporter-address CONTRACT_ADDRESS TRANSACTION_HASH", Short: "Parses relevant Teleporter logs from a transaction", Long: `Given a transaction this command looks through the transaction's receipt -for Teleporter and Warp log events. When corresponding log events are found, +for TeleporterMessenger and ICM log events. When corresponding log events are found, the command parses to log event fields to a more human readable format. Optionally pass -d or --debug for extra transaction output. This may require enabling debug enpoints on your RPC node`, Args: cobra.ExactArgs(1), @@ -51,13 +51,13 @@ func checkReceipt(cmd *cobra.Command, txHash common.Hash) { receipt, err := client.TransactionReceipt(context.Background(), txHash) cobra.CheckErr(err) - warpPrecompileAddress := common.HexToAddress(warpPrecompileAddressHex) + ICMPrecompileAddress := common.HexToAddress(ICMPrecompileAddressHex) for _, log := range receipt.Logs { switch log.Address { case teleporterAddress: printTeleporterLogs(cmd, log) - case warpPrecompileAddress: - printWarpLogs(cmd, log) + case ICMPrecompileAddress: + printICMLogs(cmd, log) } } } @@ -78,26 +78,26 @@ func printTeleporterLogs(cmd *cobra.Command, log *types.Log) { cmd.Println(out.String() + "\n") } -func printWarpLogs(cmd *cobra.Command, log *types.Log) { +func printICMLogs(cmd *cobra.Command, log *types.Log) { logJson, err := json.MarshalIndent(log, "", " ") cobra.CheckErr(err) - cmd.Println("Warp Log:\n" + string(logJson) + "\n") + cmd.Println("ICM Log:\n" + string(logJson) + "\n") unsignedMsg, err := warp.UnpackSendWarpEventDataToMessage(log.Data) cobra.CheckErr(err) - cmd.Println("Warp Message ID: " + unsignedMsg.ID().Hex()) + cmd.Println("ICM Message ID: " + unsignedMsg.ID().Hex()) - warpPayload, err := warpPayload.ParseAddressedCall(unsignedMsg.Payload) + icmPayload, err := warpPayload.ParseAddressedCall(unsignedMsg.Payload) cobra.CheckErr(err) - warpPayloadJson, err := json.MarshalIndent(warpPayload, "", " ") + icmPayloadJson, err := json.MarshalIndent(icmPayload, "", " ") cobra.CheckErr(err) - cmd.Println("Warp Payload:") - cmd.Println(string(warpPayloadJson)) + cmd.Println("ICM Payload:") + cmd.Println(string(icmPayloadJson)) teleporterMessage := teleportermessenger.TeleporterMessage{} - err = teleporterMessage.Unpack(warpPayload.Payload) + err = teleporterMessage.Unpack(icmPayload.Payload) cobra.CheckErr(err) cmd.Println("Teleporter Message:") diff --git a/contracts/README.md b/contracts/README.md index 2f5bd6549..12d85f932 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -1,5 +1,5 @@ ## Contracts -This directory contains Solidity contracts that leverage Avalanche Warp Messaging to implement unique cross-chain functions. +This directory contains Solidity contracts that leverage Avalanche Interchain Messaging (ICM) to implement unique cross-chain functions. This directory is set up as a [Foundry](https://github.com/foundry-rs/foundry) project. Use the `scripts/install_foundry.sh` to install the correct version of the ava-labs fork of foundry. diff --git a/contracts/governance/README.md b/contracts/governance/README.md index 7dbc4a453..9fd06683d 100644 --- a/contracts/governance/README.md +++ b/contracts/governance/README.md @@ -4,15 +4,15 @@ This contract provides an alternative to traditional multi-signature contracts where instead of requiring signatures from `K` of `N` pre-specified signers, an aggregate signature is required from a quorum of the current validators for a given blockchain. -The contract leverages off-chain [Avalanche Warp Messages](https://docs.avax.network/build/cross-chain/awm/overview), which are manually approved for signing by a chain's validators. It requires these messages to have the source address set to the zero address to enforce this, since on-chain warp messages cannot have zero source address. +The contract leverages off-chain [Avalanche ICM Messages](https://docs.avax.network/build/cross-chain/awm/overview), which are manually approved for signing by a chain's validators. It requires these messages to have the source address set to the zero address to enforce this, since on-chain ICM messages cannot have zero source address. Note: 1. The blockchain validating the message may or may not be the same chain where the target contract and the `ValidatorSetSig` contract are deployed. -2. [Off-Chain Warp messages](https://github.com/ava-labs/subnet-evm/issues/729) are Warp messages that validators can include in their config to indicate that they are willing to sign them even though they are not a result of on-chain activity. +2. [Off-Chain ICM messages](https://github.com/ava-labs/subnet-evm/issues/729) are ICM messages that validators can include in their config to indicate that they are willing to sign them even though they are not a result of on-chain activity. -#### Creating a valid Off-chain Warp Message for interaction with the ValidatorSetSig Contract +#### Creating a valid Off-chain ICM Message for interaction with the ValidatorSetSig Contract 1. ABI-encode a `ValidatorSetSigMessage` as defined in `ValidatorSetSig.sol` 2. OPTIONAL: call `validateMessage` view method of the intended contract to confirm that the message has correct fields, including the nonce. -3. Pack that as the payload of an [AddressedCall](https://github.com/ava-labs/avalanchego/blob/0c4efd743e1d737f4e8970d0e0ebf229ea44406c/vms/platformvm/warp/payload/addressed_call.go#L15) Warp Message format. Note that the `SourceAddress` field has to be set to the zero address. +3. Pack that as the payload of an [AddressedCall](https://github.com/ava-labs/avalanchego/blob/0c4efd743e1d737f4e8970d0e0ebf229ea44406c/vms/platformvm/warp/payload/addressed_call.go#L15) ICM Message format. Note that the `SourceAddress` field has to be set to the zero address. 4. Pack the `AddressedCall` as the payload of the [UnsignedWarpMessage](https://github.com/ava-labs/avalanchego/blob/f17ea6a7ab4036c41b693e47b94d8f0c81cb69ec/vms/platformvm/warp/unsigned_message.go#L14). diff --git a/contracts/governance/ValidatorSetSig.sol b/contracts/governance/ValidatorSetSig.sol index 2393b121e..f706fbe4e 100644 --- a/contracts/governance/ValidatorSetSig.sol +++ b/contracts/governance/ValidatorSetSig.sol @@ -37,8 +37,8 @@ struct ValidatorSetSigMessage { /** * @dev Contract that verifies that a set threshold of validators from a given blockchainID - * have signed an off-chain Warp message and forwards the payload to the target contract specified in the ValidatorSetSigMessage. - * The threshold itself is set by the validator themselves in their Warp configs: + * have signed an off-chain ICM message and forwards the payload to the target contract specified in the ValidatorSetSigMessage. + * The threshold itself is set by the validator themselves in their ICM configs: * https://github.com/ava-labs/subnet-evm/blob/6c018f89339f3d381909e02013f002f234dc7ae3/precompile/contracts/warp/config.go#L50 * * This is intended to be used for safe off-chain governance of enabled contracts. An example use case would be @@ -62,9 +62,9 @@ contract ValidatorSetSig is ReentrancyGuard { mapping(address targetContractAddress => uint256 nonce) public nonces; /** - * @notice Address that the off-chain Warp message sets as the "source" address. + * @notice Address that the off-chain ICM message sets as the "source" address. * @dev The address is not owned by any EOA or smart contract account, so it - * cannot possibly be the source address of any other Warp message emitted by the VM. + * cannot possibly be the source address of any other ICM message emitted by the VM. */ address public constant VALIDATORS_SOURCE_ADDRESS = address(0); @@ -74,7 +74,7 @@ contract ValidatorSetSig is ReentrancyGuard { bytes32 public immutable blockchainID; /** - * @notice Warp precompile used for sending and receiving Warp messages. + * @notice ICM precompile used for sending and receiving ICM messages. */ IWarpMessenger public constant WARP_MESSENGER = IWarpMessenger(0x0200000000000000000000000000000000000005); diff --git a/contracts/ictt/README.md b/contracts/ictt/README.md index 9a7402277..464943bb9 100644 --- a/contracts/ictt/README.md +++ b/contracts/ictt/README.md @@ -2,9 +2,9 @@ ## Overview -Avalanche Interchain Token Transfer (ICTT) is an application that allows users to transfer tokens between Subnets. The implementation is a set of smart contracts that are deployed across multiple Subnets, and leverages [Teleporter](https://github.com/ava-labs/teleporter) for cross-chain communication. +Avalanche Interchain Token Transfer (ICTT) is an application that allows users to transfer tokens between L1s. The implementation is a set of smart contracts that are deployed across multiple L1s, and leverages [ICM](https://github.com/ava-labs/teleporter) for cross-chain communication. -Each token transferrer instance consists of one "home" contract and at least one but possibly many "remote" contracts. Each home contract instance manages one asset to be transferred out to `TokenRemote` instances. The home contract lives on the Subnet where the asset to be transferred exists. A transfer consists of locking the asset as collateral on the home Subnet and minting a representation of the asset on the remote Subnet. The remote contracts, each of which has a single specified home contract, live on other Subnets that want to import the asset transferred by their specified home. The token transferrers are designed to be permissionless: anyone can register compatible `TokenRemote` instances to allow for transferring tokens from the `TokenHome` instance to that new `TokenRemote` instance. The home contract keeps track of token balances transferred to each `TokenRemote` instance, and handles returning the original tokens back to the user when assets are transferred back to the `TokenHome` instance. `TokenRemote` instances are registered with their home contract via a Teleporter message upon creation. +Each token transferrer instance consists of one "home" contract and at least one but possibly many "remote" contracts. Each home contract instance manages one asset to be transferred out to `TokenRemote` instances. The home contract lives on the L1 where the asset to be transferred exists. A transfer consists of locking the asset as collateral on the home L1 and minting a representation of the asset on the remote L1. The remote contracts, each of which has a single specified home contract, live on other L1s that want to import the asset transferred by their specified home. The token transferrers are designed to be permissionless: anyone can register compatible `TokenRemote` instances to allow for transferring tokens from the `TokenHome` instance to that new `TokenRemote` instance. The home contract keeps track of token balances transferred to each `TokenRemote` instance, and handles returning the original tokens back to the user when assets are transferred back to the `TokenHome` instance. `TokenRemote` instances are registered with their home contract via an ICM message upon creation. Home contract instances specify the asset to be transferred as either an ERC20 token or the native token, and they allow for transferring the token to any registered `TokenRemote` instances. The token representation on the remote chain can also either be an ERC20 or native token, allowing users to have any combination of ERC20 and native tokens between home and remote chains: @@ -17,7 +17,7 @@ The remote tokens are designed to have compatibility with the token transferrer The token transferrer also supports "multi-hop" transfers, where tokens can be transferred between remote chains. To illustrate, consider two remotes _Ra_ and _Rb_ that are both connected to the same home _H_. A multi-hop transfer from _Ra_ to _Rb_ first gets routed from _Ra_ to _H_, where remote balances are updated, and then _H_ automatically routes the transfer on to _Rb_. -In addition to supporting basic token transfers, the token transferrer contracts offer a `sendAndCall` interface for transferring tokens and using them in a smart contract interaction all within a single Teleporter message. If the call to the recipient smart contract fails, the transferred tokens are sent to a fallback recipient address on the destination chain of the transfer. The `sendAndCall` interface enables the direct use of transferred tokens in dApps on other chains, such as performing swaps, using the tokens to pay for fees when invoking services, etc. +In addition to supporting basic token transfers, the token transferrer contracts offer a `sendAndCall` interface for transferring tokens and using them in a smart contract interaction all within a single ICM message. If the call to the recipient smart contract fails, the transferred tokens are sent to a fallback recipient address on the destination chain of the transfer. The `sendAndCall` interface enables the direct use of transferred tokens in dApps on other chains, such as performing swaps, using the tokens to pay for fees when invoking services, etc. ## Upgradability @@ -45,7 +45,7 @@ A concrete implementation of `TokenHome` and `INativeTokenTransferrer` that hand ## `TokenRemote` -An abstract implementation of `ITokenTransferrer` for a token transfer contract on a "remote" chain that receives transferred assets from a specific `TokenHome` instance. Each `TokenRemote` instance has a single `TokenHome` instance that it receives token transfers from to mint tokens. It also handles sending messages (and correspondingly burning tokens) to route tokens back to other chains (either its `TokenHome`, or other `TokenRemote` instances). Once deployed, a `TokenRemote` instance must be registered with its specified `TokenHome` contract. This is done by calling `registerWithHome` on the remote contract, which will send a Teleporter message to the home contract with the information to register. +An abstract implementation of `ITokenTransferrer` for a token transfer contract on a "remote" chain that receives transferred assets from a specific `TokenHome` instance. Each `TokenRemote` instance has a single `TokenHome` instance that it receives token transfers from to mint tokens. It also handles sending messages (and correspondingly burning tokens) to route tokens back to other chains (either its `TokenHome`, or other `TokenRemote` instances). Once deployed, a `TokenRemote` instance must be registered with its specified `TokenHome` contract. This is done by calling `registerWithHome` on the remote contract, which will send an ICM message to the home contract with the information to register. All messages sent by `TokenRemote` instances are sent to the specified `TokenHome` contract, whether they are to redeem the collateral from the `TokenHome` instance or route the tokens to another `TokenRemote` instance. Routing tokens from one `TokenRemote` instance to another is referred to as a "multi-hop", where the tokens are first sent back to their `TokenHome` contract to update its accounting, and then automatically routed on to their intended destination `TokenRemote` instance. @@ -67,7 +67,7 @@ To account for the need to bootstrap the chain using a transferred asset as its 1. Create a new blockchain with 100 native tokens allocated in its genesis block, and set the pre-derived `NativeTokenRemote` contract address (based on the deployer nonce) to have the permission to mint native tokens using the native minter precompile. Note that the deployer account will need to be funded in order to deploy the `NativeTokenRemote` contract, and an account used to relay messages into this chain must also be funded to relay the first messages. 2. Deploy the `NativeTokenRemote` contract to the pre-derived address set in the blockchain configuration of step 1. The `initialReserveImbalance` should be 100, matching the number of tokens allocated in the genesis block that were not initially backed by collateral in the `TokenHome` instance. -3. Call the `registerWithHome` function on the `NativeTokenRemote` instance to send a Teleporter message registering this remote with its `TokenHome`. This message should be relayed and delivered to the `TokenHome` instance. +3. Call the `registerWithHome` function on the `NativeTokenRemote` instance to send an ICM message registering this remote with its `TokenHome`. This message should be relayed and delivered to the `TokenHome` instance. 4. Once registered on the `TokenHome` contract, add 100 tokens as collateral for the new `NativeTokenRemote` instance by calling the `addCollateral` function on the `TokenHome` contract. A `CollateralAdded` event will be emitted by the `TokenHome` contract with a `remaining` amount of 0 once the `NativeTokenRemote` is fully collateralized. 5. Now that the `NativeTokenRemote` contract is fully collateralized, tokens can be moved normally in both directions across the token transfer contracts by calling their `send` functions. @@ -80,8 +80,8 @@ The `totalNativeAssetSupply` implementation of `NativeTokenRemote` takes into ac Note that the value returned by `totalNativeAssetSupply` is an upper bound on the circulating supply of the native asset on the chain using the `NativeTokenRemote` instance since tokens could be burned in other ways that it does not account for. -## Teleporter Message Fees +## ICM Message Fees -Fees can be optionally added to Teleporter messages in order to incentivize relayers to deliver them, as documented [here](https://github.com/ava-labs/teleporter/tree/main/contracts/teleporter#fees). The token transfer contracts in this repository allow for specifying any ERC20 token and amount to be used as the Teleporter message fee for single-hop transfers in either direction between `TokenHome` and `TokenRemote` instances. Fee amounts must be pre-approved to be spent by the token transfer contract before initiating a transfer. +Fees can be optionally added to ICM messages in order to incentivize relayers to deliver them, as documented [here](https://github.com/ava-labs/teleporter/tree/main/contracts/teleporter#fees). The token transfer contracts in this repository allow for specifying any ERC20 token and amount to be used as the ICM message fee for single-hop transfers in either direction between `TokenHome` and `TokenRemote` instances. Fee amounts must be pre-approved to be spent by the token transfer contract before initiating a transfer. -Multi-hop transfers between two `TokenRemote` instances involve two Teleporter messages: the first from the initiating `TokenRemote` instance to its home, and the second from its home to the destination `TokenRemote` instance. In the multi-hop case, the first message fee can be paid in any ERC20 token and amount (similar to the single-hop case), but the second message fee must be paid in-kind of the asset being transferred and is deducted from the amount being transferred. This restriction on the secondary message fee is necessary because the transaction on the intermediate chain routing the funds to the destination `TokenRemote` instance is not sent by the wallet performing the transfer. Because of this, it can not directly spend an arbitrary ERC20 token from that wallet. Using the asset being transferred for the optional secondary fee allows users to perform an incentivized multi-hop transfer without needing to make any interaction with the home themselves. If there is a need for the second message from the home to the destination `TokenRemote` instance to pay a fee in another asset, it is recommended to perform two single-hop transfers, which allows for specifying an arbitrary ERC20 token to be used for the fee of each. +Multi-hop transfers between two `TokenRemote` instances involve two ICM messages: the first from the initiating `TokenRemote` instance to its home, and the second from its home to the destination `TokenRemote` instance. In the multi-hop case, the first message fee can be paid in any ERC20 token and amount (similar to the single-hop case), but the second message fee must be paid in-kind of the asset being transferred and is deducted from the amount being transferred. This restriction on the secondary message fee is necessary because the transaction on the intermediate chain routing the funds to the destination `TokenRemote` instance is not sent by the wallet performing the transfer. Because of this, it can not directly spend an arbitrary ERC20 token from that wallet. Using the asset being transferred for the optional secondary fee allows users to perform an incentivized multi-hop transfer without needing to make any interaction with the home themselves. If there is a need for the second message from the home to the destination `TokenRemote` instance to pay a fee in another asset, it is recommended to perform two single-hop transfers, which allows for specifying an arbitrary ERC20 token to be used for the fee of each. diff --git a/contracts/teleporter/README.md b/contracts/teleporter/README.md index c5ca8c236..5689b8cf0 100644 --- a/contracts/teleporter/README.md +++ b/contracts/teleporter/README.md @@ -1,19 +1,19 @@ -# Teleporter Protocol +# ICM Protocol ## Overview -Teleporter is a messaging protocol built on top of [Avalanche Warp Messaging (AWM)](https://docs.avax.network/learn/avalanche/awm) that provides a developer-friendly interface for sending and receiving cross-chain messages from within the EVM. +`TeleporterMessenger` is a smart contract that is part of [Avalanche Interchain Messaging (ICM)](https://docs.avax.network/learn/avalanche/awm) that provides a developer-friendly interface for sending and receiving cross-chain messages from within the EVM. The `ITeleporterMessenger` interface provides two primary methods: - `sendCrossChainMessage`: called by contracts on the origin chain to initiate the sending of a message to a contract on another EVM instance. - `receiveCrossChainMessage`: called by cross-chain relayers on the destination chain to deliver signed messages to the destination EVM instance. -The `ITeleporterReceiver` interface provides a single method. All contracts that wish to receive Teleporter messages on the destination chain must implement this interface: +The `ITeleporterReceiver` interface provides a single method. All contracts that wish to receive ICM messages on the destination chain must implement this interface: -- `receiveTeleporterMessage`: called by the Teleporter contract on the destination chain to deliver a message to the destination contract. +- `receiveTeleporterMessage`: called by `TeleporterMessenger` on the destination chain to deliver a message to the destination contract. -> Note: If a contract does not implement `ITeleporterReceiver`, but instead implements [fallback](https://docs.soliditylang.org/en/latest/contracts.html#fallback-function), the fallback function will be called when Teleporter attempts to perform message execution. The message execution is marked as failed if the fallback function reverts, otherwise it is marked as successfully executed. +> Note: If a contract does not implement `ITeleporterReceiver`, but instead implements [fallback](https://docs.soliditylang.org/en/latest/contracts.html#fallback-function), the fallback function will be called when `TeleporterMessenger` attempts to perform message execution. The message execution is marked as failed if the fallback function reverts, otherwise it is marked as successfully executed. ## Data Flow @@ -23,51 +23,51 @@ The `ITeleporterReceiver` interface provides a single method. All contracts that ## Properties -Teleporter provides a handful of useful properties to cross-chain applications that Avalanche Warp Messages do not provide by default. These include: +TeleporterMessenger provides a handful of useful properties to cross-chain applications that ICM messages do not provide by default. These include: -1. Replay protection: Teleporter ensures that a cross-chain message is not delivered multiple times. -2. Retries: In certain edge cases when there is significant validator churn, it is possible for an Avalanche Warp Message to be dropped before a valid aggregate signature is created for it. Teleporter ensures that messages can still be delivered even in this event by allowing for retries of previously submitted messages. -3. Relay incentivization: Teleporter provides a mechanism for messages to optionally incentivize relayers to perform the necessary signature aggregation and pay the transaction fee to broadcast the signed message on the destination chain. -4. Allowed relayers: Teleporter allows users to specify a list of `allowedRelayerAddresses`, where only the specified addresses can relay and deliver the Teleporter message. Leaving this list empty allows all relayers to deliver. -5. Message execution: Teleporter enables cross-chain messages to have direct effect on their destination chain by using `evm.Call()` to invoke the `receiveTeleporterMessage` function of destination contracts that implement the `ITeleporterReceiver` interface. +1. Replay protection: `TeleporterMessenger` ensures that a cross-chain message is not delivered multiple times. +2. Retries: In certain edge cases when there is significant validator churn, it is possible for an ICM Message to be dropped before a valid aggregate signature is created for it. `TeleporterMessenger` ensures that messages can still be delivered even in this event by allowing for retries of previously submitted messages. +3. Relay incentivization: `TeleporterMessenger` provides a mechanism for messages to optionally incentivize relayers to perform the necessary signature aggregation and pay the transaction fee to broadcast the signed message on the destination chain. +4. Allowed relayers: `TeleporterMessenger` allows users to specify a list of `allowedRelayerAddresses`, where only the specified addresses can relay and deliver the `TeleporterMessenger` message. Leaving this list empty allows all relayers to deliver. +5. Message execution: `TeleporterMessenger` enables cross-chain messages to have direct effect on their destination chain by using `evm.Call()` to invoke the `receiveTeleporterMessage` function of destination contracts that implement the `ITeleporterReceiver` interface. ## Fees -Fees can be paid on a per message basis by specifing the ERC20 asset and amount to be used to incentivize a relayer to deliver the message in the call to `sendCrossChainMessage`. The fee amount is transferred into the control of the Teleporter contract (i.e. locked) before the Warp message is sent. The Teleporter contract tracks the fee amount for each message ID it creates. When it subsequently receives a message back from the destination chain of the original message, the new message will have a list of receipts identifying the relayer that delivered the given message ID. At this point, the fee amount originally locked by Teleporter for the given message will be redeemable by the relayer identified in the receipt. If the initial fee amount was not sufficient to incentivize a relayer, it can be added to by using `addFeeAmount`. +Fees can be paid on a per message basis by specifing the ERC20 asset and amount to be used to incentivize a relayer to deliver the message in the call to `sendCrossChainMessage`. The fee amount is transferred into the control of `TeleporterMessenger` (i.e. locked) before the ICM message is sent. `TeleporterMessenger` tracks the fee amount for each message ID it creates. When it subsequently receives a message back from the destination chain of the original message, the new message will have a list of receipts identifying the relayer that delivered the given message ID. At this point, the fee amount originally locked by `TeleporterMessenger` for the given message will be redeemable by the relayer identified in the receipt. If the initial fee amount was not sufficient to incentivize a relayer, it can be added to by using `addFeeAmount`. ### Message Receipts and Fee Redemption -In order to confirm delivery of a Teleporter message from a source chain to a destination chain, a receipt is included in the next Teleporter message sent in the opposite direction, from the destination chain back to the source chain. This receipt contains the message ID of the original message, as well as the reward address that the delivering relayer specified. That reward address is then able to redeem the corresponding reward on the original chain by calling `redeemRelayerRewards`. The following example illustrates this flow: +In order to confirm delivery of a `TeleporterMessenger` message from a source chain to a destination chain, a receipt is included in the next `TeleporterMessenger` message sent in the opposite direction, from the destination chain back to the source chain. This receipt contains the message ID of the original message, as well as the reward address that the delivering relayer specified. That reward address is then able to redeem the corresponding reward on the original chain by calling `redeemRelayerRewards`. The following example illustrates this flow: -- A Teleporter message is sent from Chain A to Chain B, with a relayer incentive of `10` `USDC`. This message is assigned the ID `1` by the Teleporter contract on Chain A. +- A `TeleporterMessenger` message is sent from Chain A to Chain B, with a relayer incentive of `10` `USDC`. This message is assigned the ID `1` by the `TeleporterMessenger` contract on Chain A. - On Chain A, this is done by calling `sendCrossChainMessage`, and providing the `USDC` contract address and amount in the function call. - A relayer delivers the message on Chain B by calling `receiveCrossChainMessage` and providing its address, `0x123...` -- The Teleporter contract on Chain B stores the relayer address in a receipt for the message ID. -- Some time later, a separate Teleporter message is sent from Chain B to Chain A. The Teleporter contract on Chain B includes the receipt for the original message in this new message. -- When this new message is delivered on Chain A, the Teleporter contract on Chain A reads the receipt and attributes the rewards for delivering the original message (message ID `1`) to the address `0x123...`. +- The `TeleporterMessenger` contract on Chain B stores the relayer address in a receipt for the message ID. +- Some time later, a separate `TeleporterMessenger` message is sent from Chain B to Chain A. The `TeleporterMessenger` contract on Chain B includes the receipt for the original message in this new message. +- When this new message is delivered on Chain A, the `TeleporterMessenger` contract on Chain A reads the receipt and attributes the rewards for delivering the original message (message ID `1`) to the address `0x123...`. - Address `0x123...` may now call `redeemRelayerRewards` on Chain A, which transfers the `10` `USDC` to its address. If it tries to do this before the receipt is received on Chain A, the call will fail. -It is possible for receipts to get "stuck" on the destination chain in the event that Teleporter traffic between two chains is skewed in one direction. In such a scenario, incoming messages on one chain may cause the rate at which receipts are generated to outpace the rate at which they are sent back to the other chain. To mitigate this, the method `sendSpecifiedReceipts` can be called to immediately send the receipts associated with the given message IDs back to the original chain. +It is possible for receipts to get "stuck" on the destination chain in the event that `TeleporterMessenger` traffic between two chains is skewed in one direction. In such a scenario, incoming messages on one chain may cause the rate at which receipts are generated to outpace the rate at which they are sent back to the other chain. To mitigate this, the method `sendSpecifiedReceipts` can be called to immediately send the receipts associated with the given message IDs back to the original chain. ## Required Interface -Teleporter messages are delivered by calling the `receiveTeleporterMessage` function defined by the `ITeleporterReceiver` interface. Contracts must implement this interface in order to be able to receive messages. The first two parameters of `receiveTeleporterMessage` identify the original sender of the given message on the origin chain and are set by the `TeleporterMessenger`. The third parameter to `receiveTeleporterMessage`, is the raw message payload. Applications using Teleporter are responsible for defining the exact format of this payload in a way that can be decoded on the receiving end. For example, applications may encode an action enum value along with the target method parameters on the sending side, then decode this data and route to the target method within `receiveTeleporterMessage`. See `ERC20Bridge.sol` for an example of this approach. +`TeleporterMessenger` messages are delivered by calling the `receiveTeleporterMessage` function defined by the `ITeleporterReceiver` interface. Contracts must implement this interface in order to be able to receive messages. The first two parameters of `receiveTeleporterMessage` identify the original sender of the given message on the origin chain and are set by the `TeleporterMessenger`. The third parameter to `receiveTeleporterMessage`, is the raw message payload. Applications using `TeleporterMessenger` are responsible for defining the exact format of this payload in a way that can be decoded on the receiving end. For example, applications may encode an action enum value along with the target method parameters on the sending side, then decode this data and route to the target method within `receiveTeleporterMessage`. See `ERC20Bridge.sol` for an example of this approach. ## Message Delivery and Execution -Teleporter is able to ensure that messages are considered delivered even if their execution fails (i.e. reverts) by using `evm.Call()` with a pre-defined gas limit to execute the message payload. This gas limit is specified by each message in the call to `sendCrossChainMessage`. Relayers must provide at least enough gas for the sub-call in addition to the standard gas used by a call to `receiveCrossChainMessage`. In the event that a message execution runs out of gas or reverts for any other reason, the hash of the message payload is stored by the receiving Teleporter contract instance. This allows for the message execution to be retried in the future, with possibly a higher gas limit by calling `retryMessageExecution`. Importantly, a message is still considered delivered on its destination chain even if its execution fails. This allows the relayer of the message to redeem their reward for deliverying the message, because they have no control on whether or not its execution will succeed or not so long as they provide sufficient gas to meet the specified `requiredGasLimit`. +`TeleporterMessenger` is able to ensure that messages are considered delivered even if their execution fails (i.e. reverts) by using `evm.Call()` with a pre-defined gas limit to execute the message payload. This gas limit is specified by each message in the call to `sendCrossChainMessage`. Relayers must provide at least enough gas for the sub-call in addition to the standard gas used by a call to `receiveCrossChainMessage`. In the event that a message execution runs out of gas or reverts for any other reason, the hash of the message payload is stored by the receiving `TeleporterMessenger` contract instance. This allows for the message execution to be retried in the future, with possibly a higher gas limit by calling `retryMessageExecution`. Importantly, a message is still considered delivered on its destination chain even if its execution fails. This allows the relayer of the message to redeem their reward for deliverying the message, because they have no control on whether or not its execution will succeed or not so long as they provide sufficient gas to meet the specified `requiredGasLimit`. -Note that due to [EIP-150](https://eips.ethereum.org/EIPS/eip-150), the lesser of 63/64ths of the remaining gas and the `requiredGasLimit` will be provided to the code executed using `evm.Call()`. This creates an edge case where sufficient gas is provided by the relayer at time of the `requiredGasLimit` check, but less than the `requiredGasLimit` is provided for the message execution. In such a case, the message execution may fail due to having less than the `requiredGasLimit` available, but the message would still be considered received. Such a case is only possible if the remaining 1/64th of the `requiredGasLimit` is sufficient for executing the remaining logic of `receiveCrossChainMessage` so that the top level transaction does not also revert. Based on the current implementation, a message must have a `requiredGasLimit` of over 1,200,000 gas for this to be possible. In order to avoid this case entirely, it is recommended for applications sending Teleporter messages to add a buffer to the `requiredGasLimit` such that 63/64ths of the value passed is sufficient for the message execution. +Note that due to [EIP-150](https://eips.ethereum.org/EIPS/eip-150), the lesser of 63/64ths of the remaining gas and the `requiredGasLimit` will be provided to the code executed using `evm.Call()`. This creates an edge case where sufficient gas is provided by the relayer at time of the `requiredGasLimit` check, but less than the `requiredGasLimit` is provided for the message execution. In such a case, the message execution may fail due to having less than the `requiredGasLimit` available, but the message would still be considered received. Such a case is only possible if the remaining 1/64th of the `requiredGasLimit` is sufficient for executing the remaining logic of `receiveCrossChainMessage` so that the top level transaction does not also revert. Based on the current implementation, a message must have a `requiredGasLimit` of over 1,200,000 gas for this to be possible. In order to avoid this case entirely, it is recommended for applications sending `TeleporterMessenger` messages to add a buffer to the `requiredGasLimit` such that 63/64ths of the value passed is sufficient for the message execution. ## Resending a Message -If the sending Subnet's validator set changes, then it's possible for the receiving Subnet to reject the underlying Warp message due to insufficient signing stake. For example, suppose Subnet A has 5 validators with equal stake weight who all sign a Teleporter message sent to Subnet B. 100% of Subnet A's stake has signed the message. Also suppose Subnet B requires 67% of the sending Subnet's stake to have signed a given Warp message in order for it to be accepted. Before the message can be delivered, however, 5 _more_ validators are added to Subnet A's validator set (all with the same stake weight as the original validators), meaning that the Teleporter message was signed by _only 50%_ of Subnet A's stake. Subnet B will reject this message. +If the sending Avalanche L1's validator set changes, then it's possible for the receiving Avalanche L1 to reject the underlying ICM message due to insufficient signing stake. For example, suppose L1 A has 5 validators with equal stake weight who all sign a `TeleporterMessenger` message sent to L1 B. 100% of L1 A's stake has signed the message. Also suppose L1 B requires 67% of the sending L1's stake to have signed a given ICM message in order for it to be accepted. Before the message can be delivered, however, 5 _more_ validators are added to L1 A's validator set (all with the same stake weight as the original validators), meaning that the `TeleporterMessenger` message was signed by _only 50%_ of L1 A's stake. L1 B will reject this message. -Once sent on chain, Warp messages cannot be re-signed by a new validator set in such a scenario. Teleporter, however, does support re-signing via the function `retrySendCrossChainMessage`, which can be called for any message that has not been acknowledged as delivered to its destination. Under the hood, this packages the Teleporter message into a brand new Warp message that is re-signed by the current validator set. +Once sent on chain, ICM messages cannot be re-signed by a new validator set in such a scenario. Teleporter, however, does support re-signing via the function `retrySendCrossChainMessage`, which can be called for any message that has not been acknowledged as delivered to its destination. Under the hood, this packages the `TeleporterMessenger` message into a brand new ICM message that is re-signed by the current validator set. -## Teleporter Messenger Contract Deployment +## TeleporterMessenger Contract Deployment -**Do not deploy the `TeleporterMessenger` contract using `forge create`**. The `TeleporterMessenger` contract must be deployed to the same contract address on every chain. To achieve this, the contract can be deployed using a static transaction that uses Nick's method as documented in [this guide](../..//utils/contract-deployment/README.md). Alternatively, if creating a new Subnet, the contract can be pre-allocated with the proper address and state in the new chain's [genesis file](https://docs.avax.network/build/subnet/upgrade/customize-a-subnet#setting-the-genesis-allocation). +**Do not deploy the `TeleporterMessenger` contract using `forge create`**. The `TeleporterMessenger` contract must be deployed to the same contract address on every chain. To achieve this, the contract can be deployed using a static transaction that uses Nick's method as documented in [this guide](../..//utils/contract-deployment/README.md). Alternatively, if creating a new L1, the contract can be pre-allocated with the proper address and state in the new chain's [genesis file](https://docs.avax.network/build/subnet/upgrade/customize-a-subnet#setting-the-genesis-allocation). As an example, to include `TeleporterMessenger` `v1.0.0` in the genesis file, include the following values in the `alloc` settings, as documented at the link above. The `storage` values included below correspond to the two contract values that are initialized as part of the default constructor of `TeleporterMessenger`. These are the `ReentrancyGuard` values set in this [abstract contract](../utilities/ReentrancyGuards.sol). Future versions of `TeleporterMessenger` may require different storage value initializations. ```json diff --git a/contracts/teleporter/registry/README.md b/contracts/teleporter/registry/README.md index d728b7d1b..e62b749a7 100644 --- a/contracts/teleporter/registry/README.md +++ b/contracts/teleporter/registry/README.md @@ -1,4 +1,4 @@ -# Teleporter Contracts Upgradability +# TeleporterMessenger Contracts Upgradability ## Overview @@ -6,10 +6,10 @@ The `TeleporterMessenger` contract is non-upgradable, once a version of the cont However, there could still be new versions of `TeleporterMessenger` contracts needed to be deployed in the future. `TeleporterRegistry` provides applications that use a `TeleporterMessenger` instance a minimal step process to integrate with new versions of `TeleporterMessenger`. -The `TeleporterRegistry` maintains a mapping of `TeleporterMessenger` contract versions to their addresses. When a new `TeleporterMessenger` version is deployed, its address can be added to the `TeleporterRegistry`. The `TeleporterRegistry` can only be updated through a Warp off-chain message that meets the following requirements: +The `TeleporterRegistry` maintains a mapping of `TeleporterMessenger` contract versions to their addresses. When a new `TeleporterMessenger` version is deployed, its address can be added to the `TeleporterRegistry`. The `TeleporterRegistry` can only be updated through an ICM off-chain message that meets the following requirements: - `sourceChainAddress` must match `VALIDATORS_SOURCE_ADDRESS = address(0)` - - The zero address can only be set as the source chain address by a Warp off-chain message, and cannot be set by an on-chain Warp message. + - The zero address can only be set as the source chain address by an ICM off-chain message, and cannot be set by an on-chain ICM message. - `sourceBlockchainID` must match the blockchain ID that the registry is deployed on - `destinationBlockchainID` must match the blockchain ID that the registry is deployed on - `destinationAddress` must match the address of the registry @@ -25,7 +25,7 @@ In the `TeleporterRegistry` contract, the `latestVersion` state variable returns - `TeleporterRegistry` contract can be initialized through a list of initial registry entries, which are `TeleporterMessenger` contract versions and their addresses. - The registry keeps track of a mapping of `TeleporterMessenger` contract versions to their addresses, and vice versa, a mapping of `TeleporterMessenger` contract addresses to their versions. - Version zero is an invalid version, and is used to indicate that a `TeleporterMessenger` contract has not been registered yet. -- Once a version number is registered in the registry, it cannot be changed, but a previous registered protocol address can be added to the registry with a new version. This is especially important in the case of a rollback to a previous Teleporter version, in which case the previous Teleporter contract address would need to be registered with a new version to the registry. +- Once a version number is registered in the registry, it cannot be changed, but a previous registered protocol address can be added to the registry with a new version. This is especially important in the case of a rollback to a previous `TeleporterMessenger` version, in which case the previous `TeleporterMessenger` contract address would need to be registered with a new version to the registry. ## Integrating `TeleporterRegistryApp` into a dApp @@ -33,18 +33,18 @@ In the `TeleporterRegistry` contract, the `latestVersion` state variable returns Upgrade UML diagram -[TeleporterRegistryApp](./TeleporterRegistryApp.sol) is an abstract contract that helps integrate the `TeleporterRegistry` into a dApp built on top of Teleporter. To support upgradeable contracts, there is also a corresponding `TeleporterRegistryAppUpgradeable` contract that is upgrade compatible. By inheriting from `TeleporterRegistryApp`, dApps get: +[TeleporterRegistryApp](./TeleporterRegistryApp.sol) is an abstract contract that helps integrate the `TeleporterRegistry` into ICM contracts. To support upgradeable contracts, there is also a corresponding `TeleporterRegistryAppUpgradeable` contract that is upgrade compatible. By inheriting from `TeleporterRegistryApp`, dApps get: -- Ability to send Teleporter messages through the latest version of the Teleporter contract registered in the Teleporter registry. (The dApp can also override this to use a specific version of the Teleporter contract.) -- `minTeleporterVersion` management that allows the dApp to specify the minimum Teleporter version that can send messages to the dApp. +- Ability to send ICM messages through the latest version of the `TeleporterMessenger` contract registered in the Teleporter registry. (The dApp can also override this to use a specific version of the `TeleporterMessenger` contract.) +- `minTeleporterVersion` management that allows the dApp to specify the minimum `TeleporterMessenger` version that can send messages to the dApp. - Access controlled utility to update the `minTeleporterVersion` -- Access controlled utility to pause/unpause interaction with specific Teleporter addresses. +- Access controlled utility to pause/unpause interaction with specific `TeleporterMessenger` addresses. To integrate `TeleporterRegistryApp` with a dApp, pass in the Teleporter registry address inside the constructor. For upgradeable contracts `TeleporterRegistryAppUpgradeable` can be inherited, and the derived contract's `initializer` function should call either `__TeleporterRegistryApp_init` or `__TeleporterRegistryApp_init_unchained` An example dApp looks like: ```solidity // An example dApp that integrates with the Teleporter registry -// to send/receive Teleporter messages. +// to send/receive ICM messages. contract ExampleApp is TeleporterRegistryApp { @@ -59,8 +59,8 @@ contract ExampleApp is .getBlockchainID(); } ... - // Handles receiving Teleporter messages, - // and also checks that the sender is a valid Teleporter contract. + // Handles receiving ICM messages, + // and also checks that the sender is a valid TeleporterMessenger contract. function _receiveTeleporterMessage( bytes32 sourceBlockchainID, address originSenderAddress, @@ -69,7 +69,7 @@ contract ExampleApp is // implementation } - // Implements the access control checks for the dApp's interaction with Teleporter versions. + // Implements the access control checks for the dApp's interaction with TeleporterMessenger versions. function _checkTeleporterRegistryAppAccess() internal view virtual override { //implementation } @@ -79,7 +79,7 @@ contract ExampleApp is ### Checking TeleporterRegistryApp access -To prevent anyone from calling the dApp's `updateMinTeleporterVersion`, which would disallow messages from old Teleporter versions from being received, this function should be safeguarded with access controls. All contracts deriving from `TeleporterRegistryApp` will need to implement `TeleporterRegistryApp._checkTeleporterRegistryAppAccess`. For example, [TeleporterRegistryOwnableApp](./TeleporterRegistryOwnableApp.sol) is an abstract contract that inherits `TeleporterRegistryApp`, and implements `_checkTeleporterRegistryAppAccess` to check whether the caller is the owner. There is also a corresponding `TeleporterRegistryOwnableAppUpgradeable` contract that is upgrade compatible. +To prevent anyone from calling the dApp's `updateMinTeleporterVersion`, which would disallow messages from old `TeleporterMessenger` versions from being received, this function should be safeguarded with access controls. All contracts deriving from `TeleporterRegistryApp` will need to implement `TeleporterRegistryApp._checkTeleporterRegistryAppAccess`. For example, [TeleporterRegistryOwnableApp](./TeleporterRegistryOwnableApp.sol) is an abstract contract that inherits `TeleporterRegistryApp`, and implements `_checkTeleporterRegistryAppAccess` to check whether the caller is the owner. There is also a corresponding `TeleporterRegistryOwnableAppUpgradeable` contract that is upgrade compatible. ```solidity function _checkTeleporterRegistryAppAccess() internal view virtual override { @@ -98,11 +98,11 @@ Another example would be a dApp that has different roles and priveleges. `_check } ``` -### Sending with specific Teleporter version +### Sending with specific TeleporterMessenger version -For sending messages with the Teleporter registry, dApps should use `TeleporterRegistryApp._getTeleporterMessenger`. This function by default extends `TeleporterRegistry.getLatestTeleporter`, using the latest version, and adds an extra check on whether the latest Teleporter address is paused. If the dApp wants to send a message through a specific Teleporter version, it can override `_getTeleporterMessenger()` to use the specific Teleporter version with `TeleporterRegistry.getTeleporterFromVersion`. +For sending messages with the Teleporter registry, dApps should use `TeleporterRegistryApp._getTeleporterMessenger`. This function by default extends `TeleporterRegistry.getLatestTeleporter`, using the latest version, and adds an extra check on whether the latest `TeleporterMessenger` address is paused. If the dApp wants to send a message through a specific `TeleporterMessenger` version, it can override `_getTeleporterMessenger()` to use the specific `TeleporterMessenger` version with `TeleporterRegistry.getTeleporterFromVersion`. -The `TeleporterRegistryApp._sendTeleporterMessage` function makes sending Teleporter messages easier. The function uses `_getTeleporterMessenger` to get the sending Teleporter version, pays for Teleporter fees from the dApp's balance, and sends the cross chain message. +The `TeleporterRegistryApp._sendTeleporterMessage` function makes sending ICM messages easier. The function uses `_getTeleporterMessenger` to get the sending `TeleporterMessenger` version, pays for `TeleporterMessenger` fees from the dApp's balance, and sends the cross chain message. Using latest version: @@ -128,53 +128,53 @@ Using specific version: ITeleporterMessenger teleporterMessenger = _getTeleporterMessenger(); ``` -### Receiving from specific Teleporter versions +### Receiving from specific TeleporterMessenger versions -`TeleporterRegistryApp` also provides an initial implementation of [ITeleporterReceiver.receiveTeleporterMessage](../ITeleporterReceiver.sol) that ensures `_msgSender` is a `TeleporterMessenger` contract with a version greater than or equal to `minTeleporterVersion`. This supports the case where a dApp wants to use a new version of the `TeleporterMessenger` contract, but still wants to be able to receive messages from the old Teleporter contract.The dApp can override `_receiveTeleporterMessage` to implement its own logic for receiving messages from Teleporter contracts. +`TeleporterRegistryApp` also provides an initial implementation of [ITeleporterReceiver.receiveTeleporterMessage](../ITeleporterReceiver.sol) that ensures `_msgSender` is a `TeleporterMessenger` contract with a version greater than or equal to `minTeleporterVersion`. This supports the case where a dApp wants to use a new version of the `TeleporterMessenger` contract, but still wants to be able to receive messages from the old `TeleporterMessenger` contract.The dApp can override `_receiveTeleporterMessage` to implement its own logic for receiving messages from `TeleporterMessenger` contracts. ## Managing a TeleporterRegistryApp dApp -dApps that implement `TeleporterRegistryApp` automatically use the latest Teleporter version registered with the `TeleporterRegistry`. Interaction with underlying `TeleporterMessenger` versions can be managed by setting the minimum Teleporter version, and pausing and unpausing specific versions. +dApps that implement `TeleporterRegistryApp` automatically use the latest `TeleporterMessenger` version registered with the `TeleporterRegistry`. Interaction with underlying `TeleporterMessenger` versions can be managed by setting the minimum `TeleporterMessenger` version, and pausing and unpausing specific versions. The following sections include example `cast send` commands for issuing transactions that call contract functions. See the [Foundry Book](https://book.getfoundry.sh/reference/cast/cast-send) for details on how to issue transactions using common wallet options. -### Managing the Minimum Teleporter version +### Managing the Minimum TeleporterMessenger version -The `TeleporterRegistryApp` contract constructor saves the Teleporter registry in a state variable used by the inheriting dApp contract, and initializes a `minTeleporterVersion` to the highest `TeleporterMessenger` version registered in `TeleporterRegistry`. `minTeleporterVersion` is used to allow dApp's to specify the Teleporter versions allowed to interact with it. +The `TeleporterRegistryApp` contract constructor saves the Teleporter registry in a state variable used by the inheriting dApp contract, and initializes a `minTeleporterVersion` to the highest `TeleporterMessenger` version registered in `TeleporterRegistry`. `minTeleporterVersion` is used to allow dApp's to specify the `TeleporterMessenger` versions allowed to interact with it. #### Updating `minTeleporterVersion` -The `TeleporterRegistryApp.updateMinTeleporterVersion` function updates the `minTeleporterVersion` used to check which Teleporter versions can be used for sending and receiving messages. **Once the `minTeleporterVersion` is increased, any undelivered messages sent by other chains using older versions of Teleporter will never be able to be received**. The `updateMinTeleporterVersion` function can only be called with a version greater than the current `minTeleporterVersion` and less than `latestVersion` in the Teleporter registry. +The `TeleporterRegistryApp.updateMinTeleporterVersion` function updates the `minTeleporterVersion` used to check which `TeleporterMessenger` versions can be used for sending and receiving messages. **Once the `minTeleporterVersion` is increased, any undelivered messages sent by other chains using older versions of `TeleporterMessenger` will never be able to be received**. The `updateMinTeleporterVersion` function can only be called with a version greater than the current `minTeleporterVersion` and less than `latestVersion` in the Teleporter registry. -> Example: Update the minimum Teleporter version to 2 +> Example: Update the minimum TeleporterMessenger version to 2 > > ``` > cast send "updateMinTeleporterVersion(uint256)" 2 > ``` -### Pausing Teleporter version interactions +### Pausing TeleporterMessenger version interactions -dApps that inherit from `TeleporterRegistryApp` can pause Teleporter interactions by calling `TeleporterRegistryApp.pauseTeleporterAddress`. This function prevents the dApp contract from interacting with the paused Teleporter address when sending or receiving Teleporter messages. +dApps that inherit from `TeleporterRegistryApp` can pause `TeleporterMessenger` interactions by calling `TeleporterRegistryApp.pauseTeleporterAddress`. This function prevents the dApp contract from interacting with the paused `TeleporterMessenger` address when sending or receiving ICM messages. `pauseTeleporterAddress` can only be called by addresses that passes the dApp's `TeleporterRegistryApp._checkTeleporterRegistryAppAccess` check. -The Teleporter address corresponding to a Teleporter version can be fetched from the registry with `TeleporterRegistry.getAddressFromVersion` +The `TeleporterMessenger` address corresponding to a `TeleporterMessenger` version can be fetched from the registry with `TeleporterRegistry.getAddressFromVersion` -> Example: Pause Teleporter version 3 +> Example: Pause TeleporterMessenger version 3 > > ``` > versionThreeAddress=$(cast call "getAddressFromVersion(uint256)(address)" 3) > cast send "pauseTeleporterAddress(address)" $versionThreeAddress > ``` -#### Pause all Teleporter interactions +#### Pause all TeleporterMessenger interactions -To pause all Teleporter interactions, `TeleporterRegistryApp.pauseTeleporterAddress` must be called for every Teleporter version from the `minTeleporterVersion` to the latest Teleporter version registered in `TeleporterRegistry`. Note that there may be gaps in Teleporter versions registered with `TeleporterRegistry`, but they will always be in increasing order. The latest Teleporter version can be obtained by inspecting the public variable `TeleporterRegistry.latestVersion`. The `minTeleporterVersion` can be obtained by calling `TeleporterRegistryApp.getMinTeleporterVersion`. +To pause all `TeleporterMessenger` interactions, `TeleporterRegistryApp.pauseTeleporterAddress` must be called for every `TeleporterMessenger` version from the `minTeleporterVersion` to the latest `TeleporterMessenger` version registered in `TeleporterRegistry`. Note that there may be gaps in `TeleporterMessenger` versions registered with `TeleporterRegistry`, but they will always be in increasing order. The latest `TeleporterMessenger` version can be obtained by inspecting the public variable `TeleporterRegistry.latestVersion`. The `minTeleporterVersion` can be obtained by calling `TeleporterRegistryApp.getMinTeleporterVersion`. -> Example: Pause all registered Teleporter versions +> Example: Pause all registered TeleporterMessenger versions > > ``` -> # Fetch the minimum Teleporter version +> # Fetch the minimum TeleporterMessenger version > minVersion=$(cast call "getMinTeleporterVersion()(uint256)") > > # Fetch the latest registered version @@ -196,13 +196,13 @@ To pause all Teleporter interactions, `TeleporterRegistryApp.pauseTeleporterAddr > done > ``` -#### Unpausing Teleporter version interactions +#### Unpausing TeleporterMessenger version interactions -As with pausing, dApps can unpause Teleporter interactions by calling `TeleporterRegistryApp.unpauseTeleporterAddress`. This unpause function allows receiving Teleporter message from the unpaused Teleporter address, and also enables the sending of messages through the unpaused Teleporter address in `_getTeleporterMessenger()`. Unpausing is also only allowed by addresses passing the dApp's `_checkTeleporterRegistryAppAccess` check. +As with pausing, dApps can unpause `TeleporterMessenger` interactions by calling `TeleporterRegistryApp.unpauseTeleporterAddress`. This unpause function allows receiving `TeleporterMessenger` message from the unpaused `TeleporterMessenger` address, and also enables the sending of messages through the unpaused `TeleporterMessenger` address in `_getTeleporterMessenger()`. Unpausing is also only allowed by addresses passing the dApp's `_checkTeleporterRegistryAppAccess` check. -Note that receiving Teleporter messages is still governed by the `minTeleporterVersion` check, so even if a Teleporter address is unpaused, the dApp will not receive messages from the unpaused Teleporter address if the Teleporter version is less than `minTeleporterVersion`. +Note that receiving `TeleporterMessenger` messages is still governed by the `minTeleporterVersion` check, so even if a `TeleporterMessenger` address is unpaused, the dApp will not receive messages from the unpaused `TeleporterMessenger` address if the `TeleporterMessenger` version is less than `minTeleporterVersion`. -> Example: Unpause Teleporter version 3 +> Example: Unpause TeleporterMessenger version 3 > > ``` > versionThreeAddress=$(cast call "getAddressFromVersion(uint256)(address)" 3) diff --git a/contracts/teleporter/registry/UPGRADING.md b/contracts/teleporter/registry/UPGRADING.md index 1394cd974..9b4a2331a 100644 --- a/contracts/teleporter/registry/UPGRADING.md +++ b/contracts/teleporter/registry/UPGRADING.md @@ -1,36 +1,36 @@ -# Upgrading Teleporter +# Upgrading TeleporterMessenger -This document outlines the high-level steps necessary to upgrade Teleporter as a subnet operator, a relayer operator, and a dApp admin. As a reference, the [Teleporter Registry test suite](../../../tests/flows/teleporter_registry.go) implements the steps described in a test environment. +This document outlines the high-level steps necessary to upgrade `TeleporterMessenger` as an Avalanche L1 operator, a relayer operator, and a dApp admin. As a reference, the [Teleporter Registry test suite](../../../tests/flows/teleporter_registry.go) implements the steps described in a test environment. -## Register a New Teleporter Version +## Register a New TeleporterMessenger Version -Once a new Teleporter contract instance is [deployed](../../../utils/contract-deployment/README.md), the `addProtocolVersion` method of [TeleporterRegistry.sol](./TeleporterRegistry.sol) must be called. This method is only callable if the associated Warp message was sent via an off-chain Warp message, which is provided by a validator's chain config. +Once a new `TeleporterMessenger` contract instance is [deployed](../../../utils/contract-deployment/README.md), the `addProtocolVersion` method of [TeleporterRegistry.sol](./TeleporterRegistry.sol) must be called. This method is only callable if the associated ICM message was sent via an off-chain ICM message, which is provided by a validator's chain config. The steps to do so are as follows: -1. Construct the unsigned Warp message bytes: +1. Construct the unsigned ICM message bytes: - a. Pack the Warp payload to be parsed by `addProtocolVersion`. This is a tuple of `(ProtocolRegistryEntry, address)`, where the `ProtocolRegistryEntry` specifies the new `TeleporterMessenger` contract address and the version, and the `address` specifies the `TeleporterRegistry` contract address that the new Teleporter version will be registered with. + a. Pack the ICM payload to be parsed by `addProtocolVersion`. This is a tuple of `(ProtocolRegistryEntry, address)`, where the `ProtocolRegistryEntry` specifies the new `TeleporterMessenger` contract address and the version, and the `address` specifies the `TeleporterRegistry` contract address that the new `TeleporterMessenger` version will be registered with. - b. Pack the Warp payload as an [AddressedCall](https://github.com/ava-labs/avalanchego/blob/v1.11.3/vms/platformvm/warp/payload/addressed_call.go#L15), with the source address set to the zero address. This is how `addProtocolVersion` identifies this message as an off-chain Warp message. + b. Pack the ICM payload as an [AddressedCall](https://github.com/ava-labs/avalanchego/blob/v1.11.3/vms/platformvm/warp/payload/addressed_call.go#L15), with the source address set to the zero address. This is how `addProtocolVersion` identifies this message as an off-chain ICM message. - c. Pack the `AddressedCall` message into an [unsigned Warp message](https://github.com/ava-labs/avalanchego/blob/v1.11.3/vms/platformvm/warp/unsigned_message.go#L14), specifying the blockchain ID that `TeleporterRegistry` and the new `TeleporterMessenger` are deployed to. + c. Pack the `AddressedCall` message into an [unsigned ICM message](https://github.com/ava-labs/avalanchego/blob/v1.11.3/vms/platformvm/warp/unsigned_message.go#L14), specifying the blockchain ID that `TeleporterRegistry` and the new `TeleporterMessenger` are deployed to. -2. Populate the "warp-off-chain-messages" field of each validator node's chain config with the hex-encoded unsigned Warp message bytes. +2. Populate the "warp-off-chain-messages" field of each validator node's chain config with the hex-encoded unsigned ICM message bytes. -3. Restart the node to mark the off-chain Warp message as eligible for signing by the validator. +3. Restart the node to mark the off-chain ICM message as eligible for signing by the validator. -To actually register the new Teleporter version with the registry, the validators must be queried for their signature of the message, the signatures aggregated, and a signed Warp message created to be included in the transaction that calls `addProtocolVersion`. As an example, [AWM Relayer](https://github.com/ava-labs/awm-relayer) provides this functionality. The following steps illustrate how to use AWM Relayer to register the new Teleporter version. +To actually register the new `TeleporterMessenger` version with the registry, the validators must be queried for their signature of the message, the signatures aggregated, and a signed ICM message created to be included in the transaction that calls `addProtocolVersion`. As an example, [AWM Relayer](https://github.com/ava-labs/awm-relayer) provides this functionality. The following steps illustrate how to use AWM Relayer to register the new `TeleporterMessenger` version. 1. Construct a "manual-warp-messages" entry in the AWM Relayer configuration file, using the following values: - a. "unsigned-message-bytes": the hex-encoded unsigned Warp message bytes derived above. + a. "unsigned-message-bytes": the hex-encoded unsigned ICM message bytes derived above. b. "source-blockchain-id": the blockchain ID that that `TeleporterRegistry` and the new `TeleporterMessenger` are deployed to. c. "destination-blockchain-id": the blockchain ID that that `TeleporterRegistry` and the new `TeleporterMessenger` are deployed to. - d. "source-address": the zero address, "0x0000000000000000000000000000000000000000". This is the "source" address for off-chain Warp messages. + d. "source-address": the zero address, "0x0000000000000000000000000000000000000000". This is the "source" address for off-chain ICM messages. 2. Add the `TeleporterRegistry` as a supported message type by adding the following entry to the list of "message-contracts": @@ -46,4 +46,4 @@ To actually register the new Teleporter version with the registry, the validator } ``` -3. Restart the relayer. On startup, it will query the validator nodes for their BLS signatures on the off-chain Warp message, construct an aggregate signature and signed Warp message, and use it to call `addProtocolVersion` in the registry. +3. Restart the relayer. On startup, it will query the validator nodes for their BLS signatures on the off-chain ICM message, construct an aggregate signature and signed ICM message, and use it to call `addProtocolVersion` in the registry. diff --git a/contracts/teleporter/tests/AddFeeAmountTests.t.sol b/contracts/teleporter/tests/AddFeeAmountTests.t.sol index c449cb47b..1b85cf321 100644 --- a/contracts/teleporter/tests/AddFeeAmountTests.t.sol +++ b/contracts/teleporter/tests/AddFeeAmountTests.t.sol @@ -66,7 +66,7 @@ contract AddFeeAmountTest is TeleporterMessengerTest { bytes32 messageID = _sendTestMessageWithFee(DEFAULT_DESTINATION_BLOCKCHAIN_ID, originalFeeAmount); - // Now mock receiving a message back from that subnet with a receipt of the above message. + // Now mock receiving a message back from that L1 with a receipt of the above message. address relayerRewardAddress = 0xA66884fAdC0D4d7B7eedcF61Eb863Ff413bB6234; TeleporterMessageReceipt[] memory receipts = new TeleporterMessageReceipt[](1); receipts[0] = TeleporterMessageReceipt({ diff --git a/contracts/teleporter/tests/GetFeeInfoTests.t.sol b/contracts/teleporter/tests/GetFeeInfoTests.t.sol index 526c0c280..e7b9a856a 100644 --- a/contracts/teleporter/tests/GetFeeInfoTests.t.sol +++ b/contracts/teleporter/tests/GetFeeInfoTests.t.sol @@ -49,7 +49,7 @@ contract GetFeeInfoTest is TeleporterMessengerTest { uint256 expectedNonce = _getNextMessageNonce(); bytes32 messageID = _sendTestMessageWithFee(DEFAULT_DESTINATION_BLOCKCHAIN_ID, feeAmount); - // Now mock receiving a message back from that subnet with a receipt of the above message. + // Now mock receiving a message back from that L1 with a receipt of the above message. address relayerRewardAddress = 0xA66884fAdC0D4d7B7eedcF61Eb863Ff413bB6234; TeleporterMessageReceipt[] memory receipts = new TeleporterMessageReceipt[](1); receipts[0] = TeleporterMessageReceipt({ diff --git a/contracts/teleporter/tests/GetMessageHashTests.t.sol b/contracts/teleporter/tests/GetMessageHashTests.t.sol index 8ffc1a0c0..c606c91c2 100644 --- a/contracts/teleporter/tests/GetMessageHashTests.t.sol +++ b/contracts/teleporter/tests/GetMessageHashTests.t.sol @@ -46,7 +46,7 @@ contract GetMessageHashTest is TeleporterMessengerTest { uint256 expectedNonce = _getNextMessageNonce(); bytes32 messageID = _sendTestMessageWithNoFee(DEFAULT_DESTINATION_BLOCKCHAIN_ID); - // Now mock receiving a message back from that subnet with a receipt of the above message. + // Now mock receiving a message back from that L1 with a receipt of the above message. address relayerRewardAddress = 0xA66884fAdC0D4d7B7eedcF61Eb863Ff413bB6234; TeleporterMessageReceipt[] memory receipts = new TeleporterMessageReceipt[](1); receipts[0] = TeleporterMessageReceipt({ diff --git a/contracts/teleporter/tests/HandleInitialMessageExecutionTests.t.sol b/contracts/teleporter/tests/HandleInitialMessageExecutionTests.t.sol index 890950851..12388e7c8 100644 --- a/contracts/teleporter/tests/HandleInitialMessageExecutionTests.t.sol +++ b/contracts/teleporter/tests/HandleInitialMessageExecutionTests.t.sol @@ -22,7 +22,7 @@ enum SampleMessageReceiverAction { contract SampleMessageReceiver is ITeleporterReceiver { address public immutable teleporterContract; string public latestMessage; - bytes32 public latestMessageSenderSubnetID; + bytes32 public latestMessageSenderL1ID; address public latestMessageSenderAddress; constructor(address teleporterContractAddress) { @@ -59,7 +59,7 @@ contract SampleMessageReceiver is ITeleporterReceiver { require(msg.sender == teleporterContract, "unauthorized"); require(succeed, "intended to fail"); latestMessage = message; - latestMessageSenderSubnetID = sourceBlockchainID; + latestMessageSenderL1ID = sourceBlockchainID; latestMessageSenderAddress = originSenderAddress; } @@ -73,7 +73,7 @@ contract SampleMessageReceiver is ITeleporterReceiver { ITeleporterMessenger messenger = ITeleporterMessenger(teleporterContract); messenger.receiveCrossChainMessage(0, address(42)); latestMessage = message; - latestMessageSenderSubnetID = sourceBlockchainID; + latestMessageSenderL1ID = sourceBlockchainID; latestMessageSenderAddress = originSenderAddress; } } @@ -128,7 +128,7 @@ contract HandleInitialMessageExecutionTest is TeleporterMessengerTest { // Check that the message had the proper affect on the destination contract. assertEq(destinationContract.latestMessage(), messageString); - assertEq(destinationContract.latestMessageSenderSubnetID(), DEFAULT_SOURCE_BLOCKCHAIN_ID); + assertEq(destinationContract.latestMessageSenderL1ID(), DEFAULT_SOURCE_BLOCKCHAIN_ID); assertEq(destinationContract.latestMessageSenderAddress(), address(this)); assertEq( teleporterMessenger.getRelayerRewardAddress(expectedMessageID), @@ -203,7 +203,7 @@ contract HandleInitialMessageExecutionTest is TeleporterMessengerTest { // Check that the message hash was stored in state and the message did not have any affect on the destination. assertEq(destinationContract.latestMessage(), ""); - assertEq(destinationContract.latestMessageSenderSubnetID(), bytes32(0)); + assertEq(destinationContract.latestMessageSenderL1ID(), bytes32(0)); assertEq(destinationContract.latestMessageSenderAddress(), address(0)); assertEq( teleporterMessenger.getRelayerRewardAddress(messageID), DEFAULT_RELAYER_REWARD_ADDRESS @@ -251,7 +251,7 @@ contract HandleInitialMessageExecutionTest is TeleporterMessengerTest { // Check that the message hash was stored in state and the message did not have any affect on the destination. assertEq(destinationContract.latestMessage(), ""); - assertEq(destinationContract.latestMessageSenderSubnetID(), bytes32(0)); + assertEq(destinationContract.latestMessageSenderL1ID(), bytes32(0)); assertEq(destinationContract.latestMessageSenderAddress(), address(0)); assertEq( teleporterMessenger.getRelayerRewardAddress(messageID), DEFAULT_RELAYER_REWARD_ADDRESS diff --git a/contracts/teleporter/tests/MarkReceiptTests.t.sol b/contracts/teleporter/tests/MarkReceiptTests.t.sol index aba701173..6f5cc1ac7 100644 --- a/contracts/teleporter/tests/MarkReceiptTests.t.sol +++ b/contracts/teleporter/tests/MarkReceiptTests.t.sol @@ -26,8 +26,8 @@ contract MarkReceiptTest is TeleporterMessengerTest { TeleporterMessengerTest.setUp(); } - // This test first mocks sending 3 messages (each with fees) to a different subnet. - // It then mocks receiving a message back from that subnet with the receipt information + // This test first mocks sending 3 messages (each with fees) to a different L1. + // It then mocks receiving a message back from that L1 with the receipt information // for each of the 3 messages sent, and checks that the relayers can redeem their rewards. function testCheckRelayersUponReceipt() public { // Submit a few mock messages to be sent. diff --git a/contracts/teleporter/tests/MessageReceivedTests.t.sol b/contracts/teleporter/tests/MessageReceivedTests.t.sol index 81a920334..fb7221400 100644 --- a/contracts/teleporter/tests/MessageReceivedTests.t.sol +++ b/contracts/teleporter/tests/MessageReceivedTests.t.sol @@ -16,7 +16,7 @@ contract MessageReceivedTest is TeleporterMessengerTest { } function testReceivedMessage() public { - // Mock receiving a message from another subnet. + // Mock receiving a message from another L1. address relayerRewardAddress = 0xA66884fAdC0D4d7B7eedcF61Eb863Ff413bB6234; uint256 messageNonce = 1; bytes32 messageID = teleporterMessenger.calculateMessageID( diff --git a/contracts/teleporter/tests/ReceiveCrossChainMessageTests.t.sol b/contracts/teleporter/tests/ReceiveCrossChainMessageTests.t.sol index 5b8084b16..049cc750f 100644 --- a/contracts/teleporter/tests/ReceiveCrossChainMessageTests.t.sol +++ b/contracts/teleporter/tests/ReceiveCrossChainMessageTests.t.sol @@ -29,7 +29,7 @@ contract ReceiveCrossChainMessagedTest is TeleporterMessengerTest { function testSuccess() public { // This test contract must be an allowed relayer since it is what - // will call receiveCrossSubnetMessage. + // will call receiveCrossChainMessage. address[] memory allowedRelayers = new address[](2); allowedRelayers[0] = address(this); allowedRelayers[1] = DEFAULT_RELAYER_REWARD_ADDRESS; diff --git a/contracts/teleporter/tests/RedeemRelayerRewardsTests.t.sol b/contracts/teleporter/tests/RedeemRelayerRewardsTests.t.sol index d756be83e..f551b50f1 100644 --- a/contracts/teleporter/tests/RedeemRelayerRewardsTests.t.sol +++ b/contracts/teleporter/tests/RedeemRelayerRewardsTests.t.sol @@ -101,7 +101,7 @@ contract RedeemRelayerRewardsTest is TeleporterMessengerTest { ); } - // Mocks sending a message with the given fee info to another subnet, and then + // Mocks sending a message with the given fee info to another L1, and then // receiving back a message with receipt of that message such that the relayer // is able to redeem the reward. function _setUpRelayerRewards(FeeRewardInfo memory feeRewardInfo) private { diff --git a/contracts/teleporter/tests/RetryMessageExecutionTests.t.sol b/contracts/teleporter/tests/RetryMessageExecutionTests.t.sol index 890640f75..1f34c3b94 100644 --- a/contracts/teleporter/tests/RetryMessageExecutionTests.t.sol +++ b/contracts/teleporter/tests/RetryMessageExecutionTests.t.sol @@ -25,7 +25,7 @@ enum FlakyMessageReceiverAction { contract FlakyMessageReceiver is ITeleporterReceiver { address public immutable teleporterContract; string public latestMessage; - bytes32 public latestMessageSenderSubnetID; + bytes32 public latestMessageSenderL1ID; address public latestMessageSenderAddress; constructor(address teleporterContractAddress) { @@ -61,7 +61,7 @@ contract FlakyMessageReceiver is ITeleporterReceiver { require(msg.sender == teleporterContract, "unauthorized"); require(block.number % 2 != 0, "even block number"); latestMessage = message; - latestMessageSenderSubnetID = sourceBlockchainID; + latestMessageSenderL1ID = sourceBlockchainID; latestMessageSenderAddress = originSenderAddress; } @@ -77,7 +77,7 @@ contract FlakyMessageReceiver is ITeleporterReceiver { ITeleporterMessenger messenger = ITeleporterMessenger(teleporterContract); messenger.receiveCrossChainMessage(0, address(42)); latestMessage = message; - latestMessageSenderSubnetID = sourceBlockchainID; + latestMessageSenderL1ID = sourceBlockchainID; latestMessageSenderAddress = originSenderAddress; } } @@ -227,7 +227,7 @@ contract RetryMessageExecutionTest is TeleporterMessengerTest { // Check that the message execution didn't have any effect, but // the message was marked as marked as delivered. assertEq(destinationContract.latestMessage(), ""); - assertEq(destinationContract.latestMessageSenderSubnetID(), bytes32(0)); + assertEq(destinationContract.latestMessageSenderL1ID(), bytes32(0)); assertEq(destinationContract.latestMessageSenderAddress(), address(0)); assertEq( teleporterMessenger.getRelayerRewardAddress(messageID), DEFAULT_RELAYER_REWARD_ADDRESS @@ -255,7 +255,7 @@ contract RetryMessageExecutionTest is TeleporterMessengerTest { // Check that the message had the proper affect on the destination contract. assertEq(destinationContract.latestMessage(), messageString); - assertEq(destinationContract.latestMessageSenderSubnetID(), sourceBlockchainID); + assertEq(destinationContract.latestMessageSenderL1ID(), sourceBlockchainID); assertEq(destinationContract.latestMessageSenderAddress(), address(this)); return (sourceBlockchainID, message); diff --git a/contracts/utilities/TokenScalingUtils.sol b/contracts/utilities/TokenScalingUtils.sol index c33b2cde8..620ddcb45 100644 --- a/contracts/utilities/TokenScalingUtils.sol +++ b/contracts/utilities/TokenScalingUtils.sol @@ -59,7 +59,7 @@ library TokenScalingUtils { /** * @dev Scales {value} based on {tokenMultiplier} and if the amount is applying or * removing the TokenRemote instance's token scale. - * Should be used for all tokens and fees being transferred to/from other subnets. + * Should be used for all tokens and fees being transferred to/from other L1s. * @param tokenMultiplier The token multiplier of the TokenRemote instance. * @param multiplyOnRemote Whether the amount of home tokens will be multiplied on the remote, or divided. * @param amount The amount of tokens to scale. diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 027d0f567..a2673bf79 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -57,7 +57,7 @@ abstract contract PoSValidatorManager is uint256 _weightToValueFactor; /// @notice The reward calculator for this validator manager. IRewardCalculator _rewardCalculator; - /// @notice The ID of the blockchain that submits uptime proofs. This must be a blockchain validated by the subnetID that this contract manages. + /// @notice The ID of the blockchain that submits uptime proofs. This must be a blockchain validated by the l1ID that this contract manages. bytes32 _uptimeBlockchainID; /// @notice Maps the validation ID to its requirements. mapping(bytes32 validationID => PoSValidatorInfo) _posValidatorInfo; diff --git a/contracts/validator-manager/README.md b/contracts/validator-manager/README.md index 12202aa76..165deb01b 100644 --- a/contracts/validator-manager/README.md +++ b/contracts/validator-manager/README.md @@ -49,7 +49,7 @@ Three concrete `ValidatorManager` contracts are provided - `PoAValidatorManager` 4. Initialize the validator set by calling `initializeValidatorSet` -- When a Subnet is first created on the P-Chain, it must be explicitly converted to an L1 via [`ConvertSubnetToL1Tx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#convertsubnettol1tx). The resulting `SubnetToL1ConversionMessage` Warp [message](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#subnettol1conversionmessage) is provided in the call to `initializeValidatorSet` to specify the starting validator set in the `ValidatorManager`. Regardless of the implementation, these initial validators are treated as PoA and are not eligible for staking rewards. +- When an L1 is first created on the P-Chain, it must be explicitly converted to an L1 via [`ConvertSubnetToL1Tx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#convertsubnettol1tx). The resulting `SubnetToL1ConversionMessage` Warp [message](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#subnettol1conversionmessage) is provided in the call to `initializeValidatorSet` to specify the starting validator set in the `ValidatorManager`. Regardless of the implementation, these initial validators are treated as PoA and are not eligible for staking rewards. ### PoAValidatorManager @@ -132,7 +132,7 @@ Disabled L1 validators can re-activate at any time by increasing their balance w ### (PoS only) Remove a Delegator -Delegators removal may be initiated by calling `initializeEndDelegation`, as long as churn restrictions are not violated. Similar to `initializeEndValidation`, an uptime proof may be provided to be used to determine delegator rewards eligibility. If no proof is provided, the latest known uptime will be used (see [(PoS only) Submit and Uptime Proof](#pos-only-submit-an-uptime-proof)). The validator's weight is updated on the P-Chain by the same mechanism used to register a delegator. The `SubnetValidatorWeightUpdateMessage` from the P-Chain is delivered to the `PoSValidatorManager` in the call to `completeEndDelegation`. +Delegators removal may be initiated by calling `initializeEndDelegation`, as long as churn restrictions are not violated. Similar to `initializeEndValidation`, an uptime proof may be provided to be used to determine delegator rewards eligibility. If no proof is provided, the latest known uptime will be used (see [(PoS only) Submit and Uptime Proof](#pos-only-submit-an-uptime-proof)). The validator's weight is updated on the P-Chain by the same mechanism used to register a delegator. The `L1ValidatorWeightMessage` from the P-Chain is delivered to the `PoSValidatorManager` in the call to `completeEndDelegation`. Either the delegator owner or the validator owner may initiate removing a delegator. This is to prevent the validator from being unable to remove itself due to churn limitations if it is has too high a proportion of the Subnet's total weight due to delegator additions. The validator owner may only remove Delegators after the minimum stake duration has elapsed. diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 172ffe91d..7ccd56782 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -36,8 +36,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida /// @custom:storage-location erc7201:avalanche-icm.storage.ValidatorManager struct ValidatorManagerStorage { - /// @notice The subnetID associated with this validator manager. - bytes32 _subnetID; + /// @notice The l1ID associated with this validator manager. + bytes32 _l1ID; /// @notice The number of seconds after which to reset the churn tracker. uint64 _churnPeriodSeconds; /// @notice The maximum churn rate allowed per churn period. @@ -118,7 +118,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida onlyInitializing { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - $._subnetID = settings.subnetID; + $._l1ID = settings.l1ID; if ( settings.maximumChurnPercentage > MAXIMUM_CHURN_PERCENTAGE_LIMIT @@ -150,7 +150,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida revert InvalidInitializationStatus(); } // Check that the blockchainID and validator manager address in the ConversionData correspond to this contract. - // Other validation checks are done by the P-Chain when converting the subnet, so are not required here. + // Other validation checks are done by the P-Chain when converting the L1, so are not required here. if (conversionData.validatorManagerBlockchainID != WARP_MESSENGER.getBlockchainID()) { revert InvalidValidatorManagerBlockchainID(conversionData.validatorManagerBlockchainID); } @@ -168,8 +168,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida } // Validation ID of the initial validators is the sha256 hash of the - // convert Subnet tx ID and the index of the initial validator. - bytes32 validationID = sha256(abi.encodePacked(conversionData.subnetID, i)); + // convert subnet to L1 tx ID and the index of the initial validator. + bytes32 validationID = sha256(abi.encodePacked(conversionData.l1ID, i)); // Save the initial validator as an active validator. @@ -195,7 +195,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida revert InvalidTotalWeight(totalWeight); } - // Verify that the sha256 hash of the Subnet conversion data matches with the Warp message's conversionID. + // Verify that the sha256 hash of the L1 conversion data matches with the Warp message's conversionID. bytes32 conversionID = ValidatorMessages.unpackSubnetToL1ConversionMessage( _getPChainWarpMessage(messageIndex).payload ); @@ -276,10 +276,10 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Check that adding this validator would not exceed the maximum churn rate. _checkAndUpdateChurnTracker(weight, 0); - (bytes32 validationID, bytes memory registerSubnetValidatorMessage) = ValidatorMessages + (bytes32 validationID, bytes memory registerL1ValidatorMessage) = ValidatorMessages .packRegisterL1ValidatorMessage( ValidatorMessages.ValidationPeriod({ - subnetID: $._subnetID, + l1ID: $._l1ID, nodeID: input.nodeID, blsPublicKey: input.blsPublicKey, remainingBalanceOwner: input.remainingBalanceOwner, @@ -288,11 +288,11 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida weight: weight }) ); - $._pendingRegisterValidationMessages[validationID] = registerSubnetValidatorMessage; + $._pendingRegisterValidationMessages[validationID] = registerL1ValidatorMessage; $._registeredValidators[input.nodeID] = validationID; // Submit the message to the Warp precompile. - bytes32 messageID = WARP_MESSENGER.sendWarpMessage(registerSubnetValidatorMessage); + bytes32 messageID = WARP_MESSENGER.sendWarpMessage(registerL1ValidatorMessage); $._validationPeriods[validationID].status = ValidatorStatus.PendingAdded; $._validationPeriods[validationID].nodeID = input.nodeID; $._validationPeriods[validationID].startingWeight = weight; @@ -542,7 +542,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida function _getSettings() internal view returns (ValidatorManagerSettings memory) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); return ValidatorManagerSettings({ - subnetID: $._subnetID, + l1ID: $._l1ID, churnPeriodSeconds: $._churnPeriodSeconds, maximumChurnPercentage: $._maximumChurnPercentage }); diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 9adcdc8aa..9f481c601 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -7,15 +7,15 @@ pragma solidity 0.8.25; import {PChainOwner, ConversionData} from "./interfaces/IValidatorManager.sol"; /** - * @dev Packing utilities for the Warp message types used by the Validator Manager contracts, as specified in ACP-77: + * @dev Packing utilities for the ICM message types used by the Validator Manager contracts, as specified in ACP-77: * https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets */ library ValidatorMessages { - // The information that uniquely identifies a subnet validation period. + // The information that uniquely identifies an L1 validation period. // The validationID is the SHA-256 hash of the concatenation of the CODEC_ID, // REGISTER_L1_VALIDATOR_MESSAGE_TYPE_ID, and the concatenated ValidationPeriod fields. struct ValidationPeriod { - bytes32 subnetID; + bytes32 l1ID; bytes nodeID; bytes blsPublicKey; uint64 registrationExpiry; @@ -126,7 +126,7 @@ library ValidatorMessages { * +----------------+-----------------+--------------------------------------------------------+ * | codecID : uint16 | 2 bytes | * +----------------+-----------------+--------------------------------------------------------+ - * | subnetID : [32]byte | 32 bytes | + * | l1ID : [32]byte | 32 bytes | * +----------------+-----------------+--------------------------------------------------------+ * | managerChainID : [32]byte | 32 bytes | * +----------------+-----------------+--------------------------------------------------------+ @@ -148,7 +148,7 @@ library ValidatorMessages { * +------------------------+ * * @dev Input validation is skipped, since the returned value is intended to be compared - * directly with an authenticated Warp message. + * directly with an authenticated ICM message. * @param conversionData The struct representing data to pack into the message. * @return The packed message. */ @@ -161,7 +161,7 @@ library ValidatorMessages { // solhint-disable-next-line func-named-parameters bytes memory res = abi.encodePacked( CODEC_ID, - conversionData.subnetID, + conversionData.l1ID, conversionData.validatorManagerBlockchainID, uint32(20), conversionData.validatorManagerAddress, @@ -192,7 +192,7 @@ library ValidatorMessages { * +-----------------------+-------------+--------------------------------------------------------------------+ * | typeID : uint32 | 4 bytes | * +-----------------------+-------------+-------------------------------------------------------------------+ - * | subnetID : [32]byte | 32 bytes | + * | l1ID : [32]byte | 32 bytes | * +-----------------------+-------------+--------------------------------------------------------------------+ * | nodeID : []byte | 4 + len(nodeID) bytes | * +-----------------------+-------------+--------------------------------------------------------------------+ @@ -234,7 +234,7 @@ library ValidatorMessages { bytes memory res = abi.encodePacked( CODEC_ID, REGISTER_L1_VALIDATOR_MESSAGE_TYPE_ID, - validationPeriod.subnetID, + validationPeriod.l1ID, uint32(validationPeriod.nodeID.length), validationPeriod.nodeID, validationPeriod.blsPublicKey, @@ -298,13 +298,13 @@ library ValidatorMessages { index += 4; } - // Unpack the subnetID + // Unpack the l1ID { - bytes32 subnetID; + bytes32 l1ID; for (uint256 i; i < 32; ++i) { - subnetID |= bytes32(uint256(uint8(input[i + index])) << (8 * (31 - i))); + l1ID |= bytes32(uint256(uint8(input[i + index])) << (8 * (31 - i))); } - validation.subnetID = subnetID; + validation.l1ID = l1ID; index += 32; } @@ -544,7 +544,7 @@ library ValidatorMessages { } /** - * @notice Unpacks a byte array as a SubnetValidatorWeightMessage. + * @notice Unpacks a byte array as an L1ValidatorWeightMessage. * The message format specification is the same as the one used in above for packing. * * @param input The byte array to unpack. diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index f4a87b72b..3b5798887 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -30,7 +30,7 @@ enum DelegatorStatus { * @notice weightToValueFactor is the factor used to convert validator weight to value * @notice rewardCalculator is the reward calculator used to calculate rewards for this validator manager * @notice uptimeBlockchainID is the ID of the blockchain that submits uptime proofs. - * This must be a blockchain validated by the subnetID that this contract manages. + * This must be a blockchain validated by the l1ID that this contract manages. */ struct PoSValidatorManagerSettings { ValidatorManagerSettings baseSettings; @@ -79,7 +79,7 @@ interface IPoSValidatorManager is IValidatorManager { * @param nonce The message nonce used to update the validator weight * @param validatorWeight The updated validator weight that is sent to the P-Chain * @param delegatorWeight The weight of the delegator - * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain + * @param setWeightMessageID The ID of the ICM message that updates the validator's weight on the P-Chain */ event DelegatorAdded( bytes32 indexed delegationID, @@ -130,7 +130,7 @@ interface IPoSValidatorManager is IValidatorManager { * @notice Updates the uptime of the validationID if the submitted proof is greated than the stored uptime. * Anybody may call this function to ensure the stored uptime is accurate. Callable only when the validation period is active. * @param validationID The ID of the validation period - * @param messageIndex The index of the Warp message to be received providing the uptime proof + * @param messageIndex The index of the ICM message to be received providing the uptime proof */ function submitUptimeProof(bytes32 validationID, uint32 messageIndex) external; @@ -143,7 +143,7 @@ interface IPoSValidatorManager is IValidatorManager { * @param validationID The ID of the validation period being ended. * @param includeUptimeProof Whether or not an uptime proof is provided for the validation period. If no uptime proof is provided, * the latest known uptime will be used. - * @param messageIndex The index of the Warp message to be received providing the uptime proof. + * @param messageIndex The index of the ICM message to be received providing the uptime proof. */ function initializeEndValidation( bytes32 validationID, @@ -171,7 +171,7 @@ interface IPoSValidatorManager is IValidatorManager { * @param validationID The ID of the validation period being ended. * @param includeUptimeProof Whether or not an uptime proof is provided for the validation period. If no uptime proof is provided, * the latest known uptime will be used. - * @param messageIndex The index of the Warp message to be received providing the uptime proof. + * @param messageIndex The index of the ICM message to be received providing the uptime proof. */ function forceInitializeEndValidation( bytes32 validationID, @@ -199,7 +199,7 @@ interface IPoSValidatorManager is IValidatorManager { * Note: Only the specified delegation will be marked as registered, even if the validator weight update * message implicitly includes multiple weight changes. * @param delegationID The ID of the delegation being registered. - * @param messageIndex The index of the Warp message to be received providing the acknowledgement. + * @param messageIndex The index of the ICM message to be received providing the acknowledgement. */ function completeDelegatorRegistration(bytes32 delegationID, uint32 messageIndex) external; @@ -215,7 +215,7 @@ interface IPoSValidatorManager is IValidatorManager { * If the validator has completed its validation period, it has already provided an uptime proof, so {includeUptimeProof} * will be ignored and can be set to false. If the validator has not completed its validation period and no uptime proof * is provided, the latest known uptime will be used. - * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the + * @param messageIndex If {includeUptimeProof} is true, the index of the ICM message to be received providing the * uptime proof. */ function initializeEndDelegation( @@ -246,7 +246,7 @@ interface IPoSValidatorManager is IValidatorManager { * If the validator has completed its validation period, it has already provided an uptime proof, so {includeUptimeProof} * will be ignored and can be set to false. If the validator has not completed its validation period and no uptime proof * is provided, the latest known uptime will be used. - * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the + * @param messageIndex If {includeUptimeProof} is true, the index of the ICM message to be received providing the * uptime proof. */ function forceInitializeEndDelegation( @@ -282,7 +282,7 @@ interface IPoSValidatorManager is IValidatorManager { * Note: Only the specified delegation will be marked as completed, even if the validator weight update * message implicitly includes multiple weight changes. * @param delegationID The ID of the delegation being removed. - * @param messageIndex The index of the Warp message to be received providing the acknowledgement. + * @param messageIndex The index of the ICM message to be received providing the acknowledgement. */ function completeEndDelegation(bytes32 delegationID, uint32 messageIndex) external; diff --git a/contracts/validator-manager/interfaces/IValidatorManager.sol b/contracts/validator-manager/interfaces/IValidatorManager.sol index f04629bf5..e0c2280de 100644 --- a/contracts/validator-manager/interfaces/IValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IValidatorManager.sol @@ -51,12 +51,12 @@ struct ValidatorChurnPeriod { /** * @notice Validator Manager settings, used to initialize the Validator Manager - * @notice The subnetID is the ID of the subnet that the Validator Manager is managing + * @notice The l1ID is the ID of the L1 that the Validator Manager is managing * @notice The churnPeriodSeconds is the duration of the churn period in seconds * @notice The maximumChurnPercentage is the maximum percentage of the total weight that can be added or removed in a single churn period */ struct ValidatorManagerSettings { - bytes32 subnetID; + bytes32 l1ID; uint64 churnPeriodSeconds; uint8 maximumChurnPercentage; } @@ -68,7 +68,7 @@ struct ValidatorManagerSettings { * and verified by the Validator Manager. */ struct ConversionData { - bytes32 subnetID; + bytes32 l1ID; bytes32 validatorManagerBlockchainID; address validatorManagerAddress; InitialValidator[] initialValidators; @@ -105,7 +105,7 @@ interface IValidatorManager { * emitted. * @param validationID The ID of the validation period being created. * @param nodeID The node ID of the validator being registered. - * @param registerValidationMessageID The ID of the Warp message that will be sent to the P-Chain to register the + * @param registerValidationMessageID The ID of the ICM message that will be sent to the P-Chain to register the * validation period. * @param weight The weight of the validator being registered. * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. @@ -138,7 +138,7 @@ interface IValidatorManager { * {initializeEndValidation}. * Note: The stake for this validation period remains locked until a {ValidationPeriodRemoved} event is emitted. * @param validationID The ID of the validation period being removed. - * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain. + * @param setWeightMessageID The ID of the ICM message that updates the validator's weight on the P-Chain. * @param weight The weight of the validator being removed. * @param endTime The time at which the removal was initiated. */ @@ -162,7 +162,7 @@ interface IValidatorManager { * @param validationID The ID of the validation period being updated * @param nonce The message nonce used to update the validator weight * @param weight The updated validator weight that is sent to the P-Chain - * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain + * @param setWeightMessageID The ID of the ICM message that updates the validator's weight on the P-Chain */ event ValidatorWeightUpdate( bytes32 indexed validationID, @@ -174,7 +174,7 @@ interface IValidatorManager { /** * @notice Verifies and sets the initial validator set for the chain through a P-Chain SubnetToL1ConversionMessage. * @param conversionData The subnet conversion message data used to recompute and verify against the conversionID. - * @param messsageIndex The index that contains the SubnetToL1ConversionMessage Warp message containing the conversionID to be verified against the provided {ConversionData} + * @param messsageIndex The index that contains the SubnetToL1ConversionMessage ICM message containing the conversionID to be verified against the provided {ConversionData} */ function initializeValidatorSet( ConversionData calldata conversionData, @@ -191,7 +191,7 @@ interface IValidatorManager { /** * @notice Completes the validator registration process by returning an acknowledgement of the registration of a * validationID from the P-Chain. - * @param messageIndex The index of the Warp message to be received providing the acknowledgement. + * @param messageIndex The index of the ICM message to be received providing the acknowledgement. */ function completeValidatorRegistration(uint32 messageIndex) external; @@ -208,7 +208,7 @@ interface IValidatorManager { * with the validation. * Note: This function can be used for successful validation periods that have been explicitly ended by calling * {initializeEndValidation} or for validation periods that never began on the P-Chain due to the {registrationExpiry} being reached. - * @param messageIndex The index of the Warp message to be received providing the proof the validation is not active + * @param messageIndex The index of the ICM message to be received providing the proof the validation is not active * and never will be active on the P-Chain. */ function completeEndValidation(uint32 messageIndex) external; diff --git a/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol index 39be0f19e..0602df452 100644 --- a/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol @@ -37,7 +37,7 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { vm.expectRevert(abi.encodeWithSelector(Initializable.InvalidInitialization.selector)); app.initialize( ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), @@ -113,7 +113,7 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { app = new PoAValidatorManager(ICMInitializable.Allowed); app.initialize( ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 27297eb01..b338f38d5 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -1574,7 +1574,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testSubmitUptimeProofPoaValidator() public { - bytes32 defaultInitialValidationID = sha256(abi.encodePacked(DEFAULT_SUBNET_ID, uint32(1))); + bytes32 defaultInitialValidationID = sha256(abi.encodePacked(DEFAULT_L1_ID, uint32(1))); vm.expectRevert( abi.encodeWithSelector( @@ -1613,7 +1613,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testEndValidationPoAValidator() public { - bytes32 validationID = sha256(abi.encodePacked(DEFAULT_SUBNET_ID, uint32(1))); + bytes32 validationID = sha256(abi.encodePacked(DEFAULT_L1_ID, uint32(1))); vm.warp(DEFAULT_COMPLETION_TIMESTAMP); bytes memory setValidatorWeightPayload = @@ -1629,9 +1629,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 balanceBefore = _getStakeAssetBalance(address(this)); - bytes memory subnetValidatorRegistrationMessage = + bytes memory l1ValidatorRegistrationMessage = ValidatorMessages.packL1ValidatorRegistrationMessage(validationID, false); - _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); + _mockGetPChainWarpMessage(l1ValidatorRegistrationMessage, true); posValidatorManager.completeEndValidation(0); @@ -1639,7 +1639,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testDelegationToPoAValidator() public { - bytes32 defaultInitialValidationID = sha256(abi.encodePacked(DEFAULT_SUBNET_ID, uint32(1))); + bytes32 defaultInitialValidationID = sha256(abi.encodePacked(DEFAULT_L1_ID, uint32(1))); _beforeSend(_weightToValue(DEFAULT_DELEGATOR_WEIGHT), DEFAULT_DELEGATOR_ADDRESS); @@ -2301,7 +2301,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 validatorWeight, address rewardRecipient ) internal { - bytes memory subnetValidatorRegistrationMessage = + bytes memory l1ValidatorRegistrationMessage = ValidatorMessages.packL1ValidatorRegistrationMessage(validationID, false); vm.expectEmit(true, true, true, true, address(posValidatorManager)); @@ -2312,7 +2312,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _expectStakeUnlock(validatorOwner, _weightToValue(validatorWeight)); _expectRewardIssuance(rewardRecipient, expectedReward); - _completeEndValidation(subnetValidatorRegistrationMessage); + _completeEndValidation(l1ValidatorRegistrationMessage); if (rewardRecipient == validatorOwner) { assertEq( @@ -2332,8 +2332,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } } - function _completeEndValidation(bytes memory subnetValidatorRegistrationMessage) internal { - _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); + function _completeEndValidation(bytes memory l1ValidatorRegistrationMessage) internal { + _mockGetPChainWarpMessage(l1ValidatorRegistrationMessage, true); posValidatorManager.completeEndValidation(0); } @@ -2453,7 +2453,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _defaultPoSSettings() internal pure returns (PoSValidatorManagerSettings memory) { return PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index 7889cdd72..bcff390f6 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -22,7 +22,7 @@ import { // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks abstract contract ValidatorManagerTest is Test { - bytes32 public constant DEFAULT_SUBNET_ID = + bytes32 public constant DEFAULT_L1_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes public constant DEFAULT_NODE_ID = bytes(hex"1234567812345678123456781234567812345678123456781234567812345678"); @@ -98,11 +98,7 @@ abstract contract ValidatorManagerTest is Test { function testInitializeValidatorRegistrationSuccess() public { _setUpInitializeValidatorRegistration( - DEFAULT_NODE_ID, - DEFAULT_SUBNET_ID, - DEFAULT_WEIGHT, - DEFAULT_EXPIRY, - DEFAULT_BLS_PUBLIC_KEY + DEFAULT_NODE_ID, DEFAULT_L1_ID, DEFAULT_WEIGHT, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY ); } @@ -192,16 +188,12 @@ abstract contract ValidatorManagerTest is Test { // reference to the abstract type. function testResendRegisterValidatorMessage() public { bytes32 validationID = _setUpInitializeValidatorRegistration( - DEFAULT_NODE_ID, - DEFAULT_SUBNET_ID, - DEFAULT_WEIGHT, - DEFAULT_EXPIRY, - DEFAULT_BLS_PUBLIC_KEY + DEFAULT_NODE_ID, DEFAULT_L1_ID, DEFAULT_WEIGHT, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY ); - (, bytes memory registerSubnetValidatorMessage) = ValidatorMessages + (, bytes memory registerL1ValidatorMessage) = ValidatorMessages .packRegisterL1ValidatorMessage( ValidatorMessages.ValidationPeriod({ - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, nodeID: DEFAULT_NODE_ID, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationExpiry: DEFAULT_EXPIRY, @@ -210,7 +202,7 @@ abstract contract ValidatorManagerTest is Test { weight: DEFAULT_WEIGHT }) ); - _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); + _mockSendWarpMessage(registerL1ValidatorMessage, bytes32(0)); validatorManager.resendRegisterValidatorMessage(validationID); } @@ -267,10 +259,10 @@ abstract contract ValidatorManagerTest is Test { force: false }); - bytes memory subnetValidatorRegistrationMessage = + bytes memory l1ValidatorRegistrationMessage = ValidatorMessages.packL1ValidatorRegistrationMessage(validationID, false); - _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); + _mockGetPChainWarpMessage(l1ValidatorRegistrationMessage, true); vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); @@ -280,16 +272,12 @@ abstract contract ValidatorManagerTest is Test { function testCompleteInvalidatedValidation() public { bytes32 validationID = _setUpInitializeValidatorRegistration( - DEFAULT_NODE_ID, - DEFAULT_SUBNET_ID, - DEFAULT_WEIGHT, - DEFAULT_EXPIRY, - DEFAULT_BLS_PUBLIC_KEY + DEFAULT_NODE_ID, DEFAULT_L1_ID, DEFAULT_WEIGHT, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY ); - bytes memory subnetValidatorRegistrationMessage = + bytes memory l1ValidatorRegistrationMessage = ValidatorMessages.packL1ValidatorRegistrationMessage(validationID, false); - _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); + _mockGetPChainWarpMessage(l1ValidatorRegistrationMessage, true); vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationPeriodEnded(validationID, ValidatorStatus.Invalidated); @@ -320,7 +308,7 @@ abstract contract ValidatorManagerTest is Test { ); manager.initializeValidatorSet(_defaultConversionDataTotalWeight5(), 0); - bytes32 validationID = sha256(abi.encodePacked(DEFAULT_SUBNET_ID, uint32(0))); + bytes32 validationID = sha256(abi.encodePacked(DEFAULT_L1_ID, uint32(0))); vm.expectRevert(abi.encodeWithSelector(ValidatorManager.InvalidTotalWeight.selector, 4)); _forceInitializeEndValidation(validationID, false, address(0)); } @@ -333,7 +321,7 @@ abstract contract ValidatorManagerTest is Test { // First registration should succeed _registerValidator({ nodeID: _newNodeID(), - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, weight: churnThreshold, registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, @@ -365,7 +353,7 @@ abstract contract ValidatorManagerTest is Test { // Registration should succeed bytes32 validationID = _registerValidator({ nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, weight: _valueToWeight(DEFAULT_MINIMUM_STAKE_AMOUNT), registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, @@ -379,7 +367,7 @@ abstract contract ValidatorManagerTest is Test { // Registration should succeed _registerValidator({ nodeID: _newNodeID(), - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, weight: churnThreshold, registrationExpiry: DEFAULT_EXPIRY + 25 hours, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, @@ -413,7 +401,7 @@ abstract contract ValidatorManagerTest is Test { function _setUpInitializeValidatorRegistration( bytes memory nodeID, - bytes32 subnetID, + bytes32 l1ID, uint64 weight, uint64 registrationExpiry, bytes memory blsPublicKey @@ -421,7 +409,7 @@ abstract contract ValidatorManagerTest is Test { (validationID,) = ValidatorMessages.packRegisterL1ValidatorMessage( ValidatorMessages.ValidationPeriod({ nodeID: nodeID, - subnetID: subnetID, + l1ID: l1ID, blsPublicKey: blsPublicKey, registrationExpiry: registrationExpiry, remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, @@ -429,10 +417,10 @@ abstract contract ValidatorManagerTest is Test { weight: weight }) ); - (, bytes memory registerSubnetValidatorMessage) = ValidatorMessages + (, bytes memory registerL1ValidatorMessage) = ValidatorMessages .packRegisterL1ValidatorMessage( ValidatorMessages.ValidationPeriod({ - subnetID: subnetID, + l1ID: l1ID, nodeID: nodeID, blsPublicKey: blsPublicKey, registrationExpiry: registrationExpiry, @@ -442,7 +430,7 @@ abstract contract ValidatorManagerTest is Test { }) ); vm.warp(registrationExpiry - 1); - _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); + _mockSendWarpMessage(registerL1ValidatorMessage, bytes32(0)); _beforeSend(_weightToValue(weight), address(this)); vm.expectEmit(true, true, true, true, address(validatorManager)); @@ -462,19 +450,19 @@ abstract contract ValidatorManagerTest is Test { function _registerValidator( bytes memory nodeID, - bytes32 subnetID, + bytes32 l1ID, uint64 weight, uint64 registrationExpiry, bytes memory blsPublicKey, uint64 registrationTimestamp ) internal returns (bytes32 validationID) { validationID = _setUpInitializeValidatorRegistration( - nodeID, subnetID, weight, registrationExpiry, blsPublicKey + nodeID, l1ID, weight, registrationExpiry, blsPublicKey ); - bytes memory subnetValidatorRegistrationMessage = + bytes memory l1ValidatorRegistrationMessage = ValidatorMessages.packL1ValidatorRegistrationMessage(validationID, true); - _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); + _mockGetPChainWarpMessage(l1ValidatorRegistrationMessage, true); vm.warp(registrationTimestamp); vm.expectEmit(true, true, true, true, address(validatorManager)); @@ -529,7 +517,7 @@ abstract contract ValidatorManagerTest is Test { function _registerDefaultValidator() internal returns (bytes32 validationID) { return _registerValidator({ nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, @@ -650,7 +638,7 @@ abstract contract ValidatorManagerTest is Test { assertEq(initialWeight, DEFAULT_INITIAL_TOTAL_WEIGHT); return ConversionData({ - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, validatorManagerBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, validatorManagerAddress: address(validatorManager), initialValidators: initialValidators @@ -672,7 +660,7 @@ abstract contract ValidatorManagerTest is Test { }); return ConversionData({ - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, validatorManagerBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, validatorManagerAddress: address(validatorManager), initialValidators: initialValidators @@ -694,7 +682,7 @@ abstract contract ValidatorManagerTest is Test { }); return ConversionData({ - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, validatorManagerBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, validatorManagerAddress: address(validatorManager), initialValidators: initialValidators diff --git a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol index 6f7ffc4b2..828949450 100644 --- a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol @@ -10,7 +10,7 @@ import {ValidatorMessages} from "../ValidatorMessages.sol"; import {PChainOwner, ConversionData, InitialValidator} from "../interfaces/IValidatorManager.sol"; contract ValidatorMessagesTest is Test { - bytes32 public constant DEFAULT_SUBNET_ID = + bytes32 public constant DEFAULT_L1_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes public constant DEFAULT_NODE_ID = bytes(hex"1234567812345678123456781234567812345678123456781234567812345678"); @@ -33,7 +33,7 @@ contract ValidatorMessagesTest is Test { DEFAULT_P_CHAIN_OWNER = PChainOwner({threshold: 1, addresses: addresses}); } - function testSubnetConversionMessageInvalidInputLength() public { + function testSubnetToL1ConversionMessageInvalidInputLength() public { bytes memory packed = ValidatorMessages.packSubnetToL1ConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); // Invalid length @@ -47,7 +47,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackSubnetToL1ConversionMessage(invalidPacked); } - function testSubnetConversionMessageInvalidCodecID() public { + function testSubnetToL1ConversionMessageInvalidCodecID() public { bytes memory packed = ValidatorMessages.packSubnetToL1ConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); @@ -60,7 +60,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackSubnetToL1ConversionMessage(invalidPacked2); } - function testSubnetConversionMessageInvalidTypeID() public { + function testSubnetToL1ConversionMessageInvalidTypeID() public { bytes memory packed = ValidatorMessages.packSubnetToL1ConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); // Invalid message type @@ -70,7 +70,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackSubnetToL1ConversionMessage(invalidPacked3); } - function testRegisterSubnetValidatorMessageInvalidBLSKey() public { + function testRegisterL1ValidatorMessageInvalidBLSKey() public { vm.expectRevert(ValidatorMessages.InvalidBLSPublicKey.selector); // 47 bytes bytes memory invalidBLSKey = bytes( @@ -78,7 +78,7 @@ contract ValidatorMessagesTest is Test { ); ValidatorMessages.packRegisterL1ValidatorMessage( ValidatorMessages.ValidationPeriod({ - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, nodeID: DEFAULT_NODE_ID, registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: invalidBLSKey, @@ -89,7 +89,7 @@ contract ValidatorMessagesTest is Test { ); } - function testRegisterSubnetValidatorMessageInvalidInputLength() public { + function testRegisterL1ValidatorMessageInvalidInputLength() public { bytes memory packed = _getPackedRegisterL1ValidatorMessage(); // Invalid length bytes memory invalidPacked = new bytes(packed.length - 1); @@ -104,7 +104,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked); } - function testRegisterSubnetValidatorMessageInvalidCodecID() public { + function testRegisterL1ValidatorMessageInvalidCodecID() public { bytes memory packed = _getPackedRegisterL1ValidatorMessage(); // Invalid codec ID @@ -116,7 +116,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked2); } - function testRegisterSubnetValidatorMessageInvalidTypeID() public { + function testRegisterL1ValidatorMessageInvalidTypeID() public { bytes memory packed = _getPackedRegisterL1ValidatorMessage(); // Invalid message type @@ -126,7 +126,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked3); } - function testSubnetValidatorRegistrationMessageInvalidInputLength() public { + function testL1ValidatorRegistrationMessageInvalidInputLength() public { bytes memory packed = ValidatorMessages.packL1ValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); @@ -141,7 +141,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackL1ValidatorRegistrationMessage(invalidPacked); } - function testSubnetValidatorRegistrationMessageInvalidCodecID() public { + function testL1ValidatorRegistrationMessageInvalidCodecID() public { bytes memory packed = ValidatorMessages.packL1ValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); @@ -154,7 +154,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackL1ValidatorRegistrationMessage(invalidPacked2); } - function testSubnetValidatorRegistrationMessageInvalidTypeID() public { + function testL1ValidatorRegistrationMessageInvalidTypeID() public { bytes memory packed = ValidatorMessages.packL1ValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); @@ -204,7 +204,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackValidationUptimeMessage(invalidPacked3); } - function testSetSubnetValidatorWeightMessageInvalidInputLength() public { + function testSetL1ValidatorWeightMessageInvalidInputLength() public { bytes memory packed = ValidatorMessages.packL1ValidatorWeightMessage( DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT ); @@ -220,7 +220,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackL1ValidatorWeightMessage(invalidPacked); } - function testSetSubnetValidatorWeightMessageInvalidCodecID() public { + function testSetL1ValidatorWeightMessageInvalidCodecID() public { bytes memory packed = ValidatorMessages.packL1ValidatorWeightMessage( DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT ); @@ -234,7 +234,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackL1ValidatorWeightMessage(invalidPacked2); } - function testSetSubnetValidatorWeightMessageInvalidTypeID() public { + function testSetL1ValidatorWeightMessageInvalidTypeID() public { bytes memory packed = ValidatorMessages.packL1ValidatorWeightMessage( DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT ); @@ -246,11 +246,11 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackL1ValidatorWeightMessage(invalidPacked3); } - function testRegisterSubnetValidatorMessage() public view { + function testRegisterL1ValidatorMessage() public view { (bytes32 validationID, bytes memory packed) = ValidatorMessages .packRegisterL1ValidatorMessage( ValidatorMessages.ValidationPeriod({ - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, nodeID: DEFAULT_NODE_ID, registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, @@ -262,7 +262,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.ValidationPeriod memory info = ValidatorMessages.unpackRegisterL1ValidatorMessage(packed); - assertEq(info.subnetID, DEFAULT_SUBNET_ID); + assertEq(info.l1ID, DEFAULT_L1_ID); assertEq(info.nodeID, DEFAULT_NODE_ID); assertEq(info.weight, DEFAULT_WEIGHT); assertEq(info.registrationExpiry, DEFAULT_EXPIRY); @@ -272,7 +272,7 @@ contract ValidatorMessagesTest is Test { assertEq(recoveredID, validationID); } - function testSubnetConversionMessage() public pure { + function testSubnetToL1ConversionMessage() public pure { bytes memory packed = ValidatorMessages.packSubnetToL1ConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); bytes32 conversionID = ValidatorMessages.unpackSubnetToL1ConversionMessage(packed); @@ -288,7 +288,7 @@ contract ValidatorMessagesTest is Test { }); bytes memory packed = ValidatorMessages.packConversionData( ConversionData({ - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, validatorManagerBlockchainID: DEFAULT_SUBNET_CONVERSION_ID, validatorManagerAddress: DEFAULT_OWNER, initialValidators: initialValidators @@ -298,7 +298,7 @@ contract ValidatorMessagesTest is Test { assertEq(packed.length, 186); } - function testSubnetValidatorRegistrationMessage() public pure { + function testL1ValidatorRegistrationMessage() public pure { bytes memory packed = ValidatorMessages.packL1ValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); (bytes32 validationID, bool valid) = @@ -307,7 +307,7 @@ contract ValidatorMessagesTest is Test { assert(valid); } - function testSetSubnetValidatorWeightMessage() public pure { + function testSetL1ValidatorWeightMessage() public pure { bytes memory packed = ValidatorMessages.packL1ValidatorWeightMessage( DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT ); @@ -318,7 +318,7 @@ contract ValidatorMessagesTest is Test { assertEq(weight, DEFAULT_WEIGHT); } - function testSubnetValidatorWeightUpdateMessage() public pure { + function testL1ValidatorWeightMessage() public pure { bytes memory packed = ValidatorMessages.packL1ValidatorWeightMessage( DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT ); @@ -338,10 +338,10 @@ contract ValidatorMessagesTest is Test { assertEq(uptime, 100); } - function _getPackedRegisterL1ValidatorMessage() internal returns (bytes memory) { + function _getPackedRegisterL1ValidatorMessage() internal view returns (bytes memory) { (, bytes memory packed) = ValidatorMessages.packRegisterL1ValidatorMessage( ValidatorMessages.ValidationPeriod({ - subnetID: DEFAULT_SUBNET_ID, + l1ID: DEFAULT_L1_ID, nodeID: DEFAULT_NODE_ID, registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, diff --git a/tests/flows/governance/validator_set_sig.go b/tests/flows/governance/validator_set_sig.go index 4a8457907..8031d7951 100644 --- a/tests/flows/governance/validator_set_sig.go +++ b/tests/flows/governance/validator_set_sig.go @@ -16,63 +16,63 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { // ************************************************************************************************ // Setup // ************************************************************************************************ - // Deploy ValidatorSetSig expecting signatures from subnetB instances to both subnets - // Deploy exampleERC20 instance to both subnets + // Deploy ValidatorSetSig expecting signatures from L1B instances to both L1s + // Deploy exampleERC20 instance to both L1s // Construct ValidatorSetSig message with mock ERC20 as the target contract - // Create off-chain Warp messages using the ValidatorSetSig message to be signed by the subnetB + // Create off-chain ICM messages using the ValidatorSetSig message to be signed by the L1B // ************************************************************************************************ - // Test Case 1: validatorChain (subnetB) != targetChain (subnetA) + // Test Case 1: validatorChain (L1B) != targetChain (L1A) // ************************************************************************************************ - // Send the off-chain message to subnetA instance of ValidatorSetSig and confirm it is accepted. + // Send the off-chain message to L1A instance of ValidatorSetSig and confirm it is accepted. // Confirm the event is emitted // Retry the same message and confirm it fails // Send a new message with incremented nonce and confirm it is accepted. // ************************************************************************************************ - // Test Case 2: validatorChain (subnetB) == targetChain (subnetB) + // Test Case 2: validatorChain (L1B) == targetChain (L1B) // ************************************************************************************************ - // Send a new message to subnetB instance of ValidatorSetSig and confirm it is accepted + // Send a new message to L1B instance of ValidatorSetSig and confirm it is accepted // ************************************************************************************************ // Setup // ************************************************************************************************ - subnetA, subnetB := network.GetTwoSubnets() + L1A, L1B := network.GetTwoL1s() _, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() - // Deploy a ValidatorSetSigContract to subnetA + // Deploy a ValidatorSetSigContract to L1A validatorSetSigContractAddress, validatorSetSig := utils.DeployValidatorSetSig( ctx, fundedKey, - subnetA, - subnetB, + L1A, + L1B, ) - // Deploy a ValidatorSetSigContract to subnetB + // Deploy a ValidatorSetSigContract to L1B validatorSetSigContractAddress2, validatorSetSig2 := utils.DeployValidatorSetSig( ctx, fundedKey, - subnetB, - subnetB, + L1B, + L1B, ) - // Deploy a mock ERC20 contract to subnetA + // Deploy a mock ERC20 contract to L1A exampleERC20ContractAddressA, exampleERC20A := utils.DeployExampleERC20( ctx, fundedKey, - subnetA, + L1A, ) - // Deploy a new example ERC20 contract this time to the same subnet as the validator. + // Deploy a new example ERC20 contract this time to the same L1 as the validator. exampleERC20ContractAddressB, exampleERC20B := utils.DeployExampleERC20( ctx, fundedKey, - subnetB, + L1B, ) erc20ABI, err := exampleerc20.ExampleERC20MetaData.GetAbi() Expect(err).Should(BeNil()) - // Confirm that the validatorContract has a balance of 0 on the example erc20 contracts on both subnets + // Confirm that the validatorContract has a balance of 0 on the example erc20 contracts on both L1s startingBalanceA, err := exampleERC20A.BalanceOf( &bind.CallOpts{}, validatorSetSigContractAddress) Expect(err).Should(BeNil()) @@ -91,7 +91,7 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { vssMessage1 := validatorsetsig.ValidatorSetSigMessage{ ValidatorSetSigAddress: validatorSetSigContractAddress, TargetContractAddress: exampleERC20ContractAddressA, - TargetBlockchainID: subnetA.BlockchainID, + TargetBlockchainID: L1A.BlockchainID, Nonce: big.NewInt(0), Value: big.NewInt(0), Payload: callData, @@ -104,7 +104,7 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { vssMessage2 := validatorsetsig.ValidatorSetSigMessage{ ValidatorSetSigAddress: validatorSetSigContractAddress, TargetContractAddress: exampleERC20ContractAddressA, - TargetBlockchainID: subnetA.BlockchainID, + TargetBlockchainID: L1A.BlockchainID, Nonce: big.NewInt(1), Value: big.NewInt(0), Payload: callData2, @@ -119,7 +119,7 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { vssMessage3 := validatorsetsig.ValidatorSetSigMessage{ ValidatorSetSigAddress: validatorSetSigContractAddress2, TargetContractAddress: exampleERC20ContractAddressB, - TargetBlockchainID: subnetB.BlockchainID, + TargetBlockchainID: L1B.BlockchainID, Nonce: big.NewInt(0), Value: big.NewInt(0), Payload: callData3, @@ -127,22 +127,22 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { // Create chain config file with off-chain validatorsetsig message networkID := network.GetNetworkID() - offchainMessages, warpEnabledChainConfigWithMsg := utils.InitOffChainMessageChainConfigValidatorSetSig( + offchainMessages, icmEnabledChainConfigWithMsg := utils.InitOffChainMessageChainConfigValidatorSetSig( networkID, - subnetB, + L1B, validatorSetSigContractAddress, []validatorsetsig.ValidatorSetSigMessage{vssMessage1, vssMessage2, vssMessage3}, ) // Create chain config with off-chain messages chainConfigs := make(utils.ChainConfigMap) - chainConfigs.Add(subnetB, warpEnabledChainConfigWithMsg) + chainConfigs.Add(L1B, icmEnabledChainConfigWithMsg) // Restart nodes with new chain config network.SetChainConfigs(chainConfigs) // ************************************************************************************************ - // Test Case 1: validatorChain (subnetB) != targetChain (subnetA) + // Test Case 1: validatorChain (L1B) != targetChain (L1A) // ************************************************************************************************ aggregator := network.GetSignatureAggregator() @@ -151,8 +151,8 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { // Execute the ValidatorSetSig executeCall and wait for acceptance receipt := utils.ExecuteValidatorSetSigCallAndVerify( ctx, - subnetB, - subnetA, + L1B, + L1A, validatorSetSigContractAddress, fundedKey, &offchainMessages[0], @@ -174,8 +174,8 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { _ = utils.ExecuteValidatorSetSigCallAndVerify( ctx, - subnetB, - subnetA, + L1B, + L1A, validatorSetSigContractAddress, fundedKey, &offchainMessages[0], @@ -191,8 +191,8 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { // Send another valid transaction with the incremented nonce receipt2 := utils.ExecuteValidatorSetSigCallAndVerify( ctx, - subnetB, - subnetA, + L1B, + L1A, validatorSetSigContractAddress, fundedKey, &offchainMessages[1], @@ -216,15 +216,15 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { Expect(startingBalanceB.Cmp(big.NewInt(0))).Should(BeZero()) // ************************************************************************************************ - // Test Case 2: validatorChain (subnetB) == targetChain (subnetB) + // Test Case 2: validatorChain (L1B) == targetChain (L1B) // ************************************************************************************************ // Send the third transaction where the validatorSetSig contract expects validator signatures // from the same chain that it is deployed on. receipt3 := utils.ExecuteValidatorSetSigCallAndVerify( ctx, - subnetB, - subnetB, + L1B, + L1B, validatorSetSigContractAddress2, fundedKey, &offchainMessages[2], diff --git a/tests/flows/ictt/erc20_home_erc20_remote.go b/tests/flows/ictt/erc20_home_erc20_remote.go index cfdfc7021..c559219fa 100644 --- a/tests/flows/ictt/erc20_home_erc20_remote.go +++ b/tests/flows/ictt/erc20_home_erc20_remote.go @@ -15,13 +15,13 @@ import ( /** * Deploy an ERC20TokenHome on the primary network - * Deploys ERC20TokenRemote to Subnet A - * Transfers C-Chain example ERC20 tokens to Subnet A - * Transfer tokens from Subnet A to C-Chain + * Deploys ERC20TokenRemote to L1 A + * Transfers C-Chain example ERC20 tokens to L1 A + * Transfer tokens from L1 A to C-Chain */ func ERC20TokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, _ := network.GetTwoSubnets() + l1AInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -48,7 +48,7 @@ func ERC20TokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleport exampleERC20Decimals, ) - // Token representation on subnet A will have same name, symbol, and decimals + // Token representation on L1 A will have same name, symbol, and decimals tokenName, err := exampleERC20.Name(&bind.CallOpts{}) Expect(err).Should(BeNil()) tokenSymbol, err := exampleERC20.Symbol(&bind.CallOpts{}) @@ -56,12 +56,12 @@ func ERC20TokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleport tokenDecimals, err := exampleERC20.Decimals(&bind.CallOpts{}) Expect(err).Should(BeNil()) - // Deploy an ERC20TokenRemote to Subnet A + // Deploy an ERC20TokenRemote to L1 A erc20TokenRemoteAddress, erc20TokenRemote := utils.DeployERC20TokenRemote( ctx, teleporter, fundedKey, - subnetAInfo, + l1AInfo, fundedAddress, cChainInfo.BlockchainID, erc20TokenHomeAddress, @@ -79,7 +79,7 @@ func ERC20TokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleport teleporter, cChainInfo, erc20TokenHomeAddress, - subnetAInfo, + l1AInfo, erc20TokenRemoteAddress, fundedKey, aggregator, @@ -90,9 +90,9 @@ func ERC20TokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleport Expect(err).Should(BeNil()) recipientAddress := crypto.PubkeyToAddress(recipientKey.PublicKey) - // Send tokens from C-Chain to recipient on subnet A + // Send tokens from C-Chain to recipient on L1 A input := erc20tokenhome.SendTokensInput{ - DestinationBlockchainID: subnetAInfo.BlockchainID, + DestinationBlockchainID: l1AInfo.BlockchainID, DestinationTokenTransferrerAddress: erc20TokenRemoteAddress, Recipient: recipientAddress, PrimaryFeeTokenAddress: exampleERC20Address, @@ -113,12 +113,12 @@ func ERC20TokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleport fundedKey, ) - // Relay the message to Subnet A and check for message delivery + // Relay the message to L1 A and check for message delivery receipt = teleporter.RelayTeleporterMessage( ctx, receipt, cChainInfo, - subnetAInfo, + l1AInfo, true, fundedKey, nil, @@ -139,10 +139,10 @@ func ERC20TokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleport Expect(balance).Should(Equal(transferredAmount)) // Transfer back to home chain - // Fund recipient with gas tokens on subnet A + // Fund recipient with gas tokens on L1 A utils.SendNativeTransfer( ctx, - subnetAInfo, + l1AInfo, fundedKey, recipientAddress, big.NewInt(1e18), @@ -159,7 +159,7 @@ func ERC20TokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleport receipt, transferredAmount = utils.SendERC20TokenRemote( ctx, - subnetAInfo, + l1AInfo, erc20TokenRemote, erc20TokenRemoteAddress, inputB, @@ -170,7 +170,7 @@ func ERC20TokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleport receipt = teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, + l1AInfo, cChainInfo, true, fundedKey, diff --git a/tests/flows/ictt/erc20_home_erc20_remote_multihop.go b/tests/flows/ictt/erc20_home_erc20_remote_multihop.go index 8f19fb77c..0e759934c 100644 --- a/tests/flows/ictt/erc20_home_erc20_remote_multihop.go +++ b/tests/flows/ictt/erc20_home_erc20_remote_multihop.go @@ -14,19 +14,19 @@ import ( /** * Deploy a ERC20 token home on the primary network - * Deploys ERC20 token remote to Subnet A and Subnet B - * Transfers C-Chain example ERC20 tokens to Subnet A - * Transfer tokens from Subnet A to Subnet B through multi-hop - * Transfer back tokens from Subnet B to Subnet A through multi-hop + * Deploys ERC20 token remote to L1 A and L1 B + * Transfers C-Chain example ERC20 tokens to L1 A + * Transfer tokens from L1 A to L1 B through multi-hop + * Transfer back tokens from L1 B to L1 A through multi-hop */ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, subnetBInfo := network.GetTwoSubnets() + l1AInfo, l1BInfo := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() - // Deploy an ExampleERC20 on subnet A as the token to be transferred + // Deploy an ExampleERC20 on L1 A as the token to be transferred exampleERC20Address, exampleERC20 := utils.DeployExampleERC20Decimals( ctx, fundedKey, @@ -48,7 +48,7 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, homeTokenDecimals, ) - // Token representation on subnets A and B will have same name, symbol, and decimals + // Token representation on L1s A and B will have same name, symbol, and decimals tokenName, err := exampleERC20.Name(&bind.CallOpts{}) Expect(err).Should(BeNil()) tokenSymbol, err := exampleERC20.Symbol(&bind.CallOpts{}) @@ -56,12 +56,12 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, tokenDecimals, err := exampleERC20.Decimals(&bind.CallOpts{}) Expect(err).Should(BeNil()) - // Deploy an ERC20TokenRemote tp Subnet A + // Deploy an ERC20TokenRemote tp L1 A erc20TokenRemoteAddressA, erc20TokenRemoteA := utils.DeployERC20TokenRemote( ctx, teleporter, fundedKey, - subnetAInfo, + l1AInfo, fundedAddress, cChainInfo.BlockchainID, erc20TokenHomeAddress, @@ -71,12 +71,12 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, tokenDecimals, ) - // Deploy an ERC20TokenRemote for Subnet B + // Deploy an ERC20TokenRemote for L1 B erc20TokenRemoteAddressB, erc20TokenRemoteB := utils.DeployERC20TokenRemote( ctx, teleporter, fundedKey, - subnetBInfo, + l1BInfo, fundedAddress, cChainInfo.BlockchainID, erc20TokenHomeAddress, @@ -95,7 +95,7 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, teleporter, cChainInfo, erc20TokenHomeAddress, - subnetAInfo, + l1AInfo, erc20TokenRemoteAddressA, fundedKey, aggregator, @@ -105,7 +105,7 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, teleporter, cChainInfo, erc20TokenHomeAddress, - subnetBInfo, + l1BInfo, erc20TokenRemoteAddressB, fundedKey, aggregator, @@ -116,9 +116,9 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, Expect(err).Should(BeNil()) recipientAddress := crypto.PubkeyToAddress(recipientKey.PublicKey) - // Send tokens from C-Chain to Subnet A + // Send tokens from C-Chain to L1 A input := erc20tokenhome.SendTokensInput{ - DestinationBlockchainID: subnetAInfo.BlockchainID, + DestinationBlockchainID: l1AInfo.BlockchainID, DestinationTokenTransferrerAddress: erc20TokenRemoteAddressA, Recipient: recipientAddress, PrimaryFeeTokenAddress: exampleERC20Address, @@ -139,12 +139,12 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, fundedKey, ) - // Relay the message to subnet A and check for ERC20TokenRemote withdrawal + // Relay the message to L1 A and check for ERC20TokenRemote withdrawal receipt = teleporter.RelayTeleporterMessage( ctx, receipt, cChainInfo, - subnetAInfo, + l1AInfo, true, fundedKey, nil, @@ -164,7 +164,7 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, Expect(err).Should(BeNil()) Expect(balance).Should(Equal(transferredAmount)) - // Multi-hop transfer to Subnet B + // Multi-hop transfer to L1 B transferredAmount = big.NewInt(0).Div(transferredAmount, big.NewInt(2)) secondaryFeeAmount := big.NewInt(0).Div(transferredAmount, big.NewInt(4)) utils.SendERC20TokenMultiHopAndVerify( @@ -173,10 +173,10 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, fundedKey, recipientKey, recipientAddress, - subnetAInfo, + l1AInfo, erc20TokenRemoteA, erc20TokenRemoteAddressA, - subnetBInfo, + l1BInfo, erc20TokenRemoteB, erc20TokenRemoteAddressB, cChainInfo, @@ -185,7 +185,7 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, aggregator, ) - // Multi-hop transfer back to Subnet A + // Multi-hop transfer back to L1 A transferredAmount = big.NewInt(0).Sub(transferredAmount, secondaryFeeAmount) secondaryFeeAmount = big.NewInt(0).Div(transferredAmount, big.NewInt(4)) utils.SendERC20TokenMultiHopAndVerify( @@ -194,10 +194,10 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, fundedKey, recipientKey, recipientAddress, - subnetBInfo, + l1BInfo, erc20TokenRemoteB, erc20TokenRemoteAddressB, - subnetAInfo, + l1AInfo, erc20TokenRemoteA, erc20TokenRemoteAddressA, cChainInfo, diff --git a/tests/flows/ictt/erc20_home_erc20_remote_send_and_call.go b/tests/flows/ictt/erc20_home_erc20_remote_send_and_call.go index ab6c8c78d..b2dd8db86 100644 --- a/tests/flows/ictt/erc20_home_erc20_remote_send_and_call.go +++ b/tests/flows/ictt/erc20_home_erc20_remote_send_and_call.go @@ -15,9 +15,9 @@ import ( /** * Deploy an ERC20TokenHome on the primary network - * Deploys ERC20TokenRemote to Subnet A - * Transfers C-Chain example ERC20 tokens to Subnet A and calls contract on Subnet A using sendAndCall - * Transfers C-Chain example ERC20 to EOA on Subnet A, and then transfer tokens from Subnet A back + * Deploys ERC20TokenRemote to L1 A + * Transfers C-Chain example ERC20 tokens to L1 A and calls contract on L1 A using sendAndCall + * Transfers C-Chain example ERC20 to EOA on L1 A, and then transfer tokens from L1 A back * C-Chain and calls contract on the C-Chain using sendAndCall */ func ERC20TokenHomeERC20TokenRemoteSendAndCall( @@ -25,7 +25,7 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( teleporter utils.TeleporterTestInfo, ) { cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, _ := network.GetTwoSubnets() + l1AInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -61,10 +61,10 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( remoteMockERC20SACRAddress, remoteMockERC20SACR := utils.DeployMockERC20SendAndCallReceiver( ctx, fundedKey, - subnetAInfo, + l1AInfo, ) - // Token representation on subnet A will have same name, symbol, and decimals + // Token representation on L1 A will have same name, symbol, and decimals tokenName, err := exampleERC20.Name(&bind.CallOpts{}) Expect(err).Should(BeNil()) tokenSymbol, err := exampleERC20.Symbol(&bind.CallOpts{}) @@ -72,12 +72,12 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( tokenDecimals, err := exampleERC20.Decimals(&bind.CallOpts{}) Expect(err).Should(BeNil()) - // Deploy an ERC20TokenRemote to Subnet A + // Deploy an ERC20TokenRemote to L1 A erc20TokenRemoteAddress, erc20TokenRemote := utils.DeployERC20TokenRemote( ctx, teleporter, fundedKey, - subnetAInfo, + l1AInfo, fundedAddress, cChainInfo.BlockchainID, erc20TokenHomeAddress, @@ -95,7 +95,7 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( teleporter, cChainInfo, erc20TokenHomeAddress, - subnetAInfo, + l1AInfo, erc20TokenRemoteAddress, fundedKey, aggregator, @@ -115,10 +115,10 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( primaryFee := big.NewInt(1e18) transferredAmount := utils.BigIntSub(amount, primaryFee) - // Send tokens from C-Chain to Mock contract on subnet A + // Send tokens from C-Chain to Mock contract on L1 A { input := erc20tokenhome.SendAndCallInput{ - DestinationBlockchainID: subnetAInfo.BlockchainID, + DestinationBlockchainID: l1AInfo.BlockchainID, DestinationTokenTransferrerAddress: erc20TokenRemoteAddress, RecipientContract: remoteMockERC20SACRAddress, RecipientPayload: []byte{1}, @@ -141,12 +141,12 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( fundedKey, ) - // Relay the message to Subnet A and check for message delivery + // Relay the message to L1 A and check for message delivery receipt = teleporter.RelayTeleporterMessage( ctx, receipt, cChainInfo, - subnetAInfo, + l1AInfo, true, fundedKey, nil, @@ -169,11 +169,11 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( Expect(balance).Should(Equal(transferredAmount)) } - // Transfer ERC20 tokens to account on subnet A + // Transfer ERC20 tokens to account on L1 A { - // Send ERC20 tokens from C-Chain to recipient on subnet A + // Send ERC20 tokens from C-Chain to recipient on L1 A input := erc20tokenhome.SendTokensInput{ - DestinationBlockchainID: subnetAInfo.BlockchainID, + DestinationBlockchainID: l1AInfo.BlockchainID, DestinationTokenTransferrerAddress: erc20TokenRemoteAddress, Recipient: recipientAddress, PrimaryFeeTokenAddress: exampleERC20Address, @@ -193,12 +193,12 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( fundedKey, ) - // Relay the message to Subnet A and check for message delivery + // Relay the message to L1 A and check for message delivery receipt = teleporter.RelayTeleporterMessage( ctx, receipt, cChainInfo, - subnetAInfo, + l1AInfo, true, fundedKey, nil, @@ -221,10 +221,10 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( // Send tokens to mock contract on C-Chain using sendAndCall { - // Fund recipient with gas tokens on subnet A + // Fund recipient with gas tokens on L1 A utils.SendNativeTransfer( ctx, - subnetAInfo, + l1AInfo, fundedKey, recipientAddress, big.NewInt(1e18), @@ -245,7 +245,7 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( receipt, transferredAmount := utils.SendAndCallERC20TokenRemote( ctx, - subnetAInfo, + l1AInfo, erc20TokenRemote, erc20TokenRemoteAddress, inputB, @@ -256,7 +256,7 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( receipt = teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, + l1AInfo, cChainInfo, true, fundedKey, diff --git a/tests/flows/ictt/erc20_home_native_remote.go b/tests/flows/ictt/erc20_home_native_remote.go index ea2cfa19e..18a60ce34 100644 --- a/tests/flows/ictt/erc20_home_native_remote.go +++ b/tests/flows/ictt/erc20_home_native_remote.go @@ -27,18 +27,18 @@ var ( /** * Deploy a ERC20Token on the primary network - * Deploys NativeTokenRemote to Subnet A and Subnet B - * Transfers C-Chain example ERC20 tokens to Subnet A as Subnet A's native token - * Transfer back tokens from Subnet A to C-Chain + * Deploys NativeTokenRemote to L1 A and L1 B + * Transfers C-Chain example ERC20 tokens to L1 A as L1 A's native token + * Transfer back tokens from L1 A to C-Chain */ func ERC20TokenHomeNativeTokenRemote(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, _ := network.GetTwoSubnets() + l1AInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() - // Deploy an ExampleERC20 on subnet A as the token to be transferred + // Deploy an ExampleERC20 on L1 A as the token to be transferred exampleERC20Address, exampleERC20 := utils.DeployExampleERC20Decimals( ctx, fundedKey, @@ -60,11 +60,11 @@ func ERC20TokenHomeNativeTokenRemote(network *localnetwork.LocalNetwork, telepor exampleERC20Decimals, ) - // Deploy a NativeTokenRemote to Subnet A + // Deploy a NativeTokenRemote to L1 A nativeTokenRemoteAddressA, nativeTokenRemoteA := utils.DeployNativeTokenRemote( ctx, teleporter, - subnetAInfo, + l1AInfo, "SUBA", fundedAddress, cChainInfo.BlockchainID, @@ -82,7 +82,7 @@ func ERC20TokenHomeNativeTokenRemote(network *localnetwork.LocalNetwork, telepor teleporter, cChainInfo, erc20TokenHomeAddress, - subnetAInfo, + l1AInfo, nativeTokenRemoteAddressA, initialReserveImbalance, utils.GetTokenMultiplier(decimalsShift), @@ -97,7 +97,7 @@ func ERC20TokenHomeNativeTokenRemote(network *localnetwork.LocalNetwork, telepor erc20TokenHome, erc20TokenHomeAddress, exampleERC20, - subnetAInfo.BlockchainID, + l1AInfo.BlockchainID, nativeTokenRemoteAddressA, collateralAmount, fundedKey, @@ -109,9 +109,9 @@ func ERC20TokenHomeNativeTokenRemote(network *localnetwork.LocalNetwork, telepor Expect(err).Should(BeNil()) recipientAddress := crypto.PubkeyToAddress(recipientKey.PublicKey) - // Send tokens from C-Chain to Subnet A + // Send tokens from C-Chain to L1 A input := erc20tokenhome.SendTokensInput{ - DestinationBlockchainID: subnetAInfo.BlockchainID, + DestinationBlockchainID: l1AInfo.BlockchainID, DestinationTokenTransferrerAddress: nativeTokenRemoteAddressA, Recipient: recipientAddress, PrimaryFeeTokenAddress: exampleERC20Address, @@ -132,12 +132,12 @@ func ERC20TokenHomeNativeTokenRemote(network *localnetwork.LocalNetwork, telepor fundedKey, ) - // Relay the message to subnet A and check for a native token mint withdrawal + // Relay the message to L1 A and check for a native token mint withdrawal teleporter.RelayTeleporterMessage( ctx, receipt, cChainInfo, - subnetAInfo, + l1AInfo, true, fundedKey, nil, @@ -145,7 +145,7 @@ func ERC20TokenHomeNativeTokenRemote(network *localnetwork.LocalNetwork, telepor ) // Verify the recipient received the tokens - utils.CheckBalance(ctx, recipientAddress, transferredAmount, subnetAInfo.RPCClient) + utils.CheckBalance(ctx, recipientAddress, transferredAmount, l1AInfo.RPCClient) // Send back to the home chain and check that ERC20TokenHome received the tokens input_A := nativetokenremote.SendTokensInput{ @@ -161,7 +161,7 @@ func ERC20TokenHomeNativeTokenRemote(network *localnetwork.LocalNetwork, telepor amountToSendA := new(big.Int).Div(transferredAmount, big.NewInt(2)) receipt, transferredAmount = utils.SendNativeTokenRemote( ctx, - subnetAInfo, + l1AInfo, nativeTokenRemoteA, nativeTokenRemoteAddressA, input_A, @@ -172,7 +172,7 @@ func ERC20TokenHomeNativeTokenRemote(network *localnetwork.LocalNetwork, telepor receipt = teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, + l1AInfo, cChainInfo, true, fundedKey, diff --git a/tests/flows/ictt/erc20_home_native_remote_multihop.go b/tests/flows/ictt/erc20_home_native_remote_multihop.go index 60c06ba35..3a55e1df2 100644 --- a/tests/flows/ictt/erc20_home_native_remote_multihop.go +++ b/tests/flows/ictt/erc20_home_native_remote_multihop.go @@ -15,21 +15,21 @@ import ( /* * - Deploy a ERC20TokenHome on the primary network - - Deploys NativeTokenRemote to Subnet A and Subnet B - - Transfers C-Chain example ERC20 tokens to Subnet A as Subnet A's native token - - Transfers C-Chain example ERC20 tokens to Subnet B as Subnet B's native token - to collateralize the token transferrer on Subnet B - - Transfer tokens from Subnet A to Subnet B through multi-hop - - Transfer back tokens from Subnet B to Subnet A through multi-hop + - Deploys NativeTokenRemote toA and L1 B + - Transfers C-Chain example ERC20 tokens to L1 A as L1 A's native token + - Transfers C-Chain example ERC20 tokens to L1 B as L1 B's native token + to collateralize the token transferrer on L1 B + - Transfer tokens from L1 A to L1 B through multi-hop + - Transfer back tokens from L1 B to L1 A through multi-hop */ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, subnetBInfo := network.GetTwoSubnets() + l1AInfo, l1BInfo := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() - // Deploy an ExampleERC20 on subnet A as the token to be transferred + // Deploy an ExampleERC20 on L1 A as the token to be transferred exampleERC20Address, exampleERC20 := utils.DeployExampleERC20Decimals( ctx, fundedKey, @@ -50,11 +50,11 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, exampleERC20Decimals, ) - // Deploy a NativeTokenRemote to Subnet A + // Deploy a NativeTokenRemote to L1 A nativeTokenRemoteAddressA, nativeTokenRemoteA := utils.DeployNativeTokenRemote( ctx, teleporter, - subnetAInfo, + l1AInfo, "SUBA", fundedAddress, cChainInfo.BlockchainID, @@ -64,11 +64,11 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, burnedFeesReportingRewardPercentage, ) - // Deploy a NativeTokenRemote to Subnet B + // Deploy a NativeTokenRemote to L1 B nativeTokenRemoteAddressB, nativeTokenRemoteB := utils.DeployNativeTokenRemote( ctx, teleporter, - subnetBInfo, + l1BInfo, "SUBB", fundedAddress, cChainInfo.BlockchainID, @@ -87,7 +87,7 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, teleporter, cChainInfo, erc20TokenHomeAddress, - subnetAInfo, + l1AInfo, nativeTokenRemoteAddressA, initialReserveImbalance, utils.GetTokenMultiplier(decimalsShift), @@ -101,7 +101,7 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, teleporter, cChainInfo, erc20TokenHomeAddress, - subnetBInfo, + l1BInfo, nativeTokenRemoteAddressB, initialReserveImbalance, utils.GetTokenMultiplier(decimalsShift), @@ -117,7 +117,7 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, erc20TokenHome, erc20TokenHomeAddress, exampleERC20, - subnetAInfo.BlockchainID, + l1AInfo.BlockchainID, nativeTokenRemoteAddressA, collateralAmountA, fundedKey, @@ -129,7 +129,7 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, erc20TokenHome, erc20TokenHomeAddress, exampleERC20, - subnetBInfo.BlockchainID, + l1BInfo.BlockchainID, nativeTokenRemoteAddressB, collateralAmountB, fundedKey, @@ -143,9 +143,9 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, // These are set during the initial transferring, and used in the multi-hop transfers amount := big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(10)) - // Send tokens from C-Chain to Subnet A + // Send tokens from C-Chain to L1 A inputA := erc20tokenhome.SendTokensInput{ - DestinationBlockchainID: subnetAInfo.BlockchainID, + DestinationBlockchainID: l1AInfo.BlockchainID, DestinationTokenTransferrerAddress: nativeTokenRemoteAddressA, Recipient: recipientAddress, PrimaryFeeTokenAddress: exampleERC20Address, @@ -165,12 +165,12 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, fundedKey, ) - // Relay the message to subnet A and check for a native token mint withdrawal + // Relay the message to L1 A and check for a native token mint withdrawal teleporter.RelayTeleporterMessage( ctx, receipt, cChainInfo, - subnetAInfo, + l1AInfo, true, fundedKey, nil, @@ -178,11 +178,11 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, ) // Verify the recipient received the tokens - utils.CheckBalance(ctx, recipientAddress, transferredAmountA, subnetAInfo.RPCClient) + utils.CheckBalance(ctx, recipientAddress, transferredAmountA, l1AInfo.RPCClient) - // Send tokens from C-Chain to Subnet B + // Send tokens from C-Chain to L1 B inputB := erc20tokenhome.SendTokensInput{ - DestinationBlockchainID: subnetBInfo.BlockchainID, + DestinationBlockchainID: l1BInfo.BlockchainID, DestinationTokenTransferrerAddress: nativeTokenRemoteAddressB, Recipient: recipientAddress, PrimaryFeeTokenAddress: exampleERC20Address, @@ -202,12 +202,12 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, fundedKey, ) - // Relay the message to subnet B and check for a native token mint withdrawal + // Relay the message to L1 B and check for a native token mint withdrawal teleporter.RelayTeleporterMessage( ctx, receipt, cChainInfo, - subnetBInfo, + l1BInfo, true, fundedKey, nil, @@ -215,9 +215,9 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, ) // Verify the recipient received the tokens - utils.CheckBalance(ctx, recipientAddress, transferredAmountB, subnetBInfo.RPCClient) + utils.CheckBalance(ctx, recipientAddress, transferredAmountB, l1BInfo.RPCClient) - // Multi-hop transfer to Subnet B + // Multi-hop transfer to L1 B // Send half of the received amount to account for gas expenses amountToSend := new(big.Int).Div(transferredAmountA, big.NewInt(2)) @@ -226,10 +226,10 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, teleporter, fundedKey, recipientAddress, - subnetAInfo, + l1AInfo, nativeTokenRemoteA, nativeTokenRemoteAddressA, - subnetBInfo, + l1BInfo, nativeTokenRemoteB, nativeTokenRemoteAddressB, cChainInfo, @@ -238,17 +238,17 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, aggregator, ) - // Multi-hop transfer back to Subnet A + // Multi-hop transfer back to L1 A secondaryFeeAmount := new(big.Int).Div(amountToSend, big.NewInt(4)) utils.SendNativeMultiHopAndVerify( ctx, teleporter, fundedKey, recipientAddress, - subnetBInfo, + l1BInfo, nativeTokenRemoteB, nativeTokenRemoteAddressB, - subnetAInfo, + l1AInfo, nativeTokenRemoteA, nativeTokenRemoteAddressA, cChainInfo, diff --git a/tests/flows/ictt/native_home_erc20_remote.go b/tests/flows/ictt/native_home_erc20_remote.go index ccad64974..f95640bd8 100644 --- a/tests/flows/ictt/native_home_erc20_remote.go +++ b/tests/flows/ictt/native_home_erc20_remote.go @@ -15,13 +15,13 @@ import ( /** * Deploy a NativeTokenHome on the primary network - * Deploys ERC20TokenRemote to Subnet A - * Transfers C-Chain native tokens to Subnet A - * Transfer back tokens from Subnet A to C-Chain + * Deploys ERC20TokenRemote to L1 A + * Transfers C-Chain native tokens to L1 A + * Transfer back tokens from L1 A to C-Chain */ func NativeTokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, _ := network.GetTwoSubnets() + l1AInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -44,7 +44,7 @@ func NativeTokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, telepor wavaxAddress, ) - // Token representation on subnet A will have same name, symbol, and decimals + // Token representation on L1 A will have same name, symbol, and decimals tokenName, err := wavax.Name(&bind.CallOpts{}) Expect(err).Should(BeNil()) tokenSymbol, err := wavax.Symbol(&bind.CallOpts{}) @@ -52,12 +52,12 @@ func NativeTokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, telepor tokenDecimals, err := wavax.Decimals(&bind.CallOpts{}) Expect(err).Should(BeNil()) - // Deploy an ERC20TokenRemote to Subnet A + // Deploy an ERC20TokenRemote to L1 A erc20TokenRemoteAddress, erc20TokenRemote := utils.DeployERC20TokenRemote( ctx, teleporter, fundedKey, - subnetAInfo, + l1AInfo, fundedAddress, cChainInfo.BlockchainID, nativeTokenHomeAddress, @@ -75,7 +75,7 @@ func NativeTokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, telepor teleporter, cChainInfo, nativeTokenHomeAddress, - subnetAInfo, + l1AInfo, erc20TokenRemoteAddress, fundedKey, aggregator, @@ -86,9 +86,9 @@ func NativeTokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, telepor Expect(err).Should(BeNil()) recipientAddress := crypto.PubkeyToAddress(recipientKey.PublicKey) - // Send tokens from C-Chain to recipient on subnet A + // Send tokens from C-Chain to recipient on L1 A input := nativetokenhome.SendTokensInput{ - DestinationBlockchainID: subnetAInfo.BlockchainID, + DestinationBlockchainID: l1AInfo.BlockchainID, DestinationTokenTransferrerAddress: erc20TokenRemoteAddress, Recipient: recipientAddress, PrimaryFeeTokenAddress: wavaxAddress, @@ -110,12 +110,12 @@ func NativeTokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, telepor fundedKey, ) - // Relay the message to Subnet A and check for message delivery + // Relay the message to L1 A and check for message delivery receipt = teleporter.RelayTeleporterMessage( ctx, receipt, cChainInfo, - subnetAInfo, + l1AInfo, true, fundedKey, nil, @@ -135,10 +135,10 @@ func NativeTokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, telepor Expect(err).Should(BeNil()) Expect(balance).Should(Equal(transferredAmount)) - // Fund recipient with gas tokens on subnet A + // Fund recipient with gas tokens on L1 A utils.SendNativeTransfer( ctx, - subnetAInfo, + l1AInfo, fundedKey, recipientAddress, big.NewInt(1e18), @@ -153,10 +153,10 @@ func NativeTokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, telepor RequiredGasLimit: utils.DefaultNativeTokenRequiredGas, } - // Send tokens on Subnet A back for native tokens on C-Chain + // Send tokens on L1 A back for native tokens on C-Chain receipt, transferredAmount = utils.SendERC20TokenRemote( ctx, - subnetAInfo, + l1AInfo, erc20TokenRemote, erc20TokenRemoteAddress, inputA, @@ -167,7 +167,7 @@ func NativeTokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, telepor receipt = teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, + l1AInfo, cChainInfo, true, fundedKey, diff --git a/tests/flows/ictt/native_home_erc20_remote_multihop.go b/tests/flows/ictt/native_home_erc20_remote_multihop.go index ff957ed04..628878f8b 100644 --- a/tests/flows/ictt/native_home_erc20_remote_multihop.go +++ b/tests/flows/ictt/native_home_erc20_remote_multihop.go @@ -15,14 +15,14 @@ import ( /** * Deploy a NativeTokenHome on the primary network - * Deploys ERC20TokenRemote to Subnet A and Subnet B - * Transfers C-Chain native tokens to Subnet A - * Transfer tokens from Subnet A to Subnet B through multi-hop - * Brige back tokens from Subnet B to Subnet A through multi-hop + * Deploys ERC20TokenRemote to L1 A and L1 B + * Transfers C-Chain native tokens to L1 A + * Transfer tokens from L1 A to L1 B through multi-hop + * Brige back tokens from L1 B to L1 A through multi-hop */ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, subnetBInfo := network.GetTwoSubnets() + l1AInfo, l1BInfo := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -43,7 +43,7 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, wavaxAddress, ) - // Token representation on subnet B will have same name, symbol, and decimals + // Token representation on L1 B will have same name, symbol, and decimals tokenName, err := wavax.Name(&bind.CallOpts{}) Expect(err).Should(BeNil()) tokenSymbol, err := wavax.Symbol(&bind.CallOpts{}) @@ -51,12 +51,12 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, tokenDecimals, err := wavax.Decimals(&bind.CallOpts{}) Expect(err).Should(BeNil()) - // Deploy an ERC20TokenRemote on Subnet A + // Deploy an ERC20TokenRemote on L1 A erc20TokenRemoteAddressA, erc20TokenRemoteA := utils.DeployERC20TokenRemote( ctx, teleporter, fundedKey, - subnetAInfo, + l1AInfo, fundedAddress, cChainInfo.BlockchainID, nativeTokenHomeAddress, @@ -66,12 +66,12 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, tokenDecimals, ) - // Deploy an ERC20TokenRemote on Subnet B + // Deploy an ERC20TokenRemote on L1 B erc20TokenRemoteAddressB, erc20TokenRemoteB := utils.DeployERC20TokenRemote( ctx, teleporter, fundedKey, - subnetBInfo, + l1BInfo, fundedAddress, cChainInfo.BlockchainID, nativeTokenHomeAddress, @@ -90,7 +90,7 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, teleporter, cChainInfo, nativeTokenHomeAddress, - subnetAInfo, + l1AInfo, erc20TokenRemoteAddressA, fundedKey, aggregator, @@ -101,7 +101,7 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, teleporter, cChainInfo, nativeTokenHomeAddress, - subnetBInfo, + l1BInfo, erc20TokenRemoteAddressB, fundedKey, aggregator, @@ -112,9 +112,9 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, Expect(err).Should(BeNil()) recipientAddress := crypto.PubkeyToAddress(recipientKey.PublicKey) - // Send tokens from C-Chain to recipient on subnet A + // Send tokens from C-Chain to recipient on L1 A input := nativetokenhome.SendTokensInput{ - DestinationBlockchainID: subnetAInfo.BlockchainID, + DestinationBlockchainID: l1AInfo.BlockchainID, DestinationTokenTransferrerAddress: erc20TokenRemoteAddressA, Recipient: recipientAddress, PrimaryFeeTokenAddress: wavaxAddress, @@ -136,12 +136,12 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, fundedKey, ) - // Relay the message to subnet B and check for message delivery + // Relay the message to L1 B and check for message delivery receipt = teleporter.RelayTeleporterMessage( ctx, receipt, cChainInfo, - subnetAInfo, + l1AInfo, true, fundedKey, nil, @@ -161,7 +161,7 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, Expect(err).Should(BeNil()) Expect(balance).Should(Equal(transferredAmount)) - // Send tokens from subnet A to recipient on subnet B through a multi-hop + // Send tokens from L1 A to recipient on L1 B through a multi-hop secondaryFeeAmount := new(big.Int).Div(transferredAmount, big.NewInt(4)) utils.SendERC20TokenMultiHopAndVerify( ctx, @@ -169,10 +169,10 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, fundedKey, recipientKey, recipientAddress, - subnetAInfo, + l1AInfo, erc20TokenRemoteA, erc20TokenRemoteAddressA, - subnetBInfo, + l1BInfo, erc20TokenRemoteB, erc20TokenRemoteAddressB, cChainInfo, diff --git a/tests/flows/ictt/native_home_native_remote.go b/tests/flows/ictt/native_home_native_remote.go index 346dbc70b..a44c41b71 100644 --- a/tests/flows/ictt/native_home_native_remote.go +++ b/tests/flows/ictt/native_home_native_remote.go @@ -14,13 +14,13 @@ import ( /** * Deploy a NativeTokenHome on the primary network - * Deploys a NativeTokenRemote to Subnet A - * Transfers C-Chain native tokens to Subnet A - * Transfer back tokens from Subnet A to C-Chain + * Deploys a NativeTokenRemote to L1 A + * Transfers C-Chain native tokens to L1 A + * Transfer back tokens from L1 A to C-Chain */ func NativeTokenHomeNativeDestination(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, _ := network.GetTwoSubnets() + l1AInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -43,11 +43,11 @@ func NativeTokenHomeNativeDestination(network *localnetwork.LocalNetwork, telepo cChainWAVAXAddress, ) - // Deploy a NativeTokenRemote to Subnet A + // Deploy a NativeTokenRemote to L1 A nativeTokenRemoteAddress, nativeTokenRemote := utils.DeployNativeTokenRemote( ctx, teleporter, - subnetAInfo, + l1AInfo, "SUBA", fundedAddress, cChainInfo.BlockchainID, @@ -66,7 +66,7 @@ func NativeTokenHomeNativeDestination(network *localnetwork.LocalNetwork, telepo teleporter, cChainInfo, nativeTokenHomeAddress, - subnetAInfo, + l1AInfo, nativeTokenRemoteAddress, initialReserveImbalance, big.NewInt(1), @@ -80,7 +80,7 @@ func NativeTokenHomeNativeDestination(network *localnetwork.LocalNetwork, telepo cChainInfo, nativeTokenHome, nativeTokenHomeAddress, - subnetAInfo.BlockchainID, + l1AInfo.BlockchainID, nativeTokenRemoteAddress, collateralAmount, fundedKey, @@ -91,11 +91,11 @@ func NativeTokenHomeNativeDestination(network *localnetwork.LocalNetwork, telepo Expect(err).Should(BeNil()) recipientAddress := crypto.PubkeyToAddress(recipientKey.PublicKey) - // Send tokens from C-Chain to recipient on subnet A that fully collateralize token transferrer with leftover tokens. + // Send tokens from C-Chain to recipient on L1 A that fully collateralize token transferrer with leftover tokens. amount := new(big.Int).Mul(big.NewInt(1e18), big.NewInt(13)) { input := nativetokenhome.SendTokensInput{ - DestinationBlockchainID: subnetAInfo.BlockchainID, + DestinationBlockchainID: l1AInfo.BlockchainID, DestinationTokenTransferrerAddress: nativeTokenRemoteAddress, Recipient: recipientAddress, PrimaryFeeTokenAddress: cChainWAVAXAddress, @@ -120,7 +120,7 @@ func NativeTokenHomeNativeDestination(network *localnetwork.LocalNetwork, telepo ctx, receipt, cChainInfo, - subnetAInfo, + l1AInfo, true, fundedKey, nil, @@ -131,11 +131,11 @@ func NativeTokenHomeNativeDestination(network *localnetwork.LocalNetwork, telepo ctx, recipientAddress, amount, - subnetAInfo.RPCClient, + l1AInfo.RPCClient, ) } - // Send tokens on Subnet A back for native tokens on C-Chain + // Send tokens on L1 A back for native tokens on C-Chain { input_A := nativetokenremote.SendTokensInput{ DestinationBlockchainID: cChainInfo.BlockchainID, @@ -151,7 +151,7 @@ func NativeTokenHomeNativeDestination(network *localnetwork.LocalNetwork, telepo amount := big.NewInt(0).Div(amount, big.NewInt(2)) receipt, transferredAmount := utils.SendNativeTokenRemote( ctx, - subnetAInfo, + l1AInfo, nativeTokenRemote, nativeTokenRemoteAddress, input_A, @@ -162,7 +162,7 @@ func NativeTokenHomeNativeDestination(network *localnetwork.LocalNetwork, telepo receipt = teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, + l1AInfo, cChainInfo, true, fundedKey, diff --git a/tests/flows/ictt/native_home_native_remote_multihop.go b/tests/flows/ictt/native_home_native_remote_multihop.go index 897568157..ac0400cc7 100644 --- a/tests/flows/ictt/native_home_native_remote_multihop.go +++ b/tests/flows/ictt/native_home_native_remote_multihop.go @@ -14,16 +14,16 @@ import ( /* * - Deploy a NativeTokenHome on the primary network - - Deploys NativeTokenRemote to Subnet A and Subnet B - - Transfers native tokens from the C-Chain to Subnet A as Subnet A's native token - - Transfers native tokens from the C-Chain to Subnet B as Subnet B's native token - to collateralize the Subnet B token transferrer - - Transfer tokens from Subnet A to Subnet B through multi-hop - - Transfer back tokens from Subnet B to Subnet A through multi-hop + - Deploys NativeTokenRemote to L1 A and L1 B + - Transfers native tokens from the C-Chain to L1 A as L1 A's native token + - Transfers native tokens from the C-Chain to L1 B as L1 B's native token + to collateralize the L1 B token transferrer + - Transfer tokens from L1 A to L1 B through multi-hop + - Transfer back tokens from L1 B to L1 A through multi-hop */ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, subnetBInfo := network.GetTwoSubnets() + l1AInfo, l1BInfo := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -49,11 +49,11 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork wavaxAddress, ) - // Deploy a NativeTokenRemote to Subnet A + // Deploy a NativeTokenRemote to L1 A nativeTokenRemoteAddressA, nativeTokenRemoteA := utils.DeployNativeTokenRemote( ctx, teleporter, - subnetAInfo, + l1AInfo, "SUBA", fundedAddress, cChainInfo.BlockchainID, @@ -63,11 +63,11 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork burnedFeesReportingRewardPercentage, ) - // Deploy a NativeTokenRemote to Subnet B + // Deploy a NativeTokenRemote to L1 B nativeTokenRemoteAddressB, nativeTokenRemoteB := utils.DeployNativeTokenRemote( ctx, teleporter, - subnetBInfo, + l1BInfo, "SUBB", fundedAddress, cChainInfo.BlockchainID, @@ -86,7 +86,7 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork teleporter, cChainInfo, nativeTokenHomeAddress, - subnetAInfo, + l1AInfo, nativeTokenRemoteAddressA, initialReserveImbalance, utils.GetTokenMultiplier(decimalsShift), @@ -100,7 +100,7 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork teleporter, cChainInfo, nativeTokenHomeAddress, - subnetBInfo, + l1BInfo, nativeTokenRemoteAddressB, initialReserveImbalance, utils.GetTokenMultiplier(decimalsShift), @@ -115,7 +115,7 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork cChainInfo, nativeTokenHome, nativeTokenHomeAddress, - subnetAInfo.BlockchainID, + l1AInfo.BlockchainID, nativeTokenRemoteAddressA, collateralAmountA, fundedKey, @@ -126,7 +126,7 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork cChainInfo, nativeTokenHome, nativeTokenHomeAddress, - subnetBInfo.BlockchainID, + l1BInfo.BlockchainID, nativeTokenRemoteAddressB, collateralAmountB, fundedKey, @@ -139,9 +139,9 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork amount := big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(10)) - // Send tokens from C-Chain to Subnet A + // Send tokens from C-Chain to L1 A inputA := nativetokenhome.SendTokensInput{ - DestinationBlockchainID: subnetAInfo.BlockchainID, + DestinationBlockchainID: l1AInfo.BlockchainID, DestinationTokenTransferrerAddress: nativeTokenRemoteAddressA, Recipient: recipientAddress, PrimaryFeeTokenAddress: wavaxAddress, @@ -161,12 +161,12 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork fundedKey, ) - // Relay the message to subnet A and check for a native token mint withdrawal + // Relay the message to L1 A and check for a native token mint withdrawal teleporter.RelayTeleporterMessage( ctx, receipt, cChainInfo, - subnetAInfo, + l1AInfo, true, fundedKey, nil, @@ -174,11 +174,11 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork ) // Verify the recipient received the tokens - utils.CheckBalance(ctx, recipientAddress, transferredAmountA, subnetAInfo.RPCClient) + utils.CheckBalance(ctx, recipientAddress, transferredAmountA, l1AInfo.RPCClient) - // Send tokens from C-Chain to Subnet B + // Send tokens from C-Chain to L1 B inputB := nativetokenhome.SendTokensInput{ - DestinationBlockchainID: subnetBInfo.BlockchainID, + DestinationBlockchainID: l1BInfo.BlockchainID, DestinationTokenTransferrerAddress: nativeTokenRemoteAddressB, Recipient: recipientAddress, PrimaryFeeTokenAddress: wavaxAddress, @@ -197,12 +197,12 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork fundedKey, ) - // Relay the message to subnet B and check for a native token mint withdrawal + // Relay the message to L1 B and check for a native token mint withdrawal teleporter.RelayTeleporterMessage( ctx, receipt, cChainInfo, - subnetBInfo, + l1BInfo, true, fundedKey, nil, @@ -210,9 +210,9 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork ) // Verify the recipient received the tokens - utils.CheckBalance(ctx, recipientAddress, transferredAmountB, subnetBInfo.RPCClient) + utils.CheckBalance(ctx, recipientAddress, transferredAmountB, l1BInfo.RPCClient) - // Multi-hop transfer to Subnet B + // Multi-hop transfer to L1 B // Send half of the received amount to account for gas expenses amountToSendA := new(big.Int).Div(transferredAmountA, big.NewInt(2)) @@ -221,10 +221,10 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork teleporter, fundedKey, recipientAddress, - subnetAInfo, + l1AInfo, nativeTokenRemoteA, nativeTokenRemoteAddressA, - subnetBInfo, + l1BInfo, nativeTokenRemoteB, nativeTokenRemoteAddressB, cChainInfo, @@ -237,16 +237,16 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork amountToSendB := new(big.Int).Div(amountToSendA, big.NewInt(2)) secondaryFeeAmount := new(big.Int).Div(amountToSendB, big.NewInt(4)) - // Multi-hop transfer back to Subnet A + // Multi-hop transfer back to L1 A utils.SendNativeMultiHopAndVerify( ctx, teleporter, fundedKey, recipientAddress, - subnetBInfo, + l1BInfo, nativeTokenRemoteB, nativeTokenRemoteAddressB, - subnetAInfo, + l1AInfo, nativeTokenRemoteA, nativeTokenRemoteAddressA, cChainInfo, diff --git a/tests/flows/ictt/registration_and_collateral_check.go b/tests/flows/ictt/registration_and_collateral_check.go index 03cd89ea1..bf669966b 100644 --- a/tests/flows/ictt/registration_and_collateral_check.go +++ b/tests/flows/ictt/registration_and_collateral_check.go @@ -14,7 +14,7 @@ import ( /** * Deploys an ERC20TokenHome contract on the C-Chain - * Deploys an ERC20TokenRemote contract on Subnet A + * Deploys an ERC20TokenRemote contract on L1 A * Check sending to unregistered remote fails * Register the ERC20TokenRemote to home contract * Check sending to non-collateralized remote fails @@ -23,12 +23,12 @@ import ( */ func RegistrationAndCollateralCheck(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, _ := network.GetTwoSubnets() + l1AInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() - // Deploy an ExampleERC20 on subnet A as the token to be transferred + // Deploy an ExampleERC20 on L1 A as the token to be transferred exampleERC20Address, exampleERC20 := utils.DeployExampleERC20Decimals( ctx, fundedKey, @@ -47,11 +47,11 @@ func RegistrationAndCollateralCheck(network *localnetwork.LocalNetwork, teleport erc20TokenHomeDecimals, ) - // Deploy a NativeTokenRemote to Subnet A + // Deploy a NativeTokenRemote to L1 A nativeTokenRemoteAddressA, _ := utils.DeployNativeTokenRemote( ctx, teleporter, - subnetAInfo, + l1AInfo, "SUBA", fundedAddress, cChainInfo.BlockchainID, @@ -66,9 +66,9 @@ func RegistrationAndCollateralCheck(network *localnetwork.LocalNetwork, teleport Expect(err).Should(BeNil()) recipientAddress := crypto.PubkeyToAddress(recipientKey.PublicKey) - // Send tokens from C-Chain to Subnet A + // Send tokens from C-Chain to L1 A input := erc20tokenhome.SendTokensInput{ - DestinationBlockchainID: subnetAInfo.BlockchainID, + DestinationBlockchainID: l1AInfo.BlockchainID, DestinationTokenTransferrerAddress: nativeTokenRemoteAddressA, Recipient: recipientAddress, PrimaryFeeTokenAddress: exampleERC20Address, @@ -107,7 +107,7 @@ func RegistrationAndCollateralCheck(network *localnetwork.LocalNetwork, teleport teleporter, cChainInfo, erc20TokenHomeAddress, - subnetAInfo, + l1AInfo, nativeTokenRemoteAddressA, initialReserveImbalance, utils.GetTokenMultiplier(decimalsShift), @@ -137,7 +137,7 @@ func RegistrationAndCollateralCheck(network *localnetwork.LocalNetwork, teleport erc20TokenHome, erc20TokenHomeAddress, exampleERC20, - subnetAInfo.BlockchainID, + l1AInfo.BlockchainID, nativeTokenRemoteAddressA, collateralNeeded, fundedKey, @@ -184,12 +184,12 @@ func RegistrationAndCollateralCheck(network *localnetwork.LocalNetwork, teleport Expect(err).Should(BeNil()) utils.ExpectBigEqual(balance, big.NewInt(0).Add(initialBalance, amount)) - // Relay the message to subnet A and check for a native token mint withdrawal + // Relay the message to L1 A and check for a native token mint withdrawal teleporter.RelayTeleporterMessage( ctx, receipt, cChainInfo, - subnetAInfo, + l1AInfo, true, fundedKey, nil, @@ -197,5 +197,5 @@ func RegistrationAndCollateralCheck(network *localnetwork.LocalNetwork, teleport ) // Verify the recipient received the tokens - utils.CheckBalance(ctx, recipientAddress, scaledAmount, subnetAInfo.RPCClient) + utils.CheckBalance(ctx, recipientAddress, scaledAmount, l1AInfo.RPCClient) } diff --git a/tests/flows/ictt/transparent_proxy_upgradeability.go b/tests/flows/ictt/transparent_proxy_upgradeability.go index 71e6abc9a..357824cac 100644 --- a/tests/flows/ictt/transparent_proxy_upgradeability.go +++ b/tests/flows/ictt/transparent_proxy_upgradeability.go @@ -18,17 +18,17 @@ import ( * Deploy an upgradeable ERC20TokenHome on the primary network * Deploys a transparent upgradeable proxy that uses the ERC20TokenHome logic contract * Deploys a proxy admin contract to manage the upgradeable proxy - * Deploy an ERC20TokenRemote to Subnet A - * Transfers example erc20 tokens from the primary network to Subnet A + * Deploy an ERC20TokenRemote to L1 A + * Transfers example erc20 tokens from the primary network to L1 A * Deploy a new ERC20TokenHome logic contract on the primary network * Upgrade the transparent upgradeable proxy to use the new logic contract - * Transfer tokens from Subnet A back to the primary network + * Transfer tokens from L1 A back to the primary network * Check that the transfer was successful, and expected balances are correct */ func TransparentUpgradeableProxy(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, _ := network.GetTwoSubnets() + l1AInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -82,12 +82,12 @@ func TransparentUpgradeableProxy(network *localnetwork.LocalNetwork, teleporter Expect(err).Should(BeNil()) utils.WaitForTransactionSuccess(ctx, cChainInfo, tx.Hash()) - // Deploy the ERC20TokenRemote contract on Subnet A + // Deploy the ERC20TokenRemote contract on L1 A erc20TokenRemoteAddress, erc20TokenRemote := utils.DeployERC20TokenRemote( ctx, teleporter, fundedKey, - subnetAInfo, + l1AInfo, fundedAddress, cChainInfo.BlockchainID, erc20TokenHomeAddress, @@ -105,20 +105,20 @@ func TransparentUpgradeableProxy(network *localnetwork.LocalNetwork, teleporter teleporter, cChainInfo, erc20TokenHomeAddress, - subnetAInfo, + l1AInfo, erc20TokenRemoteAddress, fundedKey, aggregator, ) - // Send a transfer from primary network to Subnet A + // Send a transfer from primary network to L1 A // Generate new recipient to receive transferred tokens recipientKey, err := crypto.GenerateKey() Expect(err).Should(BeNil()) recipientAddress := crypto.PubkeyToAddress(recipientKey.PublicKey) input := erc20tokenhome.SendTokensInput{ - DestinationBlockchainID: subnetAInfo.BlockchainID, + DestinationBlockchainID: l1AInfo.BlockchainID, DestinationTokenTransferrerAddress: erc20TokenRemoteAddress, Recipient: recipientAddress, PrimaryFeeTokenAddress: exampleERC20Address, @@ -144,7 +144,7 @@ func TransparentUpgradeableProxy(network *localnetwork.LocalNetwork, teleporter ctx, receipt, cChainInfo, - subnetAInfo, + l1AInfo, true, fundedKey, nil, @@ -178,10 +178,10 @@ func TransparentUpgradeableProxy(network *localnetwork.LocalNetwork, teleporter Expect(err).Should(BeNil()) utils.WaitForTransactionSuccess(ctx, cChainInfo, tx.Hash()) - // Send a transfer from Subnet A back to primary network + // Send a transfer from L1 A back to primary network utils.SendNativeTransfer( ctx, - subnetAInfo, + l1AInfo, fundedKey, recipientAddress, big.NewInt(1e18), @@ -198,7 +198,7 @@ func TransparentUpgradeableProxy(network *localnetwork.LocalNetwork, teleporter receipt, transferredAmount = utils.SendERC20TokenRemote( ctx, - subnetAInfo, + l1AInfo, erc20TokenRemote, erc20TokenRemoteAddress, inputB, @@ -209,7 +209,7 @@ func TransparentUpgradeableProxy(network *localnetwork.LocalNetwork, teleporter receipt = teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, + l1AInfo, cChainInfo, true, fundedKey, diff --git a/tests/flows/teleporter/add_fee_amount.go b/tests/flows/teleporter/add_fee_amount.go index 44cd95b25..f15c69cc8 100644 --- a/tests/flows/teleporter/add_fee_amount.go +++ b/tests/flows/teleporter/add_fee_amount.go @@ -13,9 +13,9 @@ import ( ) func AddFeeAmount(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetAInfo := network.GetPrimaryNetworkInfo() - subnetBInfo, _ := network.GetTwoSubnets() - teleporterContractAddress := teleporter.TeleporterMessengerAddress(subnetAInfo) + l1AInfo := network.GetPrimaryNetworkInfo() + l1BInfo, _ := network.GetTwoL1s() + teleporterContractAddress := teleporter.TeleporterMessengerAddress(l1AInfo) fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -23,22 +23,22 @@ func AddFeeAmount(network *localnetwork.LocalNetwork, teleporter utils.Teleporte mockTokenAddress, mockToken := utils.DeployExampleERC20( context.Background(), fundedKey, - subnetAInfo, + l1AInfo, ) utils.ERC20Approve( ctx, mockToken, teleporterContractAddress, big.NewInt(1e18), - subnetAInfo, + l1AInfo, fundedKey, ) initFeeAmount := big.NewInt(1) - // Send a transaction to Subnet A that sends a message to Subnet B. + // Send a transaction to L1 A that sends a message to L1 B. sendCrossChainMessageInput := teleportermessenger.TeleporterMessageInput{ - DestinationBlockchainID: subnetBInfo.BlockchainID, + DestinationBlockchainID: l1BInfo.BlockchainID, DestinationAddress: fundedAddress, FeeInfo: teleportermessenger.TeleporterFeeInfo{ FeeTokenAddress: mockTokenAddress, @@ -51,9 +51,9 @@ func AddFeeAmount(network *localnetwork.LocalNetwork, teleporter utils.Teleporte sendCrossChainMsgReceipt, messageID := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, - teleporter.TeleporterMessenger(subnetAInfo), - subnetAInfo, - subnetBInfo, + teleporter.TeleporterMessenger(l1AInfo), + l1AInfo, + l1BInfo, sendCrossChainMessageInput, fundedKey, ) @@ -62,21 +62,21 @@ func AddFeeAmount(network *localnetwork.LocalNetwork, teleporter utils.Teleporte additionalFeeAmount := big.NewInt(2) utils.SendAddFeeAmountAndWaitForAcceptance( ctx, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, messageID, additionalFeeAmount, mockTokenAddress, fundedKey, - teleporter.TeleporterMessenger(subnetAInfo), + teleporter.TeleporterMessenger(l1AInfo), ) - // Relay message from Subnet A to Subnet B + // Relay message from L1 A to L1 B deliveryReceipt := teleporter.RelayTeleporterMessage( ctx, sendCrossChainMsgReceipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, true, fundedKey, nil, @@ -84,41 +84,42 @@ func AddFeeAmount(network *localnetwork.LocalNetwork, teleporter utils.Teleporte ) receiveEvent, err := utils.GetEventFromLogs( deliveryReceipt.Logs, - teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage) + teleporter.TeleporterMessenger(l1BInfo).ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) - // Check Teleporter message received on the destination (Subnet B) - delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived(&bind.CallOpts{}, messageID) + // Check Teleporter message received on the destination (L1 B) + delivered, err := teleporter.TeleporterMessenger(l1BInfo).MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) - // Check the initial relayer reward amount on Subnet A. - initialRewardAmount, err := teleporter.TeleporterMessenger(subnetAInfo).CheckRelayerRewardAmount( + // Check the initial relayer reward amount on L1 A. + initialRewardAmount, err := teleporter.TeleporterMessenger(l1AInfo).CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent.RewardRedeemer, mockTokenAddress) Expect(err).Should(BeNil()) - // Send a message from Subnet B back to Subnet A that includes the specific receipt for the message. + // Send a message from L1 B back to L1 A that includes the specific receipt for the message. sendSpecificReceiptsReceipt, sendSpecificReceiptsMessageID := utils.SendSpecifiedReceiptsAndWaitForAcceptance( ctx, - teleporter.TeleporterMessenger(subnetBInfo), - subnetBInfo, - subnetAInfo.BlockchainID, + teleporter.TeleporterMessenger(l1BInfo), + l1BInfo, + l1AInfo.BlockchainID, [][32]byte{receiveEvent.MessageID}, teleportermessenger.TeleporterFeeInfo{ FeeTokenAddress: mockTokenAddress, Amount: big.NewInt(0), }, []common.Address{}, - fundedKey) + fundedKey, + ) - // Relay message containing the specific receipt from Subnet B to Subnet A + // Relay message containing the specific receipt from L1 B to L1 A teleporter.RelayTeleporterMessage( ctx, sendSpecificReceiptsReceipt, - subnetBInfo, - subnetAInfo, + l1BInfo, + l1AInfo, true, fundedKey, nil, @@ -126,7 +127,7 @@ func AddFeeAmount(network *localnetwork.LocalNetwork, teleporter utils.Teleporte ) // Check message delivered - delivered, err = teleporter.TeleporterMessenger(subnetAInfo).MessageReceived( + delivered, err = teleporter.TeleporterMessenger(l1AInfo).MessageReceived( &bind.CallOpts{}, sendSpecificReceiptsMessageID, ) @@ -135,7 +136,7 @@ func AddFeeAmount(network *localnetwork.LocalNetwork, teleporter utils.Teleporte // Check the updated relayer reward amount expectedIncrease := new(big.Int).Add(initFeeAmount, additionalFeeAmount) - newRewardAmount, err := teleporter.TeleporterMessenger(subnetAInfo).CheckRelayerRewardAmount( + newRewardAmount, err := teleporter.TeleporterMessenger(l1AInfo).CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent.RewardRedeemer, mockTokenAddress) @@ -146,8 +147,8 @@ func AddFeeAmount(network *localnetwork.LocalNetwork, teleporter utils.Teleporte if fundedAddress == receiveEvent.RewardRedeemer { utils.RedeemRelayerRewardsAndConfirm( ctx, - teleporter.TeleporterMessenger(subnetAInfo), - subnetAInfo, + teleporter.TeleporterMessenger(l1AInfo), + l1AInfo, mockToken, mockTokenAddress, fundedKey, diff --git a/tests/flows/teleporter/basic_send_receive.go b/tests/flows/teleporter/basic_send_receive.go index 97da8c397..0387e9699 100644 --- a/tests/flows/teleporter/basic_send_receive.go +++ b/tests/flows/teleporter/basic_send_receive.go @@ -12,29 +12,29 @@ import ( . "github.com/onsi/gomega" ) -// Tests basic one-way send from Subnet A to Subnet B and vice versa +// Tests basic one-way send from L1 A to L1 B and vice versa func BasicSendReceive(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetAInfo := network.GetPrimaryNetworkInfo() - subnetBInfo, _ := network.GetTwoSubnets() - teleporterContractAddress := teleporter.TeleporterMessengerAddress(subnetAInfo) + l1AInfo := network.GetPrimaryNetworkInfo() + l1BInfo, _ := network.GetTwoL1s() + teleporterContractAddress := teleporter.TeleporterMessengerAddress(l1AInfo) fundedAddress, fundedKey := network.GetFundedAccountInfo() - // Send a transaction to Subnet A to issue a Warp Message from the Teleporter contract to Subnet B + // Send a transaction to L1 A to issue an ICM Message from the Teleporter contract to L1 B ctx := context.Background() aggregator := network.GetSignatureAggregator() defer aggregator.Shutdown() - // Clear the receipt queue from Subnet B -> Subnet A to have a clean slate for the test flow. + // Clear the receipt queue from L1 B -> L1 A to have a clean slate for the test flow. // This is only done if the test non-external networks because external networks may have // an arbitrarily high number of receipts to be cleared from a given queue from unrelated messages. - teleporter.ClearReceiptQueue(ctx, fundedKey, subnetBInfo, subnetAInfo, aggregator) + teleporter.ClearReceiptQueue(ctx, fundedKey, l1BInfo, l1AInfo, aggregator) feeAmount := big.NewInt(1) feeTokenAddress, feeToken := utils.DeployExampleERC20( ctx, fundedKey, - subnetAInfo, + l1AInfo, ) utils.ERC20Approve( ctx, @@ -42,12 +42,12 @@ func BasicSendReceive(network *localnetwork.LocalNetwork, teleporter utils.Telep teleporterContractAddress, big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(10)), - subnetAInfo, + l1AInfo, fundedKey, ) sendCrossChainMessageInput := teleportermessenger.TeleporterMessageInput{ - DestinationBlockchainID: subnetBInfo.BlockchainID, + DestinationBlockchainID: l1BInfo.BlockchainID, DestinationAddress: fundedAddress, FeeInfo: teleportermessenger.TeleporterFeeInfo{ FeeTokenAddress: feeTokenAddress, @@ -60,9 +60,9 @@ func BasicSendReceive(network *localnetwork.LocalNetwork, teleporter utils.Telep receipt, teleporterMessageID := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, - teleporter.TeleporterMessenger(subnetAInfo), - subnetAInfo, - subnetBInfo, + teleporter.TeleporterMessenger(l1AInfo), + l1AInfo, + l1BInfo, sendCrossChainMessageInput, fundedKey, ) @@ -72,8 +72,8 @@ func BasicSendReceive(network *localnetwork.LocalNetwork, teleporter utils.Telep deliveryReceipt := teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, true, fundedKey, nil, @@ -81,24 +81,25 @@ func BasicSendReceive(network *localnetwork.LocalNetwork, teleporter utils.Telep ) receiveEvent, err := utils.GetEventFromLogs( deliveryReceipt.Logs, - teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage) + teleporter.TeleporterMessenger(l1BInfo).ParseReceiveCrossChainMessage, + ) Expect(err).Should(BeNil()) // Check Teleporter message received on the destination - delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( + delivered, err := teleporter.TeleporterMessenger(l1BInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) - // Send a transaction to Subnet B to issue a Warp Message from the Teleporter contract to Subnet A - sendCrossChainMessageInput.DestinationBlockchainID = subnetAInfo.BlockchainID + // Send a transaction to L1 B to issue an ICM Message from the Teleporter contract to L1 A + sendCrossChainMessageInput.DestinationBlockchainID = l1AInfo.BlockchainID sendCrossChainMessageInput.FeeInfo.Amount = big.NewInt(0) receipt, teleporterMessageID = utils.SendCrossChainMessageAndWaitForAcceptance( ctx, - teleporter.TeleporterMessenger(subnetBInfo), - subnetBInfo, - subnetAInfo, + teleporter.TeleporterMessenger(l1BInfo), + l1BInfo, + l1AInfo, sendCrossChainMessageInput, fundedKey, ) @@ -107,8 +108,8 @@ func BasicSendReceive(network *localnetwork.LocalNetwork, teleporter utils.Telep deliveryReceipt = teleporter.RelayTeleporterMessage( ctx, receipt, - subnetBInfo, - subnetAInfo, + l1BInfo, + l1AInfo, true, fundedKey, nil, @@ -118,20 +119,20 @@ func BasicSendReceive(network *localnetwork.LocalNetwork, teleporter utils.Telep Expect(utils.CheckReceiptReceived( deliveryReceipt, expectedReceiptID, - teleporter.TeleporterMessenger(subnetAInfo))).Should(BeTrue()) + teleporter.TeleporterMessenger(l1AInfo))).Should(BeTrue()) // Check Teleporter message received on the destination - delivered, err = teleporter.TeleporterMessenger(subnetAInfo).MessageReceived( + delivered, err = teleporter.TeleporterMessenger(l1AInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // If the reward address of the message from A->B is the funded address, which is able to send - // transactions on subnet A, then redeem the rewards. + // transactions on L1 A, then redeem the rewards. if receiveEvent.RewardRedeemer == fundedAddress { utils.RedeemRelayerRewardsAndConfirm( - ctx, teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, feeToken, feeTokenAddress, fundedKey, feeAmount, + ctx, teleporter.TeleporterMessenger(l1AInfo), l1AInfo, feeToken, feeTokenAddress, fundedKey, feeAmount, ) } } diff --git a/tests/flows/teleporter/deliver_to_nonexistent_contract.go b/tests/flows/teleporter/deliver_to_nonexistent_contract.go index 664310596..7d4ac61a4 100644 --- a/tests/flows/teleporter/deliver_to_nonexistent_contract.go +++ b/tests/flows/teleporter/deliver_to_nonexistent_contract.go @@ -15,8 +15,8 @@ import ( ) func DeliverToNonExistentContract(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetAInfo := network.GetPrimaryNetworkInfo() - subnetBInfo, _ := network.GetTwoSubnets() + l1AInfo := network.GetPrimaryNetworkInfo() + l1BInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() deployerKey, err := crypto.GenerateKey() @@ -24,46 +24,46 @@ func DeliverToNonExistentContract(network *localnetwork.LocalNetwork, teleporter deployerAddress := crypto.PubkeyToAddress(deployerKey.PublicKey) // - // Fund the deployer address on Subnet B + // Fund the deployer address on L1 B // ctx := context.Background() - log.Info("Funding address on subnet B", "address", deployerAddress.Hex()) + log.Info("Funding address on L1 B", "address", deployerAddress.Hex()) fundAmount := big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(10)) // 10eth fundDeployerTx := utils.CreateNativeTransferTransaction( - ctx, subnetBInfo, fundedKey, deployerAddress, fundAmount, + ctx, l1BInfo, fundedKey, deployerAddress, fundAmount, ) - utils.SendTransactionAndWaitForSuccess(ctx, subnetBInfo, fundDeployerTx) + utils.SendTransactionAndWaitForSuccess(ctx, l1BInfo, fundDeployerTx) // - // Deploy ExampleMessenger to Subnet A, but not to Subnet B - // Send a message that should fail to be executed on Subnet B + // Deploy ExampleMessenger to L1 A, but not to L1 B + // Send a message that should fail to be executed on L1 B // - log.Info("Deploying ExampleMessenger to Subnet A") - _, subnetAExampleMessenger := utils.DeployTestMessenger( + log.Info("Deploying ExampleMessenger to L1 A") + _, L1AExampleMessenger := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, - teleporter.TeleporterRegistryAddress(subnetAInfo), - subnetAInfo, + teleporter.TeleporterRegistryAddress(l1AInfo), + l1AInfo, ) - // Derive the eventual address of the destination contract on Subnet B - nonce, err := subnetBInfo.RPCClient.NonceAt(ctx, deployerAddress, nil) + // Derive the eventual address of the destination contract on L1 B + nonce, err := l1BInfo.RPCClient.NonceAt(ctx, deployerAddress, nil) Expect(err).Should(BeNil()) destinationContractAddress := crypto.CreateAddress(deployerAddress, nonce) // - // Call the example messenger contract on Subnet A + // Call the example messenger contract on L1 A // - log.Info("Calling ExampleMessenger on Subnet A") + log.Info("Calling ExampleMessenger on L1 A") message := "Hello, world!" optsA, err := bind.NewKeyedTransactorWithChainID( - fundedKey, subnetAInfo.EVMChainID) + fundedKey, l1AInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err := subnetAExampleMessenger.SendMessage( + tx, err := L1AExampleMessenger.SendMessage( optsA, - subnetBInfo.BlockchainID, + l1BInfo.BlockchainID, destinationContractAddress, common.BigToAddress(common.Big0), big.NewInt(0), @@ -73,14 +73,14 @@ func DeliverToNonExistentContract(network *localnetwork.LocalNetwork, teleporter Expect(err).Should(BeNil()) // Wait for the transaction to be mined - receipt := utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) + receipt := utils.WaitForTransactionSuccess(ctx, l1AInfo, tx.Hash()) sendEvent, err := utils.GetEventFromLogs( receipt.Logs, - teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage, + teleporter.TeleporterMessenger(l1AInfo).ParseSendCrossChainMessage, ) Expect(err).Should(BeNil()) - Expect(sendEvent.DestinationBlockchainID[:]).Should(Equal(subnetBInfo.BlockchainID[:])) + Expect(sendEvent.DestinationBlockchainID[:]).Should(Equal(l1BInfo.BlockchainID[:])) teleporterMessageID := sendEvent.MessageID @@ -95,22 +95,22 @@ func DeliverToNonExistentContract(network *localnetwork.LocalNetwork, teleporter receipt = teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, true, fundedKey, nil, aggregator, ) receiveEvent, err := - utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetAInfo).ParseReceiveCrossChainMessage) + utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(l1AInfo).ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) // // Check that the message was successfully relayed // log.Info("Checking the message was successfully relayed") - delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( + delivered, err := teleporter.TeleporterMessenger(l1BInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) @@ -123,42 +123,42 @@ func DeliverToNonExistentContract(network *localnetwork.LocalNetwork, teleporter log.Info("Checking the message was not successfully executed") executionFailedEvent, err := utils.GetEventFromLogs( receipt.Logs, - teleporter.TeleporterMessenger(subnetAInfo).ParseMessageExecutionFailed, + teleporter.TeleporterMessenger(l1AInfo).ParseMessageExecutionFailed, ) Expect(err).Should(BeNil()) Expect(executionFailedEvent.MessageID).Should(Equal(receiveEvent.MessageID)) // - // Deploy the contract on Subnet B + // Deploy the contract on L1 B // - log.Info("Deploying the contract on Subnet B") - exampleMessengerContractB, subnetBExampleMessenger := utils.DeployTestMessenger( + log.Info("Deploying the contract on L1 B") + exampleMessengerContractB, L1BExampleMessenger := utils.DeployTestMessenger( ctx, deployerKey, deployerAddress, - teleporter.TeleporterRegistryAddress(subnetBInfo), - subnetBInfo, + teleporter.TeleporterRegistryAddress(l1BInfo), + l1BInfo, ) // Confirm that it was deployed at the expected address Expect(exampleMessengerContractB).Should(Equal(destinationContractAddress)) // - // Call retryMessageExecution on Subnet B + // Call retryMessageExecution on L1 B // - log.Info("Calling retryMessageExecution on Subnet B") + log.Info("Calling retryMessageExecution on L1 B") receipt = utils.RetryMessageExecutionAndWaitForAcceptance( ctx, - subnetAInfo.BlockchainID, - teleporter.TeleporterMessenger(subnetBInfo), - subnetBInfo, + l1AInfo.BlockchainID, + teleporter.TeleporterMessenger(l1BInfo), + l1BInfo, receiveEvent.Message, fundedKey, ) log.Info("Checking the message was successfully executed") messageExecutedEvent, err := utils.GetEventFromLogs( receipt.Logs, - teleporter.TeleporterMessenger(subnetAInfo).ParseMessageExecuted, + teleporter.TeleporterMessenger(l1AInfo).ParseMessageExecuted, ) Expect(err).Should(BeNil()) Expect(messageExecutedEvent.MessageID).Should(Equal(receiveEvent.MessageID)) @@ -167,7 +167,7 @@ func DeliverToNonExistentContract(network *localnetwork.LocalNetwork, teleporter // Verify we received the expected string // log.Info("Verifying we received the expected string") - _, currMessage, err := subnetBExampleMessenger.GetCurrentMessage(&bind.CallOpts{}, subnetAInfo.BlockchainID) + _, currMessage, err := L1BExampleMessenger.GetCurrentMessage(&bind.CallOpts{}, l1AInfo.BlockchainID) Expect(err).Should(BeNil()) Expect(currMessage).Should(Equal(message)) } diff --git a/tests/flows/teleporter/deliver_to_wrong_chain.go b/tests/flows/teleporter/deliver_to_wrong_chain.go index 7a76b5cc9..fc905dc0e 100644 --- a/tests/flows/teleporter/deliver_to_wrong_chain.go +++ b/tests/flows/teleporter/deliver_to_wrong_chain.go @@ -14,25 +14,25 @@ import ( ) func DeliverToWrongChain(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetAInfo := network.GetPrimaryNetworkInfo() - subnetBInfo, subnetCInfo := network.GetTwoSubnets() + l1AInfo := network.GetPrimaryNetworkInfo() + l1BInfo, L1CInfo := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() // - // Get the expected teleporter message ID for Subnet C + // Get the expected teleporter message ID for L1 C // - expectedAtoCMessageID, err := teleporter.TeleporterMessenger(subnetAInfo).GetNextMessageID( + expectedAtoCMessageID, err := teleporter.TeleporterMessenger(l1AInfo).GetNextMessageID( &bind.CallOpts{}, - subnetCInfo.BlockchainID, + L1CInfo.BlockchainID, ) Expect(err).Should(BeNil()) // - // Submit a message to be sent from SubnetA to SubnetB + // Submit a message to be sent from L1A to L1B // ctx := context.Background() sendCrossChainMessageInput := teleportermessenger.TeleporterMessageInput{ - DestinationBlockchainID: subnetBInfo.BlockchainID, // Message intended for SubnetB + DestinationBlockchainID: l1BInfo.BlockchainID, // Message intended for L1B DestinationAddress: common.HexToAddress("0x1111111111111111111111111111111111111111"), FeeInfo: teleportermessenger.TeleporterFeeInfo{ FeeTokenAddress: fundedAddress, @@ -45,14 +45,14 @@ func DeliverToWrongChain(network *localnetwork.LocalNetwork, teleporter utils.Te log.Info( "Sending Teleporter transaction on source chain", - "destinationBlockchainID", subnetBInfo.BlockchainID, + "destinationBlockchainID", l1BInfo.BlockchainID, ) receipt, _ := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, - teleporter.TeleporterMessenger(subnetAInfo), - subnetAInfo, - subnetBInfo, + teleporter.TeleporterMessenger(l1AInfo), + l1AInfo, + l1BInfo, sendCrossChainMessageInput, fundedKey, ) @@ -63,8 +63,8 @@ func DeliverToWrongChain(network *localnetwork.LocalNetwork, teleporter utils.Te teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, - subnetCInfo, + l1AInfo, + L1CInfo, false, fundedKey, nil, @@ -72,9 +72,9 @@ func DeliverToWrongChain(network *localnetwork.LocalNetwork, teleporter utils.Te ) // - // Check that the message was not received on the Subnet C + // Check that the message was not received on the L1 C // - delivered, err := teleporter.TeleporterMessenger(subnetCInfo).MessageReceived( + delivered, err := teleporter.TeleporterMessenger(L1CInfo).MessageReceived( &bind.CallOpts{}, expectedAtoCMessageID, ) Expect(err).Should(BeNil()) diff --git a/tests/flows/teleporter/insufficient_gas.go b/tests/flows/teleporter/insufficient_gas.go index a71c21d7d..f595e6914 100644 --- a/tests/flows/teleporter/insufficient_gas.go +++ b/tests/flows/teleporter/insufficient_gas.go @@ -11,59 +11,61 @@ import ( ) func InsufficientGas(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetAInfo := network.GetPrimaryNetworkInfo() - subnetBInfo, _ := network.GetTwoSubnets() + l1AInfo := network.GetPrimaryNetworkInfo() + l1BInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() - // Deploy TestMessenger to Subnets A - _, subnetATestMessenger := utils.DeployTestMessenger( + // Deploy TestMessenger to L1s A + _, l1ATestMessenger := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, - teleporter.TeleporterRegistryAddress(subnetAInfo), - subnetAInfo, + teleporter.TeleporterRegistryAddress(l1AInfo), + l1AInfo, ) - // Deploy TestMessenger to Subnets B - testMessengerContractB, subnetBTestMessenger := utils.DeployTestMessenger( + // Deploy TestMessenger to L1s B + testMessengerContractB, l1BTestMessenger := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, - teleporter.TeleporterRegistryAddress(subnetBInfo), - subnetBInfo, + teleporter.TeleporterRegistryAddress(l1BInfo), + l1BInfo, ) - // Send message from SubnetA to SubnetB with 0 execution gas, which should fail to execute + // Send message from L1A to L1B with 0 execution gas, which should fail to execute message := "Hello, world!" optsA, err := bind.NewKeyedTransactorWithChainID( - fundedKey, subnetAInfo.EVMChainID) + fundedKey, + l1AInfo.EVMChainID, + ) Expect(err).Should(BeNil()) - tx, err := subnetATestMessenger.SendMessage( - optsA, subnetBInfo.BlockchainID, testMessengerContractB, fundedAddress, big.NewInt(0), big.NewInt(0), message, + tx, err := l1ATestMessenger.SendMessage( + optsA, l1BInfo.BlockchainID, testMessengerContractB, fundedAddress, big.NewInt(0), big.NewInt(0), message, ) Expect(err).Should(BeNil()) // Wait for the transaction to be mined - receipt := utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) + receipt := utils.WaitForTransactionSuccess(ctx, l1AInfo, tx.Hash()) event, err := utils.GetEventFromLogs( receipt.Logs, - teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage, + teleporter.TeleporterMessenger(l1AInfo).ParseSendCrossChainMessage, ) Expect(err).Should(BeNil()) - Expect(event.DestinationBlockchainID[:]).Should(Equal(subnetBInfo.BlockchainID[:])) + Expect(event.DestinationBlockchainID[:]).Should(Equal(l1BInfo.BlockchainID[:])) messageID := event.MessageID aggregator := network.GetSignatureAggregator() defer aggregator.Shutdown() - // Relay message from SubnetA to SubnetB + // Relay message from L1 A to L1 B receipt = teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, true, fundedKey, nil, @@ -72,40 +74,40 @@ func InsufficientGas(network *localnetwork.LocalNetwork, teleporter utils.Telepo // Check Teleporter message received on the destination delivered, err := - teleporter.TeleporterMessenger(subnetBInfo).MessageReceived(&bind.CallOpts{}, messageID) + teleporter.TeleporterMessenger(l1BInfo).MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Check message execution failed event failedMessageExecutionEvent, err := utils.GetEventFromLogs( - receipt.Logs, teleporter.TeleporterMessenger(subnetBInfo).ParseMessageExecutionFailed, + receipt.Logs, teleporter.TeleporterMessenger(l1BInfo).ParseMessageExecutionFailed, ) Expect(err).Should(BeNil()) Expect(failedMessageExecutionEvent.MessageID[:]).Should(Equal(messageID[:])) - Expect(failedMessageExecutionEvent.SourceBlockchainID[:]).Should(Equal(subnetAInfo.BlockchainID[:])) + Expect(failedMessageExecutionEvent.SourceBlockchainID[:]).Should(Equal(l1AInfo.BlockchainID[:])) // Retry message execution. This will execute the message with as much gas as needed // (up to the transaction gas limit), rather than using the required gas specified in the message itself. receipt = utils.RetryMessageExecutionAndWaitForAcceptance( ctx, - subnetAInfo.BlockchainID, - teleporter.TeleporterMessenger(subnetBInfo), - subnetBInfo, + l1AInfo.BlockchainID, + teleporter.TeleporterMessenger(l1BInfo), + l1BInfo, failedMessageExecutionEvent.Message, fundedKey, ) executedEvent, err := utils.GetEventFromLogs( receipt.Logs, - teleporter.TeleporterMessenger(subnetBInfo).ParseMessageExecuted, + teleporter.TeleporterMessenger(l1BInfo).ParseMessageExecuted, ) Expect(err).Should(BeNil()) Expect(executedEvent.MessageID[:]).Should(Equal(messageID[:])) - Expect(executedEvent.SourceBlockchainID[:]).Should(Equal(subnetAInfo.BlockchainID[:])) + Expect(executedEvent.SourceBlockchainID[:]).Should(Equal(l1AInfo.BlockchainID[:])) // // Verify we received the expected string // - _, currMessage, err := subnetBTestMessenger.GetCurrentMessage(&bind.CallOpts{}, subnetAInfo.BlockchainID) + _, currMessage, err := l1BTestMessenger.GetCurrentMessage(&bind.CallOpts{}, l1AInfo.BlockchainID) Expect(err).Should(BeNil()) Expect(currMessage).Should(Equal(message)) } diff --git a/tests/flows/teleporter/registry/check_upgrade_access.go b/tests/flows/teleporter/registry/check_upgrade_access.go index 07d66c2e7..ae80cbe30 100644 --- a/tests/flows/teleporter/registry/check_upgrade_access.go +++ b/tests/flows/teleporter/registry/check_upgrade_access.go @@ -14,20 +14,20 @@ import ( ) func CheckUpgradeAccess(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetInfo := network.GetPrimaryNetworkInfo() + l1Info := network.GetPrimaryNetworkInfo() fundedAddress, fundedKey := network.GetFundedAccountInfo() // - // Deploy TestMessenger to the subnet + // Deploy TestMessenger to the L1 // ctx := context.Background() - teleporterAddress := teleporter.TeleporterMessengerAddress(subnetInfo) + teleporterAddress := teleporter.TeleporterMessengerAddress(l1Info) _, testMessenger := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, - teleporter.TeleporterRegistryAddress(subnetInfo), - subnetInfo, + teleporter.TeleporterRegistryAddress(l1Info), + l1Info, ) // Check that owner is the funded address @@ -44,7 +44,7 @@ func CheckUpgradeAccess(network *localnetwork.LocalNetwork, teleporter utils.Tel fundAmount := big.NewInt(0.1e18) // 0.1avax utils.SendNativeTransfer( ctx, - subnetInfo, + l1Info, fundedKey, nonOwnerAddress, fundAmount, @@ -52,7 +52,7 @@ func CheckUpgradeAccess(network *localnetwork.LocalNetwork, teleporter utils.Tel // Check that access is not granted to the non owner and has no effect nonOwnerOpts, err := bind.NewKeyedTransactorWithChainID( - nonOwnerKey, subnetInfo.EVMChainID) + nonOwnerKey, l1Info.EVMChainID) Expect(err).Should(BeNil()) _, err = testMessenger.PauseTeleporterAddress(nonOwnerOpts, teleporterAddress) Expect(err).ShouldNot(BeNil()) @@ -65,12 +65,12 @@ func CheckUpgradeAccess(network *localnetwork.LocalNetwork, teleporter utils.Tel // Check that the owner is able to pause the Teleporter address ownerOpts, err := bind.NewKeyedTransactorWithChainID( - fundedKey, subnetInfo.EVMChainID) + fundedKey, l1Info.EVMChainID) Expect(err).Should(BeNil()) // Try to call pauseTeleporterAddress from the owner account tx, err := testMessenger.PauseTeleporterAddress(ownerOpts, teleporterAddress) Expect(err).Should(BeNil()) - receipt := utils.WaitForTransactionSuccess(ctx, subnetInfo, tx.Hash()) + receipt := utils.WaitForTransactionSuccess(ctx, l1Info, tx.Hash()) pauseTeleporterEvent, err := utils.GetEventFromLogs(receipt.Logs, testMessenger.ParseTeleporterAddressPaused) Expect(err).Should(BeNil()) Expect(pauseTeleporterEvent.TeleporterAddress).Should(Equal(teleporterAddress)) @@ -82,7 +82,7 @@ func CheckUpgradeAccess(network *localnetwork.LocalNetwork, teleporter utils.Tel // Transfer ownership to the non owner account tx, err = testMessenger.TransferOwnership(ownerOpts, nonOwnerAddress) Expect(err).Should(BeNil()) - utils.WaitForTransactionSuccess(ctx, subnetInfo, tx.Hash()) + utils.WaitForTransactionSuccess(ctx, l1Info, tx.Hash()) // Try to call unpauseTeleporterAddress from the previous owner account _, err = testMessenger.UnpauseTeleporterAddress(ownerOpts, teleporterAddress) @@ -97,7 +97,7 @@ func CheckUpgradeAccess(network *localnetwork.LocalNetwork, teleporter utils.Tel // Try to call unpauseTeleporterAddress from the non owner account now tx, err = testMessenger.UnpauseTeleporterAddress(nonOwnerOpts, teleporterAddress) Expect(err).Should(BeNil()) - receipt = utils.WaitForTransactionSuccess(ctx, subnetInfo, tx.Hash()) + receipt = utils.WaitForTransactionSuccess(ctx, l1Info, tx.Hash()) unpauseTeleporterEvent, err := utils.GetEventFromLogs(receipt.Logs, testMessenger.ParseTeleporterAddressUnpaused) Expect(err).Should(BeNil()) Expect(unpauseTeleporterEvent.TeleporterAddress).Should(Equal(teleporterAddress)) diff --git a/tests/flows/teleporter/registry/pause_teleporter.go b/tests/flows/teleporter/registry/pause_teleporter.go index f1815dcf1..470fc2fcd 100644 --- a/tests/flows/teleporter/registry/pause_teleporter.go +++ b/tests/flows/teleporter/registry/pause_teleporter.go @@ -10,38 +10,40 @@ import ( ) func PauseTeleporter(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetAInfo := network.GetPrimaryNetworkInfo() - subnetBInfo, _ := network.GetTwoSubnets() + l1AInfo := network.GetPrimaryNetworkInfo() + l1BInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() // - // Deploy TestMessenger to Subnets A and B + // Deploy TestMessenger to L1s A and B // ctx := context.Background() - teleporterAddress := teleporter.TeleporterMessengerAddress(subnetAInfo) + teleporterAddress := teleporter.TeleporterMessengerAddress(l1AInfo) _, testMessengerA := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, - teleporter.TeleporterRegistryAddress(subnetAInfo), - subnetAInfo, + teleporter.TeleporterRegistryAddress(l1AInfo), + l1AInfo, ) testMessengerAddressB, testMessengerB := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, - teleporter.TeleporterRegistryAddress(subnetBInfo), - subnetBInfo, + teleporter.TeleporterRegistryAddress(l1BInfo), + l1BInfo, ) - // Pause Teleporter on subnet B + // Pause Teleporter on L1 B opts, err := bind.NewKeyedTransactorWithChainID( - fundedKey, subnetBInfo.EVMChainID) + fundedKey, + l1BInfo.EVMChainID, + ) Expect(err).Should(BeNil()) tx, err := testMessengerB.PauseTeleporterAddress(opts, teleporterAddress) Expect(err).Should(BeNil()) - receipt := utils.WaitForTransactionSuccess(ctx, subnetBInfo, tx.Hash()) + receipt := utils.WaitForTransactionSuccess(ctx, l1BInfo, tx.Hash()) pauseTeleporterEvent, err := utils.GetEventFromLogs(receipt.Logs, testMessengerB.ParseTeleporterAddressPaused) Expect(err).Should(BeNil()) Expect(pauseTeleporterEvent.TeleporterAddress).Should(Equal(teleporterAddress)) @@ -53,12 +55,12 @@ func PauseTeleporter(network *localnetwork.LocalNetwork, teleporter utils.Telepo aggregator := network.GetSignatureAggregator() defer aggregator.Shutdown() - // Send a message from subnet A to subnet B, which should fail + // Send a message from L1 A to L1 B, which should fail teleporter.SendExampleCrossChainMessageAndVerify( ctx, - subnetAInfo, + l1AInfo, testMessengerA, - subnetBInfo, + l1BInfo, testMessengerAddressB, testMessengerB, fundedKey, @@ -67,11 +69,11 @@ func PauseTeleporter(network *localnetwork.LocalNetwork, teleporter utils.Telepo false, ) - // Unpause Teleporter on subnet B + // Unpause Teleporter on L1 B tx, err = testMessengerB.UnpauseTeleporterAddress(opts, teleporterAddress) Expect(err).Should(BeNil()) - receipt = utils.WaitForTransactionSuccess(ctx, subnetBInfo, tx.Hash()) + receipt = utils.WaitForTransactionSuccess(ctx, l1BInfo, tx.Hash()) unpauseTeleporterEvent, err := utils.GetEventFromLogs(receipt.Logs, testMessengerB.ParseTeleporterAddressUnpaused) Expect(err).Should(BeNil()) Expect(unpauseTeleporterEvent.TeleporterAddress).Should(Equal(teleporterAddress)) @@ -80,12 +82,12 @@ func PauseTeleporter(network *localnetwork.LocalNetwork, teleporter utils.Telepo Expect(err).Should(BeNil()) Expect(isPaused).Should(BeFalse()) - // Send a message from subnet A to subnet B again, which should now succeed + // Send a message from L1 A to L1 B again, which should now succeed teleporter.SendExampleCrossChainMessageAndVerify( ctx, - subnetAInfo, + l1AInfo, testMessengerA, - subnetBInfo, + l1BInfo, testMessengerAddressB, testMessengerB, fundedKey, diff --git a/tests/flows/teleporter/registry/teleporter_registry.go b/tests/flows/teleporter/registry/teleporter_registry.go index ad81e4980..c4b815db0 100644 --- a/tests/flows/teleporter/registry/teleporter_registry.go +++ b/tests/flows/teleporter/registry/teleporter_registry.go @@ -27,7 +27,7 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel // Retry the previously failed message execution, verify message is now able to be delivered to dApp cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, subnetBInfo := network.GetTwoSubnets() + l1AInfo, l1BInfo := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -44,14 +44,14 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel ctx, fundedKey, fundedAddress, - teleporter.TeleporterRegistryAddress(subnetBInfo), - subnetBInfo, + teleporter.TeleporterRegistryAddress(l1BInfo), + l1BInfo, ) // Deploy the new version of Teleporter to both chains var newTeleporterAddress common.Address - for _, subnet := range network.GetAllSubnetsInfo() { - newTeleporterAddress = teleporter.DeployNewTeleporterVersion(ctx, subnet, fundedKey, teleporterByteCodeFile) + for _, l1 := range network.GetAllL1Infos() { + newTeleporterAddress = teleporter.DeployNewTeleporterVersion(ctx, l1, fundedKey, teleporterByteCodeFile) } networkID := network.GetNetworkID() @@ -65,15 +65,15 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel ) offchainMessageB, warpEnabledChainConfigB := utils.InitOffChainMessageChainConfig( networkID, - subnetBInfo, - teleporter.TeleporterRegistryAddress(subnetBInfo), + l1BInfo, + teleporter.TeleporterRegistryAddress(l1BInfo), newTeleporterAddress, 2, ) offchainMessageA, warpEnabledChainConfigA := utils.InitOffChainMessageChainConfig( networkID, - subnetAInfo, - teleporter.TeleporterRegistryAddress(subnetAInfo), + l1AInfo, + teleporter.TeleporterRegistryAddress(l1AInfo), newTeleporterAddress, 2, ) @@ -81,8 +81,8 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel // Create chain config with off chain messages chainConfigs := make(utils.ChainConfigMap) chainConfigs.Add(cChainInfo, warpEnabledChainConfigC) - chainConfigs.Add(subnetBInfo, warpEnabledChainConfigB) - chainConfigs.Add(subnetAInfo, warpEnabledChainConfigA) + chainConfigs.Add(l1BInfo, warpEnabledChainConfigB) + chainConfigs.Add(l1AInfo, warpEnabledChainConfigA) // Restart nodes with new chain config network.SetChainConfigs(chainConfigs) @@ -90,10 +90,10 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel aggregator := network.GetSignatureAggregator() defer aggregator.Shutdown() - // Call addProtocolVersion on subnetB to register the new Teleporter version + // Call addProtocolVersion on L1 B to register the new Teleporter version teleporter.AddProtocolVersionAndWaitForAcceptance( ctx, - subnetBInfo, + l1BInfo, newTeleporterAddress, fundedKey, offchainMessageB, @@ -106,7 +106,7 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel ctx, cChainInfo, testMessengerC, - subnetBInfo, + l1BInfo, testMessengerContractB, testMessengerB, fundedKey, @@ -116,17 +116,17 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel ) // Update minimum Teleporter version on destination chain - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetBInfo.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, l1BInfo.EVMChainID) Expect(err).Should(BeNil()) - latestVersionB, err := teleporter.TeleporterRegistry(subnetBInfo).LatestVersion(&bind.CallOpts{}) + latestVersionB, err := teleporter.TeleporterRegistry(l1BInfo).LatestVersion(&bind.CallOpts{}) Expect(err).Should(BeNil()) minTeleporterVersion, err := testMessengerB.GetMinTeleporterVersion(&bind.CallOpts{}) Expect(err).Should(BeNil()) tx, err := testMessengerB.UpdateMinTeleporterVersion(opts, latestVersionB) Expect(err).Should(BeNil()) - receipt := utils.WaitForTransactionSuccess(ctx, subnetBInfo, tx.Hash()) + receipt := utils.WaitForTransactionSuccess(ctx, l1BInfo, tx.Hash()) // Verify that minTeleporterVersion updated minTeleporterVersionUpdatedEvent, err := utils.GetEventFromLogs( @@ -143,7 +143,7 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel ctx, cChainInfo, testMessengerC, - subnetBInfo, + l1BInfo, testMessengerContractB, testMessengerB, fundedKey, @@ -153,14 +153,14 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel ) // Update teleporter with the new TeleporterMessengers - for _, subnet := range network.GetAllSubnetsInfo() { - teleporter.SetTeleporter(newTeleporterAddress, subnet) - teleporter.InitializeBlockchainID(subnet, fundedKey) + for _, l1 := range network.GetAllL1Infos() { + teleporter.SetTeleporter(newTeleporterAddress, l1) + teleporter.InitializeBlockchainID(l1, fundedKey) } teleporter.SendExampleCrossChainMessageAndVerify( ctx, - subnetBInfo, + l1BInfo, testMessengerB, cChainInfo, testMessengerContractC, @@ -171,7 +171,7 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel false, ) - // Call addProtocolVersion on subnetA to register the new Teleporter version + // Call addProtocolVersion on L1A to register the new Teleporter version teleporter.AddProtocolVersionAndWaitForAcceptance( ctx, cChainInfo, @@ -185,7 +185,7 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel // Teleporter versions should match, so message should be received successfully. teleporter.SendExampleCrossChainMessageAndVerify( ctx, - subnetBInfo, + l1BInfo, testMessengerB, cChainInfo, testMessengerContractC, @@ -196,18 +196,18 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel true, ) - // To make sure all subnets are using the same Teleporter version, call addProtocolVersion on subnetA + // To make sure all L1s are using the same Teleporter version, call addProtocolVersion on L1A // to register the new Teleporter version teleporter.AddProtocolVersionAndWaitForAcceptance( ctx, - subnetAInfo, + l1AInfo, newTeleporterAddress, fundedKey, offchainMessageA, aggregator, ) - latestVersionA, err := teleporter.TeleporterRegistry(subnetAInfo).LatestVersion(&bind.CallOpts{}) + latestVersionA, err := teleporter.TeleporterRegistry(l1AInfo).LatestVersion(&bind.CallOpts{}) Expect(err).Should(BeNil()) Expect(latestVersionA.Cmp(latestVersionB)).Should(Equal(0)) diff --git a/tests/flows/teleporter/relay_message_twice.go b/tests/flows/teleporter/relay_message_twice.go index 72677411e..ecb672bda 100644 --- a/tests/flows/teleporter/relay_message_twice.go +++ b/tests/flows/teleporter/relay_message_twice.go @@ -15,17 +15,17 @@ import ( ) func RelayMessageTwice(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetAInfo := network.GetPrimaryNetworkInfo() - subnetBInfo, _ := network.GetTwoSubnets() + l1AInfo := network.GetPrimaryNetworkInfo() + l1BInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() // - // Send a transaction to Subnet A to issue a Warp Message from the Teleporter contract to Subnet B + // Send a transaction to L1 A to issue an ICM Message from the Teleporter contract to L1 B // ctx := context.Background() sendCrossChainMessageInput := teleportermessenger.TeleporterMessageInput{ - DestinationBlockchainID: subnetBInfo.BlockchainID, + DestinationBlockchainID: l1BInfo.BlockchainID, DestinationAddress: fundedAddress, FeeInfo: teleportermessenger.TeleporterFeeInfo{ FeeTokenAddress: fundedAddress, @@ -38,13 +38,13 @@ func RelayMessageTwice(network *localnetwork.LocalNetwork, teleporter utils.Tele log.Info( "Sending Teleporter transaction on source chain", - "destinationBlockchainID", subnetBInfo.BlockchainID, + "destinationBlockchainID", l1BInfo.BlockchainID, ) receipt, teleporterMessageID := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, - teleporter.TeleporterMessenger(subnetAInfo), - subnetAInfo, - subnetBInfo, + teleporter.TeleporterMessenger(l1AInfo), + l1AInfo, + l1BInfo, sendCrossChainMessageInput, fundedKey, ) @@ -58,8 +58,8 @@ func RelayMessageTwice(network *localnetwork.LocalNetwork, teleporter utils.Tele teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, true, fundedKey, nil, @@ -70,7 +70,7 @@ func RelayMessageTwice(network *localnetwork.LocalNetwork, teleporter utils.Tele // Check Teleporter message received on the destination // log.Info("Checking the message was received on the destination") - delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( + delivered, err := teleporter.TeleporterMessenger(l1BInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -83,8 +83,8 @@ func RelayMessageTwice(network *localnetwork.LocalNetwork, teleporter utils.Tele teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, false, fundedKey, nil, diff --git a/tests/flows/teleporter/relayer_modifies_message.go b/tests/flows/teleporter/relayer_modifies_message.go index fe4441a97..27febf628 100644 --- a/tests/flows/teleporter/relayer_modifies_message.go +++ b/tests/flows/teleporter/relayer_modifies_message.go @@ -24,15 +24,15 @@ import ( // Disallow this test from being run on anything but a local network, since it requires special behavior by the relayer func RelayerModifiesMessage(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetAInfo := network.GetPrimaryNetworkInfo() - subnetBInfo, _ := network.GetTwoSubnets() + l1AInfo := network.GetPrimaryNetworkInfo() + l1BInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() - // Send a transaction to Subnet A to issue a Warp Message from the Teleporter contract to Subnet B + // Send a transaction to L1 A to issue a Warp Message from the Teleporter contract to L1 B ctx := context.Background() sendCrossChainMessageInput := teleportermessenger.TeleporterMessageInput{ - DestinationBlockchainID: subnetBInfo.BlockchainID, + DestinationBlockchainID: l1BInfo.BlockchainID, DestinationAddress: fundedAddress, FeeInfo: teleportermessenger.TeleporterFeeInfo{ FeeTokenAddress: fundedAddress, @@ -44,7 +44,7 @@ func RelayerModifiesMessage(network *localnetwork.LocalNetwork, teleporter utils } receipt, messageID := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) + ctx, teleporter.TeleporterMessenger(l1AInfo), l1AInfo, l1BInfo, sendCrossChainMessageInput, fundedKey) // Relay the message to the destination // Relayer modifies the message in flight @@ -52,13 +52,13 @@ func RelayerModifiesMessage(network *localnetwork.LocalNetwork, teleporter utils ctx, teleporter, receipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, network, ) // Check Teleporter message was not received on the destination - delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived(&bind.CallOpts{}, messageID) + delivered, err := teleporter.TeleporterMessenger(l1BInfo).MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeFalse()) } @@ -67,8 +67,8 @@ func relayAlteredMessage( ctx context.Context, teleporter utils.TeleporterTestInfo, sourceReceipt *types.Receipt, - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, + destination interfaces.L1TestInfo, network *localnetwork.LocalNetwork, ) { // Fetch the Teleporter message from the logs @@ -113,7 +113,7 @@ func createAlteredReceiveCrossChainMessageTransaction( requiredGasLimit *big.Int, teleporterContractAddress common.Address, fundedKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, ) *types.Transaction { fundedAddress := crypto.PubkeyToAddress(fundedKey.PublicKey) // Construct the transaction to send the Warp message to the destination chain @@ -134,12 +134,12 @@ func createAlteredReceiveCrossChainMessageTransaction( callData, err := teleportermessenger.PackReceiveCrossChainMessage(0, fundedAddress) Expect(err).Should(BeNil()) - gasFeeCap, gasTipCap, nonce := utils.CalculateTxParams(ctx, subnetInfo, fundedAddress) + gasFeeCap, gasTipCap, nonce := utils.CalculateTxParams(ctx, l1Info, fundedAddress) alterTeleporterMessage(signedMessage) destinationTx := predicateutils.NewPredicateTx( - subnetInfo.EVMChainID, + l1Info.EVMChainID, nonce, &teleporterContractAddress, gasLimit, @@ -152,7 +152,7 @@ func createAlteredReceiveCrossChainMessageTransaction( signedMessage.Bytes(), ) - return utils.SignTransaction(destinationTx, fundedKey, subnetInfo.EVMChainID) + return utils.SignTransaction(destinationTx, fundedKey, l1Info.EVMChainID) } func alterTeleporterMessage(signedMessage *avalancheWarp.Message) { diff --git a/tests/flows/teleporter/resubmit_altered_message.go b/tests/flows/teleporter/resubmit_altered_message.go index 37f621661..fab98c08f 100644 --- a/tests/flows/teleporter/resubmit_altered_message.go +++ b/tests/flows/teleporter/resubmit_altered_message.go @@ -14,15 +14,15 @@ import ( ) func ResubmitAlteredMessage(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetAInfo := network.GetPrimaryNetworkInfo() - subnetBInfo, _ := network.GetTwoSubnets() + l1AInfo := network.GetPrimaryNetworkInfo() + l1BInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() - // Send a transaction to Subnet A to issue a Warp Message from the Teleporter contract to Subnet B + // Send a transaction to L1 A to issue an ICM Message from the Teleporter contract to L1 B ctx := context.Background() sendCrossChainMessageInput := teleportermessenger.TeleporterMessageInput{ - DestinationBlockchainID: subnetBInfo.BlockchainID, + DestinationBlockchainID: l1BInfo.BlockchainID, DestinationAddress: fundedAddress, FeeInfo: teleportermessenger.TeleporterFeeInfo{ FeeTokenAddress: fundedAddress, @@ -34,7 +34,7 @@ func ResubmitAlteredMessage(network *localnetwork.LocalNetwork, teleporter utils } receipt, messageID := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) + ctx, teleporter.TeleporterMessenger(l1AInfo), l1AInfo, l1BInfo, sendCrossChainMessageInput, fundedKey) aggregator := network.GetSignatureAggregator() defer aggregator.Shutdown() @@ -43,8 +43,8 @@ func ResubmitAlteredMessage(network *localnetwork.LocalNetwork, teleporter utils receipt = teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, true, fundedKey, nil, @@ -52,14 +52,14 @@ func ResubmitAlteredMessage(network *localnetwork.LocalNetwork, teleporter utils ) log.Info("Checking the message was received on the destination") - delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived(&bind.CallOpts{}, messageID) + delivered, err := teleporter.TeleporterMessenger(l1BInfo).MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Get the Teleporter message from receive event event, err := utils.GetEventFromLogs( receipt.Logs, - teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage, + teleporter.TeleporterMessenger(l1BInfo).ParseReceiveCrossChainMessage, ) Expect(err).Should(BeNil()) Expect(event.MessageID[:]).Should(Equal(messageID[:])) @@ -74,12 +74,12 @@ func ResubmitAlteredMessage(network *localnetwork.LocalNetwork, teleporter utils // Resubmit the altered message log.Info("Submitting the altered Teleporter message on the source chain") - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, l1AInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err := teleporter.TeleporterMessenger(subnetAInfo).RetrySendCrossChainMessage(opts, teleporterMessage) + tx, err := teleporter.TeleporterMessenger(l1AInfo).RetrySendCrossChainMessage(opts, teleporterMessage) Expect(err).ShouldNot(BeNil()) - // We expect the tx to be nil because the Warp message failed verification, which happens in the predicate + // We expect the tx to be nil because the ICM message failed verification, which happens in the predicate // In that case, the block is never built, and the transaction is never mined Expect(tx).Should(BeNil()) } diff --git a/tests/flows/teleporter/retry_successful_execution.go b/tests/flows/teleporter/retry_successful_execution.go index b7e2743b4..6be466c4d 100644 --- a/tests/flows/teleporter/retry_successful_execution.go +++ b/tests/flows/teleporter/retry_successful_execution.go @@ -12,39 +12,39 @@ import ( ) func RetrySuccessfulExecution(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetAInfo := network.GetPrimaryNetworkInfo() - subnetBInfo, _ := network.GetTwoSubnets() + l1AInfo := network.GetPrimaryNetworkInfo() + l1BInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() // - // Deploy TestMessenger to Subnets A and B + // Deploy TestMessenger to L1s A and B // ctx := context.Background() - _, subnetATestMessenger := utils.DeployTestMessenger( + _, l1ATestMessenger := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, - teleporter.TeleporterRegistryAddress(subnetAInfo), - subnetAInfo, + teleporter.TeleporterRegistryAddress(l1AInfo), + l1AInfo, ) - testMessengerContractAddressB, subnetBTestMessenger := utils.DeployTestMessenger( + testMessengerContractAddressB, l1BTestMessenger := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, - teleporter.TeleporterRegistryAddress(subnetBInfo), - subnetBInfo, + teleporter.TeleporterRegistryAddress(l1BInfo), + l1BInfo, ) // - // Call the test messenger contract on Subnet A + // Call the test messenger contract on L1 A // message := "Hello, world!" - optsA, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) + optsA, err := bind.NewKeyedTransactorWithChainID(fundedKey, l1AInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err := subnetATestMessenger.SendMessage( + tx, err := l1ATestMessenger.SendMessage( optsA, - subnetBInfo.BlockchainID, + l1BInfo.BlockchainID, testMessengerContractAddressB, fundedAddress, big.NewInt(0), @@ -54,14 +54,14 @@ func RetrySuccessfulExecution(network *localnetwork.LocalNetwork, teleporter uti Expect(err).Should(BeNil()) // Wait for the transaction to be mined - receipt := utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) + receipt := utils.WaitForTransactionSuccess(ctx, l1AInfo, tx.Hash()) event, err := utils.GetEventFromLogs( receipt.Logs, - teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage, + teleporter.TeleporterMessenger(l1AInfo).ParseSendCrossChainMessage, ) Expect(err).Should(BeNil()) - Expect(event.DestinationBlockchainID[:]).Should(Equal(subnetBInfo.BlockchainID[:])) + Expect(event.DestinationBlockchainID[:]).Should(Equal(l1BInfo.BlockchainID[:])) teleporterMessageID := event.MessageID @@ -74,22 +74,22 @@ func RetrySuccessfulExecution(network *localnetwork.LocalNetwork, teleporter uti receipt = teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, true, fundedKey, nil, aggregator, ) receiveEvent, err := - utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage) + utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(l1BInfo).ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) deliveredTeleporterMessage := receiveEvent.Message // // Check Teleporter message received on the destination // - delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( + delivered, err := teleporter.TeleporterMessenger(l1BInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -98,19 +98,19 @@ func RetrySuccessfulExecution(network *localnetwork.LocalNetwork, teleporter uti // // Verify we received the expected string // - _, currMessage, err := subnetBTestMessenger.GetCurrentMessage(&bind.CallOpts{}, subnetAInfo.BlockchainID) + _, currMessage, err := l1BTestMessenger.GetCurrentMessage(&bind.CallOpts{}, l1AInfo.BlockchainID) Expect(err).Should(BeNil()) Expect(currMessage).Should(Equal(message)) // // Attempt to retry message execution, which should fail // - optsB, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetBInfo.EVMChainID) + optsB, err := bind.NewKeyedTransactorWithChainID(fundedKey, l1BInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err = teleporter.TeleporterMessenger(subnetBInfo).RetryMessageExecution( + tx, err = teleporter.TeleporterMessenger(l1BInfo).RetryMessageExecution( optsB, - subnetAInfo.BlockchainID, + l1AInfo.BlockchainID, deliveredTeleporterMessage, ) Expect(err).Should(Not(BeNil())) diff --git a/tests/flows/teleporter/send_specific_receipts.go b/tests/flows/teleporter/send_specific_receipts.go index f7c8a05c0..a56688aea 100644 --- a/tests/flows/teleporter/send_specific_receipts.go +++ b/tests/flows/teleporter/send_specific_receipts.go @@ -19,23 +19,23 @@ import ( ) func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetAInfo := network.GetPrimaryNetworkInfo() - subnetBInfo, _ := network.GetTwoSubnets() - subnetATeleporterMessenger := teleporter.TeleporterMessenger(subnetAInfo) - subnetBTeleporterMessenger := teleporter.TeleporterMessenger(subnetBInfo) - teleporterContractAddress := teleporter.TeleporterMessengerAddress(subnetAInfo) + l1AInfo := network.GetPrimaryNetworkInfo() + l1BInfo, _ := network.GetTwoL1s() + l1ATeleporterMessenger := teleporter.TeleporterMessenger(l1AInfo) + l1BTeleporterMessenger := teleporter.TeleporterMessenger(l1BInfo) + teleporterContractAddress := teleporter.TeleporterMessengerAddress(l1AInfo) _, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() aggregator := network.GetSignatureAggregator() defer aggregator.Shutdown() - // Clear the receipt queue from Subnet B -> Subnet A to have a clean slate for the test flow. - teleporter.ClearReceiptQueue(ctx, fundedKey, subnetBInfo, subnetAInfo, aggregator) + // Clear the receipt queue from L1 B -> L1 A to have a clean slate for the test flow. + teleporter.ClearReceiptQueue(ctx, fundedKey, l1BInfo, l1AInfo, aggregator) // Use mock token as the fee token mockTokenAddress, mockToken := utils.DeployExampleERC20( - ctx, fundedKey, subnetAInfo, + ctx, fundedKey, l1AInfo, ) utils.ERC20Approve( ctx, @@ -43,15 +43,15 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T teleporterContractAddress, big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(10)), - subnetAInfo, + l1AInfo, fundedKey, ) - // Send two messages from Subnet A to Subnet B + // Send two messages from L1 A to L1 B relayerFeePerMessage := big.NewInt(5) destinationAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") sendCrossChainMessageInput := teleportermessenger.TeleporterMessageInput{ - DestinationBlockchainID: subnetBInfo.BlockchainID, + DestinationBlockchainID: l1BInfo.BlockchainID, DestinationAddress: destinationAddress, FeeInfo: teleportermessenger.TeleporterFeeInfo{ FeeTokenAddress: mockTokenAddress, @@ -61,19 +61,19 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T AllowedRelayerAddresses: []common.Address{}, Message: []byte{1, 2, 3, 4}, } - goLog.Println("Sending two messages from Subnet A to Subnet B") + goLog.Println("Sending two messages from L1 A to L1 B") - // Send first message from Subnet A to Subnet B with fee amount 5 + // Send first message from L1 A to L1 B with fee amount 5 sendCrossChainMsgReceipt, messageID1 := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, subnetATeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) + ctx, l1ATeleporterMessenger, l1AInfo, l1BInfo, sendCrossChainMessageInput, fundedKey) - goLog.Println("Relaying the first message from Subnet A to Subnet B") - // Relay the message from SubnetA to SubnetB + goLog.Println("Relaying the first message from L1 A to L1 B") + // Relay the message from L1A to L1B deliveryReceipt1 := teleporter.RelayTeleporterMessage( ctx, sendCrossChainMsgReceipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, true, fundedKey, nil, @@ -81,27 +81,28 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T ) receiveEvent1, err := utils.GetEventFromLogs( deliveryReceipt1.Logs, - subnetBTeleporterMessenger.ParseReceiveCrossChainMessage) + l1BTeleporterMessenger.ParseReceiveCrossChainMessage, + ) Expect(err).Should(BeNil()) Expect(receiveEvent1.MessageID[:]).Should(Equal(messageID1[:])) // Check that the first message was delivered - delivered, err := subnetBTeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID1) + delivered, err := l1BTeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID1) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) - goLog.Println("Sending the second message from Subnet A to Subnet B") - // Send second message from Subnet A to Subnet B with fee amount 5 + goLog.Println("Sending the second message from L1 A to L1 B") + // Send second message from L1 A to L1 B with fee amount 5 sendCrossChainMsgReceipt, messageID2 := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, subnetATeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) + ctx, l1ATeleporterMessenger, l1AInfo, l1BInfo, sendCrossChainMessageInput, fundedKey) - goLog.Println("Relaying the second message from Subnet A to Subnet B") - // Relay the message from SubnetA to SubnetB + goLog.Println("Relaying the second message from L1 A to L1 B") + // Relay the message from L1 A to L1 B deliveryReceipt2 := teleporter.RelayTeleporterMessage( ctx, sendCrossChainMsgReceipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, true, fundedKey, nil, @@ -109,22 +110,22 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T ) receiveEvent2, err := utils.GetEventFromLogs( deliveryReceipt2.Logs, - subnetBTeleporterMessenger.ParseReceiveCrossChainMessage) + l1BTeleporterMessenger.ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) Expect(receiveEvent2.MessageID[:]).Should(Equal(messageID2[:])) // Check that the second message was delivered - delivered, err = subnetBTeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID2) + delivered, err = l1BTeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID2) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Call send specific receipts to get reward of relaying two messages - goLog.Println("Sending specific receipts from Subnet B to Subnet A") + goLog.Println("Sending specific receipts from L1 B to L1 A") receipt, messageID := utils.SendSpecifiedReceiptsAndWaitForAcceptance( ctx, - subnetBTeleporterMessenger, - subnetBInfo, - subnetAInfo.BlockchainID, + l1BTeleporterMessenger, + l1BInfo, + l1AInfo.BlockchainID, [][32]byte{messageID1, messageID2}, teleportermessenger.TeleporterFeeInfo{ FeeTokenAddress: mockTokenAddress, @@ -134,45 +135,45 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T fundedKey, ) - // Relay message from Subnet B to Subnet A - goLog.Println("Relaying the specific receipts from Subnet B to Subnet A") + // Relay message from L1 B to L1 A + goLog.Println("Relaying the specific receipts from L1 B to L1 A") receipt = teleporter.RelayTeleporterMessage( ctx, receipt, - subnetBInfo, - subnetAInfo, + l1BInfo, + l1AInfo, true, fundedKey, nil, aggregator, ) - // Check that the message back to Subnet A was delivered - delivered, err = subnetATeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) + // Check that the message back to L1 A was delivered + delivered, err = l1ATeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Check that the expected receipts were received and emitted ReceiptReceived - Expect(utils.CheckReceiptReceived(receipt, messageID1, subnetATeleporterMessenger)).Should(BeTrue()) - Expect(utils.CheckReceiptReceived(receipt, messageID2, subnetATeleporterMessenger)).Should(BeTrue()) + Expect(utils.CheckReceiptReceived(receipt, messageID1, l1ATeleporterMessenger)).Should(BeTrue()) + Expect(utils.CheckReceiptReceived(receipt, messageID2, l1ATeleporterMessenger)).Should(BeTrue()) // Check the reward amounts. // Even on external networks, the relayer should only have the expected fee amount // for this asset because the asset contract was newly deployed by this test. checkExpectedRewardAmounts( teleporter, - subnetAInfo, + l1AInfo, receiveEvent1, receiveEvent2, mockTokenAddress, relayerFeePerMessage, ) - // Send a message from Subnet B to Subnet A to trigger + // Send a message from L1 B to L1 A to trigger // the "regular" method of delivering receipts. The next message from B->A will contain the same receipts - // that were manually sent in the above steps, but they should not be processed again on Subnet A. + // that were manually sent in the above steps, but they should not be processed again on L1 A. sendCrossChainMessageInput = teleportermessenger.TeleporterMessageInput{ - DestinationBlockchainID: subnetAInfo.BlockchainID, + DestinationBlockchainID: l1AInfo.BlockchainID, DestinationAddress: destinationAddress, FeeInfo: teleportermessenger.TeleporterFeeInfo{ FeeTokenAddress: mockTokenAddress, @@ -183,25 +184,25 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T Message: []byte{1, 2, 3, 4}, } - goLog.Println("Sending a message from Subnet B to Subnet A to trigger receipts") + goLog.Println("Sending a message from L1 B to L1 A to trigger receipts") // This message will also have the same receipts as the previous message receipt, messageID = utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, subnetBTeleporterMessenger, subnetBInfo, subnetAInfo, sendCrossChainMessageInput, fundedKey) + ctx, l1BTeleporterMessenger, l1BInfo, l1AInfo, sendCrossChainMessageInput, fundedKey) - goLog.Println("Relaying the message from Subnet B to Subnet A") - // Relay message from Subnet B to Subnet A + goLog.Println("Relaying the message from L1 B to L1 A") + // Relay message from L1 B to L1 A receipt = teleporter.RelayTeleporterMessage( ctx, receipt, - subnetBInfo, - subnetAInfo, + l1BInfo, + l1AInfo, true, fundedKey, nil, aggregator, ) // Check delivered - delivered, err = subnetATeleporterMessenger.MessageReceived( + delivered, err = l1ATeleporterMessenger.MessageReceived( &bind.CallOpts{}, messageID, ) @@ -210,32 +211,32 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T // Check that the expected receipts were included in the message but did not emit ReceiptReceived // because they were previously received - Expect(utils.CheckReceiptReceived(receipt, messageID1, subnetATeleporterMessenger)).Should(BeFalse()) - Expect(utils.CheckReceiptReceived(receipt, messageID2, subnetATeleporterMessenger)).Should(BeFalse()) + Expect(utils.CheckReceiptReceived(receipt, messageID1, l1ATeleporterMessenger)).Should(BeFalse()) + Expect(utils.CheckReceiptReceived(receipt, messageID2, l1ATeleporterMessenger)).Should(BeFalse()) receiveEvent, err := utils.GetEventFromLogs( receipt.Logs, - subnetATeleporterMessenger.ParseReceiveCrossChainMessage, + l1ATeleporterMessenger.ParseReceiveCrossChainMessage, ) Expect(err).Should(BeNil()) log.Info("Receipt included", "count", len(receiveEvent.Message.Receipts), "receipts", receiveEvent.Message.Receipts) Expect(receiptIncluded( teleporterContractAddress, messageID1, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, receiveEvent.Message.Receipts)).Should(BeTrue()) Expect(receiptIncluded( teleporterContractAddress, messageID2, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, receiveEvent.Message.Receipts)).Should(BeTrue()) // Check the reward amount remains the same checkExpectedRewardAmounts( teleporter, - subnetAInfo, + l1AInfo, receiveEvent1, receiveEvent2, mockTokenAddress, @@ -247,15 +248,15 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T func receiptIncluded( teleporterMessengerAddress common.Address, expectedMessageID ids.ID, - sourceSubnet interfaces.SubnetTestInfo, - destinationSubnet interfaces.SubnetTestInfo, + sourceL1 interfaces.L1TestInfo, + destinationL1 interfaces.L1TestInfo, receipts []teleportermessenger.TeleporterMessageReceipt, ) bool { for _, receipt := range receipts { messageID, err := teleporterutils.CalculateMessageID( teleporterMessengerAddress, - sourceSubnet.BlockchainID, - destinationSubnet.BlockchainID, + sourceL1.BlockchainID, + destinationL1.BlockchainID, receipt.ReceivedMessageNonce, ) Expect(err).Should(BeNil()) @@ -272,7 +273,7 @@ func receiptIncluded( // and that each message individually had a fee of {feePerMessage}. func checkExpectedRewardAmounts( teleporter utils.TeleporterTestInfo, - sourceSubnet interfaces.SubnetTestInfo, + sourceL1 interfaces.L1TestInfo, receiveEvent1 *teleportermessenger.TeleporterMessengerReceiveCrossChainMessage, receiveEvent2 *teleportermessenger.TeleporterMessengerReceiveCrossChainMessage, tokenAddress common.Address, @@ -283,20 +284,20 @@ func checkExpectedRewardAmounts( // it should be able to redeem {feePerMessage}*2. Otherwise, // each distinct reward redeemer should be able to redeem {feePerMessage}. if receiveEvent1.RewardRedeemer == receiveEvent2.RewardRedeemer { - amount, err := teleporter[sourceSubnet.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( + amount, err := teleporter[sourceL1.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent1.RewardRedeemer, tokenAddress) Expect(err).Should(BeNil()) Expect(amount).Should(Equal(new(big.Int).Mul(feePerMessage, big.NewInt(2)))) } else { - amount1, err := teleporter[sourceSubnet.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( + amount1, err := teleporter[sourceL1.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent1.RewardRedeemer, tokenAddress) Expect(err).Should(BeNil()) Expect(amount1).Should(Equal(feePerMessage)) - amount2, err := teleporter[sourceSubnet.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( + amount2, err := teleporter[sourceL1.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent2.RewardRedeemer, tokenAddress) diff --git a/tests/flows/teleporter/teleporter_message_ids.go b/tests/flows/teleporter/teleporter_message_ids.go index a3be9ee3e..3b549811e 100644 --- a/tests/flows/teleporter/teleporter_message_ids.go +++ b/tests/flows/teleporter/teleporter_message_ids.go @@ -17,14 +17,14 @@ import ( // Tests Teleporter message ID calculation func CalculateMessageID(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetInfo := network.GetPrimaryNetworkInfo() - teleporterContractAddress := teleporter.TeleporterMessengerAddress(subnetInfo) + l1Info := network.GetPrimaryNetworkInfo() + teleporterContractAddress := teleporter.TeleporterMessengerAddress(l1Info) sourceBlockchainID := common.HexToHash("0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd") destinationBlockchainID := common.HexToHash("0x1234567812345678123456781234567812345678123456781234567812345678") nonce := big.NewInt(42) - expectedMessageID, err := teleporter.TeleporterMessenger(subnetInfo).CalculateMessageID( + expectedMessageID, err := teleporter.TeleporterMessenger(l1Info).CalculateMessageID( &bind.CallOpts{}, sourceBlockchainID, destinationBlockchainID, diff --git a/tests/flows/teleporter/unallowed_relayer.go b/tests/flows/teleporter/unallowed_relayer.go index 983b5fabc..193afc66a 100644 --- a/tests/flows/teleporter/unallowed_relayer.go +++ b/tests/flows/teleporter/unallowed_relayer.go @@ -14,18 +14,18 @@ import ( ) func UnallowedRelayer(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetAInfo := network.GetPrimaryNetworkInfo() - subnetBInfo, _ := network.GetTwoSubnets() + l1AInfo := network.GetPrimaryNetworkInfo() + l1BInfo, _ := network.GetTwoL1s() fundedAddress, fundedKey := network.GetFundedAccountInfo() // - // Send a transaction to Subnet A to issue a Warp Message from the Teleporter contract to Subnet B + // Send a transaction to L1 A to issue an ICM Message from the Teleporter contract to L1 B // The Teleporter message includes an allowed relayer list that does NOT include the relayer // ctx := context.Background() sendCrossChainMessageInput := teleportermessenger.TeleporterMessageInput{ - DestinationBlockchainID: subnetBInfo.BlockchainID, + DestinationBlockchainID: l1BInfo.BlockchainID, DestinationAddress: fundedAddress, FeeInfo: teleportermessenger.TeleporterFeeInfo{ FeeTokenAddress: fundedAddress, @@ -40,10 +40,10 @@ func UnallowedRelayer(network *localnetwork.LocalNetwork, teleporter utils.Telep log.Info( "Sending Teleporter transaction on source chain", - "destinationBlockchainID", subnetBInfo.BlockchainID, + "destinationBlockchainID", l1BInfo.BlockchainID, ) receipt, teleporterMessageID := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey, + ctx, teleporter.TeleporterMessenger(l1AInfo), l1AInfo, l1BInfo, sendCrossChainMessageInput, fundedKey, ) aggregator := network.GetSignatureAggregator() @@ -55,8 +55,8 @@ func UnallowedRelayer(network *localnetwork.LocalNetwork, teleporter utils.Telep teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, false, fundedKey, nil, @@ -66,7 +66,7 @@ func UnallowedRelayer(network *localnetwork.LocalNetwork, teleporter utils.Telep // // Check Teleporter message was not received on the destination // - delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( + delivered, err := teleporter.TeleporterMessenger(l1BInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) diff --git a/tests/flows/teleporter/validator_churn.go b/tests/flows/teleporter/validator_churn.go index 8f00c845d..9c64549eb 100644 --- a/tests/flows/teleporter/validator_churn.go +++ b/tests/flows/teleporter/validator_churn.go @@ -23,18 +23,18 @@ const ( ) func ValidatorChurn(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { - subnetAInfo, subnetBInfo := network.GetTwoSubnets() - teleporterContractAddress := teleporter.TeleporterMessengerAddress(subnetAInfo) + l1AInfo, l1BInfo := network.GetTwoL1s() + teleporterContractAddress := teleporter.TeleporterMessengerAddress(l1AInfo) fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() // - // Send a Teleporter message on Subnet A + // Send a Teleporter message on L1 A // - log.Info("Sending Teleporter message on source chain", "destinationBlockchainID", subnetBInfo.BlockchainID) + log.Info("Sending Teleporter message on source chain", "destinationBlockchainID", l1BInfo.BlockchainID) sendCrossChainMessageInput := teleportermessenger.TeleporterMessageInput{ - DestinationBlockchainID: subnetBInfo.BlockchainID, + DestinationBlockchainID: l1BInfo.BlockchainID, DestinationAddress: fundedAddress, FeeInfo: teleportermessenger.TeleporterFeeInfo{ FeeTokenAddress: fundedAddress, @@ -47,16 +47,16 @@ func ValidatorChurn(network *localnetwork.LocalNetwork, teleporter utils.Telepor receipt, teleporterMessageID := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, - teleporter.TeleporterMessenger(subnetAInfo), - subnetAInfo, - subnetBInfo, + teleporter.TeleporterMessenger(l1AInfo), + l1AInfo, + l1BInfo, sendCrossChainMessageInput, fundedKey, ) sendEvent, err := utils.GetEventFromLogs( receipt.Logs, - teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage, + teleporter.TeleporterMessenger(l1AInfo).ParseSendCrossChainMessage, ) Expect(err).Should(BeNil()) sentTeleporterMessage := sendEvent.Message @@ -68,26 +68,26 @@ func ValidatorChurn(network *localnetwork.LocalNetwork, teleporter utils.Telepor signedWarpMessage := utils.ConstructSignedWarpMessage( ctx, receipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, nil, aggregator, ) // - // Modify the validator set on Subnet A + // Modify the validator set on L1 A // // Add new nodes to the validator set addValidatorsCtx, cancel := context.WithTimeout(ctx, (90+sleepPeriodSeconds)*newNodeCount*time.Second) defer cancel() newNodes := network.GetExtraNodes(newNodeCount) - validatorManagerAddress := network.GetValidatorManager(subnetAInfo.SubnetID) - validatorManager, err := poavalidatormanager.NewPoAValidatorManager(validatorManagerAddress, subnetAInfo.RPCClient) + validatorManagerAddress := network.GetValidatorManager(l1AInfo.L1ID) + validatorManager, err := poavalidatormanager.NewPoAValidatorManager(validatorManagerAddress, l1AInfo.RPCClient) pChainInfo := utils.GetPChainInfo(network.GetPrimaryNetworkInfo()) Expect(err).Should(BeNil()) - subnetAInfo = network.AddSubnetValidators(newNodes, subnetAInfo) + l1AInfo = network.AddSubnetValidators(newNodes, l1AInfo) for i := 0; i < newNodeCount; i++ { expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) @@ -103,7 +103,7 @@ func ValidatorChurn(network *localnetwork.LocalNetwork, teleporter utils.Telepor aggregator, fundedKey, fundedKey, - subnetAInfo, + l1AInfo, pChainInfo, validatorManager, validatorManagerAddress, @@ -116,15 +116,15 @@ func ValidatorChurn(network *localnetwork.LocalNetwork, teleporter utils.Telepor time.Sleep(sleepPeriodSeconds * time.Second) } - // Refresh the subnet info - subnetAInfo, subnetBInfo = network.GetTwoSubnets() + // Refresh the L1 info + l1AInfo, l1BInfo = network.GetTwoL1s() // Trigger the proposer VM to update its height so that the inner VM can see the new validator set - // We have to update all subnets, not just the ones directly involved in this test to ensure that the - // proposer VM is updated on all subnets. - for _, subnetInfo := range network.GetSubnetsInfo() { + // We have to update all L1s, not just the ones directly involved in this test to ensure that the + // proposer VM is updated on all L1s. + for _, l1Info := range network.GetL1Infos() { err = subnetEvmUtils.IssueTxsToActivateProposerVMFork( - ctx, subnetInfo.EVMChainID, fundedKey, subnetInfo.WSClient, + ctx, l1Info.EVMChainID, fundedKey, l1Info.WSClient, ) Expect(err).Should(BeNil()) } @@ -139,14 +139,14 @@ func ValidatorChurn(network *localnetwork.LocalNetwork, teleporter utils.Telepor sendEvent.Message.RequiredGasLimit, teleporterContractAddress, fundedKey, - subnetBInfo, + l1BInfo, ) log.Info("Sending transaction to destination chain") - utils.SendTransactionAndWaitForFailure(ctx, subnetBInfo, signedTx) + utils.SendTransactionAndWaitForFailure(ctx, l1BInfo, signedTx) // Verify the message was not delivered - delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( + delivered, err := teleporter.TeleporterMessenger(l1BInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -156,21 +156,21 @@ func ValidatorChurn(network *localnetwork.LocalNetwork, teleporter utils.Telepor // Retry sending the message, and attempt to relay again. This should succeed. // log.Info("Retrying message sending on source chain") - optsA, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) + optsA, err := bind.NewKeyedTransactorWithChainID(fundedKey, l1AInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err := teleporter.TeleporterMessenger(subnetAInfo).RetrySendCrossChainMessage( + tx, err := teleporter.TeleporterMessenger(l1AInfo).RetrySendCrossChainMessage( optsA, sentTeleporterMessage, ) Expect(err).Should(BeNil()) // Wait for the transaction to be mined - receipt = utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) + receipt = utils.WaitForTransactionSuccess(ctx, l1AInfo, tx.Hash()) teleporter.RelayTeleporterMessage( ctx, receipt, - subnetAInfo, - subnetBInfo, + l1AInfo, + l1BInfo, true, fundedKey, nil, @@ -178,7 +178,7 @@ func ValidatorChurn(network *localnetwork.LocalNetwork, teleporter utils.Telepor ) // Verify the message was delivered - delivered, err = teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( + delivered, err = teleporter.TeleporterMessenger(l1BInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index f88857f0f..941d65536 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -18,65 +18,65 @@ import ( ) /* - * Registers a erc20 token staking validator on a subnet. The steps are as follows: + * Registers a erc20 token staking validator on a L1. The steps are as follows: * - Deploy the ERCTokenStakingManager * - Initiate validator registration * - Deliver the Warp message to the P-Chain (not implemented) * - Aggregate P-Chain signatures on the response Warp message - * - Deliver the Warp message to the subnet + * - Deliver the Warp message to the L1 * - Verify that the validator is registered in the staking contract * - * Delists the validator from the subnet. The steps are as follows: + * Delists the validator from the L1. The steps are as follows: * - Initiate validator delisting * - Deliver the Warp message to the P-Chain (not implemented) * - Aggregate P-Chain signatures on the response Warp message - * - Deliver the Warp message to the subnet + * - Deliver the Warp message to the L1 * - Verify that the validator is delisted from the staking contract */ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { - // Get the subnets info + // Get the L1s info cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, _ := network.GetTwoSubnets() + l1AInfo, _ := network.GetTwoL1s() _, fundedKey := network.GetFundedAccountInfo() pChainInfo := utils.GetPChainInfo(cChainInfo) signatureAggregator := utils.NewSignatureAggregator( cChainInfo.NodeURIs[0], []ids.ID{ - subnetAInfo.SubnetID, + l1AInfo.L1ID, }, ) ctx := context.Background() nodes, initialValidationIDs, _ := network.ConvertSubnet( ctx, - subnetAInfo, + l1AInfo, utils.ERC20TokenStakingManager, []uint64{units.Schmeckle, 1000 * units.Schmeckle}, // Choose weights to avoid validator churn limits fundedKey, false, ) - stakingManagerAddress := network.GetValidatorManager(subnetAInfo.SubnetID) + stakingManagerAddress := network.GetValidatorManager(l1AInfo.L1ID) erc20StakingManager, err := erc20tokenstakingmanager.NewERC20TokenStakingManager( stakingManagerAddress, - subnetAInfo.RPCClient, + l1AInfo.RPCClient, ) Expect(err).Should(BeNil()) erc20Address, err := erc20StakingManager.Erc20(&bind.CallOpts{}) Expect(err).Should(BeNil()) - erc20, err := exampleerc20.NewExampleERC20(erc20Address, subnetAInfo.RPCClient) + erc20, err := exampleerc20.NewExampleERC20(erc20Address, l1AInfo.RPCClient) Expect(err).Should(BeNil()) // // Delist one initial validator // - posStakingManager, err := iposvalidatormanager.NewIPoSValidatorManager(stakingManagerAddress, subnetAInfo.RPCClient) + posStakingManager, err := iposvalidatormanager.NewIPoSValidatorManager(stakingManagerAddress, l1AInfo.RPCClient) Expect(err).Should(BeNil()) utils.InitializeAndCompleteEndInitialPoSValidation( ctx, signatureAggregator, fundedKey, - subnetAInfo, + l1AInfo, pChainInfo, posStakingManager, stakingManagerAddress, @@ -95,7 +95,7 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { ctx, signatureAggregator, fundedKey, - subnetAInfo, + l1AInfo, pChainInfo, erc20StakingManager, stakingManagerAddress, @@ -131,7 +131,7 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { receipt := utils.InitializeERC20DelegatorRegistration( ctx, fundedKey, - subnetAInfo, + l1AInfo, validationID, delegatorStake, erc20, @@ -148,11 +148,11 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { aggregator := network.GetSignatureAggregator() defer aggregator.Shutdown() - // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain + // Gather subnet-evm Warp signatures for the L1ValidatorWeightMessage & relay to the P-Chain signedWarpMessage := utils.ConstructSignedWarpMessage( context.Background(), receipt, - subnetAInfo, + l1AInfo, pChainInfo, nil, aggregator, @@ -161,25 +161,25 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { // Issue a tx to update the validator's weight on the P-Chain network.GetPChainWallet().IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) utils.PChainProposerVMWorkaround(network.GetPChainWallet()) - utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) + utils.AdvanceProposerVM(ctx, l1AInfo, fundedKey, 5) - // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + // Construct an L1ValidatorWeightMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructL1ValidatorWeightMessage( validationID, nonce, newValidatorWeight, - subnetAInfo, + l1AInfo, pChainInfo, signatureAggregator, network.GetNetworkID(), ) - // Deliver the Warp message to the subnet + // Deliver the Warp message to the L1 receipt = utils.CompleteDelegatorRegistration( ctx, fundedKey, delegationID, - subnetAInfo, + l1AInfo, stakingManagerAddress, registrationSignedMessage, ) @@ -202,7 +202,7 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { receipt := utils.InitializeEndDelegation( ctx, fundedKey, - subnetAInfo, + l1AInfo, stakingManagerAddress, delegationID, ) @@ -217,12 +217,12 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { aggregator := network.GetSignatureAggregator() defer aggregator.Shutdown() - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // Gather subnet-evm Warp signatures for the SetL1ValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) signedWarpMessage := utils.ConstructSignedWarpMessage( context.Background(), receipt, - subnetAInfo, + l1AInfo, pChainInfo, nil, aggregator, @@ -232,25 +232,25 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { // Issue a tx to update the validator's weight on the P-Chain network.GetPChainWallet().IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) utils.PChainProposerVMWorkaround(network.GetPChainWallet()) - utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) + utils.AdvanceProposerVM(ctx, l1AInfo, fundedKey, 5) - // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain - signedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + // Construct an L1ValidatorWeightMessage Warp message from the P-Chain + signedMessage := utils.ConstructL1ValidatorWeightMessage( validationID, nonce, nodes[0].Weight, - subnetAInfo, + l1AInfo, pChainInfo, signatureAggregator, network.GetNetworkID(), ) - // Deliver the Warp message to the subnet + // Deliver the Warp message to the L1 receipt = utils.CompleteEndDelegation( ctx, fundedKey, delegationID, - subnetAInfo, + l1AInfo, stakingManagerAddress, signedMessage, ) @@ -272,7 +272,7 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { ctx, signatureAggregator, fundedKey, - subnetAInfo, + l1AInfo, pChainInfo, posStakingManager, stakingManagerAddress, diff --git a/tests/flows/validator-manager/native_token_staking.go b/tests/flows/validator-manager/native_token_staking.go index d3e90453d..99bc1fd8f 100644 --- a/tests/flows/validator-manager/native_token_staking.go +++ b/tests/flows/validator-manager/native_token_staking.go @@ -17,62 +17,62 @@ import ( ) /* - * Registers a native token staking validator on a subnet. The steps are as follows: + * Registers a native token staking validator on a L1. The steps are as follows: * - Deploy the NativeTokenStakingManager * - Initiate validator registration * - Deliver the Warp message to the P-Chain (not implemented) * - Aggregate P-Chain signatures on the response Warp message - * - Deliver the Warp message to the subnet + * - Deliver the Warp message to the L1 * - Verify that the validator is registered in the staking contract * - * Delists the validator from the subnet. The steps are as follows: + * Delists the validator from the L1. The steps are as follows: * - Initiate validator delisting * - Deliver the Warp message to the P-Chain (not implemented) * - Aggregate P-Chain signatures on the response Warp message - * - Deliver the Warp message to the subnet + * - Deliver the Warp message to the L1 * - Verify that the validator is delisted from the staking contract */ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { - // Get the subnets info + // Get the L1s info cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, _ := network.GetTwoSubnets() + l1AInfo, _ := network.GetTwoL1s() _, fundedKey := network.GetFundedAccountInfo() pChainInfo := utils.GetPChainInfo(cChainInfo) signatureAggregator := utils.NewSignatureAggregator( cChainInfo.NodeURIs[0], []ids.ID{ - subnetAInfo.SubnetID, + l1AInfo.L1ID, }, ) ctx := context.Background() nodes, initialValidationIDs, _ := network.ConvertSubnet( ctx, - subnetAInfo, + l1AInfo, utils.NativeTokenStakingManager, []uint64{units.Schmeckle, 1000 * units.Schmeckle}, // Choose weights to avoid validator churn limits fundedKey, false, ) - stakingManagerAddress := network.GetValidatorManager(subnetAInfo.SubnetID) + stakingManagerAddress := network.GetValidatorManager(l1AInfo.L1ID) nativeStakingManager, err := nativetokenstakingmanager.NewNativeTokenStakingManager( stakingManagerAddress, - subnetAInfo.RPCClient, + l1AInfo.RPCClient, ) Expect(err).Should(BeNil()) - utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, stakingManagerAddress) + utils.AddNativeMinterAdmin(ctx, l1AInfo, fundedKey, stakingManagerAddress) // // Delist one initial validator // - posStakingManager, err := iposvalidatormanager.NewIPoSValidatorManager(stakingManagerAddress, subnetAInfo.RPCClient) + posStakingManager, err := iposvalidatormanager.NewIPoSValidatorManager(stakingManagerAddress, l1AInfo.RPCClient) Expect(err).Should(BeNil()) utils.InitializeAndCompleteEndInitialPoSValidation( ctx, signatureAggregator, fundedKey, - subnetAInfo, + l1AInfo, pChainInfo, posStakingManager, stakingManagerAddress, @@ -91,7 +91,7 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { ctx, signatureAggregator, fundedKey, - subnetAInfo, + l1AInfo, pChainInfo, nativeStakingManager, stakingManagerAddress, @@ -126,7 +126,7 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { receipt := utils.InitializeNativeDelegatorRegistration( ctx, fundedKey, - subnetAInfo, + l1AInfo, validationID, delegatorStake, stakingManagerAddress, @@ -142,11 +142,11 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { aggregator := network.GetSignatureAggregator() defer aggregator.Shutdown() - // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain + // Gather subnet-evm Warp signatures for the L1ValidatorWeightMessage & relay to the P-Chain signedWarpMessage := utils.ConstructSignedWarpMessage( context.Background(), receipt, - subnetAInfo, + l1AInfo, pChainInfo, nil, aggregator, @@ -155,25 +155,25 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { // Issue a tx to update the validator's weight on the P-Chain network.GetPChainWallet().IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) utils.PChainProposerVMWorkaround(network.GetPChainWallet()) - utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) + utils.AdvanceProposerVM(ctx, l1AInfo, fundedKey, 5) - // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + // Construct a L1ValidatorWeightMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructL1ValidatorWeightMessage( validationID, nonce, newValidatorWeight, - subnetAInfo, + l1AInfo, pChainInfo, signatureAggregator, network.GetNetworkID(), ) - // Deliver the Warp message to the subnet + // Deliver the Warp message to the L1 receipt = utils.CompleteDelegatorRegistration( ctx, fundedKey, delegationID, - subnetAInfo, + l1AInfo, stakingManagerAddress, registrationSignedMessage, ) @@ -195,7 +195,7 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { receipt := utils.InitializeEndDelegation( ctx, fundedKey, - subnetAInfo, + l1AInfo, stakingManagerAddress, delegationID, ) @@ -210,12 +210,12 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { aggregator := network.GetSignatureAggregator() defer aggregator.Shutdown() - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // Gather subnet-evm Warp signatures for the SetL1ValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) signedWarpMessage := utils.ConstructSignedWarpMessage( context.Background(), receipt, - subnetAInfo, + l1AInfo, pChainInfo, nil, aggregator, @@ -225,25 +225,25 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { // Issue a tx to update the validator's weight on the P-Chain network.GetPChainWallet().IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) utils.PChainProposerVMWorkaround(network.GetPChainWallet()) - utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) + utils.AdvanceProposerVM(ctx, l1AInfo, fundedKey, 5) - // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain - signedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + // Construct a L1ValidatorWeightMessage Warp message from the P-Chain + signedMessage := utils.ConstructL1ValidatorWeightMessage( validationID, nonce, nodes[0].Weight, - subnetAInfo, + l1AInfo, pChainInfo, signatureAggregator, network.GetNetworkID(), ) - // Deliver the Warp message to the subnet + // Deliver the Warp message to the L1 receipt = utils.CompleteEndDelegation( ctx, fundedKey, delegationID, - subnetAInfo, + l1AInfo, stakingManagerAddress, signedMessage, ) @@ -265,7 +265,7 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { ctx, signatureAggregator, fundedKey, - subnetAInfo, + l1AInfo, pChainInfo, posStakingManager, stakingManagerAddress, diff --git a/tests/flows/validator-manager/poa_to_pos.go b/tests/flows/validator-manager/poa_to_pos.go index 1d2d1cc14..4d7b228b9 100644 --- a/tests/flows/validator-manager/poa_to_pos.go +++ b/tests/flows/validator-manager/poa_to_pos.go @@ -39,14 +39,14 @@ import ( */ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, _ := network.GetTwoSubnets() + l1AInfo, _ := network.GetTwoL1s() _, fundedKey := network.GetFundedAccountInfo() pChainInfo := utils.GetPChainInfo(cChainInfo) signatureAggregator := utils.NewSignatureAggregator( cChainInfo.NodeURIs[0], []ids.ID{ - subnetAInfo.SubnetID, + l1AInfo.L1ID, }, ) @@ -61,7 +61,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { fundAmount.Mul(fundAmount, big.NewInt(10)) utils.SendNativeTransfer( ctx, - subnetAInfo, + l1AInfo, fundedKey, ownerAddress, fundAmount, @@ -70,14 +70,14 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { // Deploy PoAValidatorManager contract with a proxy nodes, initialValidationIDs, proxyAdmin := network.ConvertSubnet( ctx, - subnetAInfo, + l1AInfo, utils.PoAValidatorManager, []uint64{units.Schmeckle, 1000 * units.Schmeckle}, // Choose weights to avoid validator churn limits ownerKey, true, ) - proxyAddress := network.GetValidatorManager(subnetAInfo.SubnetID) - poaValidatorManager, err := poavalidatormanager.NewPoAValidatorManager(proxyAddress, subnetAInfo.RPCClient) + proxyAddress := network.GetValidatorManager(l1AInfo.L1ID) + poaValidatorManager, err := poavalidatormanager.NewPoAValidatorManager(proxyAddress, l1AInfo.RPCClient) Expect(err).Should(BeNil()) // @@ -88,7 +88,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { signatureAggregator, ownerKey, fundedKey, - subnetAInfo, + l1AInfo, pChainInfo, poaValidatorManager, proxyAddress, @@ -100,7 +100,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { ) // Try to call with invalid owner - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, l1AInfo.EVMChainID) Expect(err).Should(BeNil()) _, err = poaValidatorManager.InitializeValidatorRegistration( @@ -123,7 +123,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { signatureAggregator, ownerKey, fundedKey, - subnetAInfo, + l1AInfo, pChainInfo, poaValidatorManager, proxyAddress, @@ -146,30 +146,30 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { newImplAddress, _ := utils.DeployValidatorManager( ctx, fundedKey, - subnetAInfo, + l1AInfo, utils.NativeTokenStakingManager, ) // Upgrade the TransparentUpgradeableProxy contract to use the new logic contract - opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, subnetAInfo.EVMChainID) + opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) Expect(err).Should(BeNil()) tx, err := proxyAdmin.UpgradeAndCall(opts, proxyAddress, newImplAddress, []byte{}) Expect(err).Should(BeNil()) - utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) + utils.WaitForTransactionSuccess(ctx, l1AInfo, tx.Hash()) // Change the proxy contract type to NativeTokenStakingManager and initialize it nativeStakingManager, err := nativetokenstakingmanager.NewNativeTokenStakingManager( proxyAddress, - subnetAInfo.RPCClient, + l1AInfo.RPCClient, ) Expect(err).Should(BeNil()) - utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, proxyAddress) + utils.AddNativeMinterAdmin(ctx, l1AInfo, fundedKey, proxyAddress) rewardCalculatorAddress, _ := utils.DeployExampleRewardCalculator( ctx, fundedKey, - subnetAInfo, + l1AInfo, uint64(10), ) @@ -177,7 +177,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { opts, nativetokenstakingmanager.PoSValidatorManagerSettings{ BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ - SubnetID: subnetAInfo.SubnetID, + L1ID: l1AInfo.L1ID, ChurnPeriodSeconds: utils.DefaultChurnPeriodSeconds, MaximumChurnPercentage: utils.DefaultMaxChurnPercentage, }, @@ -188,11 +188,11 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { MaximumStakeMultiplier: utils.DefaultMaxStakeMultiplier, WeightToValueFactor: big.NewInt(0).SetUint64(utils.DefaultWeightToValueFactor), RewardCalculator: rewardCalculatorAddress, - UptimeBlockchainID: subnetAInfo.BlockchainID, + UptimeBlockchainID: l1AInfo.BlockchainID, }, ) Expect(err).Should(BeNil()) - utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) + utils.WaitForTransactionSuccess(context.Background(), l1AInfo, tx.Hash()) // Check that previous validator is still registered validationID, err := nativeStakingManager.RegisteredValidators(&bind.CallOpts{}, poaNodeID) @@ -202,13 +202,13 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { // // Remove the PoA validator and re-register as a PoS validator // - posStakingManager, err := iposvalidatormanager.NewIPoSValidatorManager(proxyAddress, subnetAInfo.RPCClient) + posStakingManager, err := iposvalidatormanager.NewIPoSValidatorManager(proxyAddress, l1AInfo.RPCClient) Expect(err).Should(BeNil()) utils.InitializeAndCompleteEndPoSValidation( ctx, signatureAggregator, ownerKey, - subnetAInfo, + l1AInfo, pChainInfo, posStakingManager, proxyAddress, @@ -227,7 +227,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { ctx, signatureAggregator, fundedKey, - subnetAInfo, + l1AInfo, pChainInfo, nativeStakingManager, proxyAddress, @@ -243,7 +243,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { ctx, signatureAggregator, fundedKey, - subnetAInfo, + l1AInfo, pChainInfo, posStakingManager, proxyAddress, diff --git a/tests/interfaces/subnet_test_info.go b/tests/interfaces/subnet_test_info.go index 73aa58d62..cac949ccc 100644 --- a/tests/interfaces/subnet_test_info.go +++ b/tests/interfaces/subnet_test_info.go @@ -7,9 +7,9 @@ import ( "github.com/ava-labs/subnet-evm/ethclient" ) -// Tracks information about a test subnet used for executing tests against. -type SubnetTestInfo struct { - SubnetID ids.ID +// Tracks information about a test L1 used for executing tests against. +type L1TestInfo struct { + L1ID ids.ID BlockchainID ids.ID NodeURIs []string WSClient ethclient.Client diff --git a/tests/network/network.go b/tests/network/network.go index d0c406c36..ccb95bccc 100644 --- a/tests/network/network.go +++ b/tests/network/network.go @@ -41,7 +41,7 @@ import ( type LocalNetwork struct { tmpnet.Network - extraNodes []*tmpnet.Node // to add as more subnet validators in the tests + extraNodes []*tmpnet.Node // to add as more L1 validators in the tests primaryNetworkValidators []*tmpnet.Node globalFundedKey *secp256k1.PrivateKey validatorManagers map[ids.ID]common.Address @@ -52,7 +52,7 @@ const ( timeout = 120 * time.Second ) -type SubnetSpec struct { +type L1Spec struct { Name string EVMChainID uint64 NodeCount int @@ -67,12 +67,12 @@ func NewLocalNetwork( ctx context.Context, name string, warpGenesisTemplateFile string, - subnetSpecs []SubnetSpec, + l1Specs []L1Spec, numPrimaryNetworkValidators int, - extraNodeCount int, // for use by tests, eg to add new subnet validators + extraNodeCount int, // for use by tests, eg to add new L1 validators ) *LocalNetwork { - // There must be at least one primary network validator per subnet - Expect(numPrimaryNetworkValidators).Should(BeNumerically(">=", len(subnetSpecs))) + // There must be at least one primary network validator per L1 + Expect(numPrimaryNetworkValidators).Should(BeNumerically(">=", len(l1Specs))) // Create extra nodes to be used to add more validators later extraNodes := subnetEvmTestUtils.NewTmpnetNodes(extraNodeCount) @@ -85,37 +85,37 @@ func NewLocalNetwork( globalFundedECDSAKey := globalFundedKey.ToECDSA() Expect(err).Should(BeNil()) - var subnets []*tmpnet.Subnet + var l1s []*tmpnet.Subnet bootstrapNodes := subnetEvmTestUtils.NewTmpnetNodes(numPrimaryNetworkValidators) - for i, subnetSpec := range subnetSpecs { - // Create a single bootstrap node. This will be removed from the subnet validator set after it is converted, + for i, l1Spec := range l1Specs { + // Create a single bootstrap node. This will be removed from the L1 validator set after it is converted, // but will remain a primary network validator - initialSubnetBootstrapper := bootstrapNodes[i] // One bootstrap node per subnet + initialL1Bootstrapper := bootstrapNodes[i] // One bootstrap node per L1 - // Create validators to specify as the initial vdr set in the subnet conversion, and store them as extra nodes - initialVdrNodes := subnetEvmTestUtils.NewTmpnetNodes(subnetSpec.NodeCount) + // Create validators to specify as the initial vdr set in the L1 conversion, and store them as extra nodes + initialVdrNodes := subnetEvmTestUtils.NewTmpnetNodes(l1Spec.NodeCount) extraNodes = append(extraNodes, initialVdrNodes...) - subnet := subnetEvmTestUtils.NewTmpnetSubnet( - subnetSpec.Name, + l1 := subnetEvmTestUtils.NewTmpnetSubnet( + l1Spec.Name, utils.InstantiateGenesisTemplate( warpGenesisTemplateFile, - subnetSpec.EVMChainID, - subnetSpec.TeleporterContractAddress, - subnetSpec.TeleporterDeployedBytecode, - subnetSpec.TeleporterDeployerAddress, + l1Spec.EVMChainID, + l1Spec.TeleporterContractAddress, + l1Spec.TeleporterDeployedBytecode, + l1Spec.TeleporterDeployerAddress, ), utils.WarpEnabledChainConfig, - initialSubnetBootstrapper, + initialL1Bootstrapper, ) - subnet.OwningKey = globalFundedKey - subnets = append(subnets, subnet) + l1.OwningKey = globalFundedKey + l1s = append(l1s, l1) } network := subnetEvmTestUtils.NewTmpnetNetwork( name, bootstrapNodes, utils.WarpEnabledChainConfig, - subnets..., + l1s..., ) Expect(network).ShouldNot(BeNil()) @@ -147,8 +147,8 @@ func NewLocalNetwork( goLog.Println("Network bootstrapped") // Issue transactions to activate the proposerVM fork on the chains - for _, subnet := range network.Subnets { - utils.SetupProposerVM(ctx, globalFundedECDSAKey, network, subnet.SubnetID) + for _, l1 := range network.Subnets { + utils.SetupProposerVM(ctx, globalFundedECDSAKey, network, l1.SubnetID) } // All nodes are specified as bootstrap validators @@ -168,26 +168,26 @@ func NewLocalNetwork( func (n *LocalNetwork) ConvertSubnet( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, managerType utils.ValidatorManagerConcreteType, weights []uint64, senderKey *ecdsa.PrivateKey, proxy bool, ) ([]utils.Node, []ids.ID, *proxyadmin.ProxyAdmin) { - goLog.Println("Converting subnet", subnet.SubnetID) + goLog.Println("Converting l1", l1.L1ID) cChainInfo := n.GetPrimaryNetworkInfo() pClient := platformvm.NewClient(cChainInfo.NodeURIs[0]) - currentValidators, err := pClient.GetCurrentValidators(ctx, subnet.SubnetID, nil) + currentValidators, err := pClient.GetCurrentValidators(ctx, l1.L1ID, nil) Expect(err).Should(BeNil()) vdrManagerAddress, proxyAdmin := utils.DeployAndInitializeValidatorManager( ctx, senderKey, - subnet, + l1, managerType, proxy, ) - n.validatorManagers[subnet.SubnetID] = vdrManagerAddress + n.validatorManagers[l1.L1ID] = vdrManagerAddress tmpnetNodes := n.GetExtraNodes(len(weights)) sort.Slice(tmpnetNodes, func(i, j int) bool { @@ -195,7 +195,7 @@ func (n *LocalNetwork) ConvertSubnet( }) var nodes []utils.Node - // Construct the convert subnet info + // Construct the converted l1 info destAddr, err := address.ParseToID(utils.DefaultPChainAddress) Expect(err).Should(BeNil()) vdrs := make([]*txs.ConvertSubnetToL1Validator, len(tmpnetNodes)) @@ -224,24 +224,24 @@ func (n *LocalNetwork) ConvertSubnet( } pChainWallet := n.GetPChainWallet() _, err = pChainWallet.IssueConvertSubnetToL1Tx( - subnet.SubnetID, - subnet.BlockchainID, + l1.L1ID, + l1.BlockchainID, vdrManagerAddress[:], vdrs, ) Expect(err).Should(BeNil()) - subnet = n.AddSubnetValidators(tmpnetNodes, subnet) + l1 = n.AddSubnetValidators(tmpnetNodes, l1) utils.PChainProposerVMWorkaround(pChainWallet) - utils.AdvanceProposerVM(ctx, subnet, senderKey, 5) + utils.AdvanceProposerVM(ctx, l1, senderKey, 5) aggregator := n.GetSignatureAggregator() defer aggregator.Shutdown() validationIDs := utils.InitializeValidatorSet( ctx, senderKey, - subnet, + l1, utils.GetPChainInfo(cChainInfo), vdrManagerAddress, n.GetNetworkID(), @@ -249,9 +249,9 @@ func (n *LocalNetwork) ConvertSubnet( nodes, ) - // Remove the bootstrap nodes as subnet validators + // Remove the bootstrap nodes as l1 validators for _, vdr := range currentValidators { - _, err := pChainWallet.IssueRemoveSubnetValidatorTx(vdr.NodeID, subnet.SubnetID) + _, err := pChainWallet.IssueRemoveSubnetValidatorTx(vdr.NodeID, l1.L1ID) Expect(err).Should(BeNil()) for _, node := range n.Network.Nodes { if node.NodeID == vdr.NodeID { @@ -261,25 +261,25 @@ func (n *LocalNetwork) ConvertSubnet( } } utils.PChainProposerVMWorkaround(pChainWallet) - utils.AdvanceProposerVM(ctx, subnet, senderKey, 5) + utils.AdvanceProposerVM(ctx, l1, senderKey, 5) return nodes, validationIDs, proxyAdmin } func (n *LocalNetwork) AddSubnetValidators( nodes []*tmpnet.Node, - subnet interfaces.SubnetTestInfo, -) interfaces.SubnetTestInfo { - // Modify the each node's config to track the subnet + l1 interfaces.L1TestInfo, +) interfaces.L1TestInfo { + // Modify the each node's config to track the l1 for _, node := range nodes { - goLog.Printf("Adding node %s @ %s to subnet %s", node.NodeID, node.URI, subnet.SubnetID) + goLog.Printf("Adding node %s @ %s to l1 %s", node.NodeID, node.URI, l1.L1ID) existingTrackedSubnets, err := node.Flags.GetStringVal(config.TrackSubnetsKey) Expect(err).Should(BeNil()) - if existingTrackedSubnets == subnet.SubnetID.String() { - goLog.Printf("Node %s @ %s already tracking subnet %s\n", node.NodeID, node.URI, subnet.SubnetID) + if existingTrackedSubnets == l1.L1ID.String() { + goLog.Printf("Node %s @ %s already tracking l1 %s\n", node.NodeID, node.URI, l1.L1ID) continue } - node.Flags[config.TrackSubnetsKey] = subnet.SubnetID.String() + node.Flags[config.TrackSubnetsKey] = l1.L1ID.String() // Add the node to the network n.Network.Nodes = append(n.Network.Nodes, node) @@ -289,29 +289,29 @@ func (n *LocalNetwork) AddSubnetValidators( // Update the tmpnet Subnet struct for _, tmpnetSubnet := range n.Network.Subnets { - if tmpnetSubnet.SubnetID == subnet.SubnetID { + if tmpnetSubnet.SubnetID == l1.L1ID { for _, tmpnetNode := range nodes { tmpnetSubnet.ValidatorIDs = append(tmpnetSubnet.ValidatorIDs, tmpnetNode.NodeID) } } } - // Refresh the subnet info after restarting the nodes - return n.GetSubnetInfo(subnet.SubnetID) + // Refresh the l1 info after restarting the nodes + return n.GetL1Info(l1.L1ID) } -func (n *LocalNetwork) GetValidatorManager(subnetID ids.ID) common.Address { - return n.validatorManagers[subnetID] +func (n *LocalNetwork) GetValidatorManager(l1ID ids.ID) common.Address { + return n.validatorManagers[l1ID] } func (n *LocalNetwork) GetSignatureAggregator() *aggregator.SignatureAggregator { - var subnetIDs []ids.ID - for _, subnet := range n.GetSubnetsInfo() { - subnetIDs = append(subnetIDs, subnet.SubnetID) + var l1IDs []ids.ID + for _, l1 := range n.GetL1Infos() { + l1IDs = append(l1IDs, l1.L1ID) } return utils.NewSignatureAggregator( n.GetPrimaryNetworkInfo().NodeURIs[0], - subnetIDs, + l1IDs, ) } @@ -329,7 +329,7 @@ func (n *LocalNetwork) GetPrimaryNetworkValidators() []*tmpnet.Node { return n.primaryNetworkValidators } -func (n *LocalNetwork) GetPrimaryNetworkInfo() interfaces.SubnetTestInfo { +func (n *LocalNetwork) GetPrimaryNetworkInfo() interfaces.L1TestInfo { var nodeURIs []string for _, node := range n.primaryNetworkValidators { nodeURIs = append(nodeURIs, node.URI) @@ -346,8 +346,8 @@ func (n *LocalNetwork) GetPrimaryNetworkInfo() interfaces.SubnetTestInfo { evmChainID, err := rpcClient.ChainID(context.Background()) Expect(err).Should(BeNil()) - return interfaces.SubnetTestInfo{ - SubnetID: ids.Empty, + return interfaces.L1TestInfo{ + L1ID: ids.Empty, BlockchainID: cChainBlockchainID, NodeURIs: nodeURIs, WSClient: wsClient, @@ -356,17 +356,17 @@ func (n *LocalNetwork) GetPrimaryNetworkInfo() interfaces.SubnetTestInfo { } } -func (n *LocalNetwork) GetSubnetInfo(subnetID ids.ID) interfaces.SubnetTestInfo { - for _, subnet := range n.Network.Subnets { - if subnet.SubnetID == subnetID { +func (n *LocalNetwork) GetL1Info(l1ID ids.ID) interfaces.L1TestInfo { + for _, l1 := range n.Network.Subnets { + if l1.SubnetID == l1ID { var nodeURIs []string - for _, nodeID := range subnet.ValidatorIDs { + for _, nodeID := range l1.ValidatorIDs { uri, err := n.Network.GetURIForNodeID(nodeID) Expect(err).Should(BeNil()) nodeURIs = append(nodeURIs, uri) } - blockchainID := subnet.Chains[0].ChainID + blockchainID := l1.Chains[0].ChainID wsClient, err := ethclient.Dial(utils.HttpToWebsocketURI(nodeURIs[0], blockchainID.String())) Expect(err).Should(BeNil()) @@ -374,8 +374,8 @@ func (n *LocalNetwork) GetSubnetInfo(subnetID ids.ID) interfaces.SubnetTestInfo Expect(err).Should(BeNil()) evmChainID, err := rpcClient.ChainID(context.Background()) Expect(err).Should(BeNil()) - return interfaces.SubnetTestInfo{ - SubnetID: subnetID, + return interfaces.L1TestInfo{ + L1ID: l1ID, BlockchainID: blockchainID, NodeURIs: nodeURIs, WSClient: wsClient, @@ -384,21 +384,21 @@ func (n *LocalNetwork) GetSubnetInfo(subnetID ids.ID) interfaces.SubnetTestInfo } } } - return interfaces.SubnetTestInfo{} + return interfaces.L1TestInfo{} } -// Returns all subnet info sorted in lexicographic order of SubnetName. -func (n *LocalNetwork) GetSubnetsInfo() []interfaces.SubnetTestInfo { - subnets := make([]interfaces.SubnetTestInfo, len(n.Network.Subnets)) - for i, subnet := range n.Network.Subnets { +// Returns all l1 info sorted in lexicographic order of L1Name. +func (n *LocalNetwork) GetL1Infos() []interfaces.L1TestInfo { + l1s := make([]interfaces.L1TestInfo, len(n.Network.Subnets)) + for i, l1 := range n.Network.Subnets { var nodeURIs []string - for _, nodeID := range subnet.ValidatorIDs { + for _, nodeID := range l1.ValidatorIDs { uri, err := n.Network.GetURIForNodeID(nodeID) Expect(err).Should(BeNil()) nodeURIs = append(nodeURIs, uri) } - blockchainID := subnet.Chains[0].ChainID + blockchainID := l1.Chains[0].ChainID wsClient, err := ethclient.Dial(utils.HttpToWebsocketURI(nodeURIs[0], blockchainID.String())) Expect(err).Should(BeNil()) @@ -406,8 +406,8 @@ func (n *LocalNetwork) GetSubnetsInfo() []interfaces.SubnetTestInfo { Expect(err).Should(BeNil()) evmChainID, err := rpcClient.ChainID(context.Background()) Expect(err).Should(BeNil()) - subnets[i] = interfaces.SubnetTestInfo{ - SubnetID: subnet.SubnetID, + l1s[i] = interfaces.L1TestInfo{ + L1ID: l1.SubnetID, BlockchainID: blockchainID, NodeURIs: nodeURIs, WSClient: wsClient, @@ -415,13 +415,13 @@ func (n *LocalNetwork) GetSubnetsInfo() []interfaces.SubnetTestInfo { EVMChainID: evmChainID, } } - return subnets + return l1s } -// Returns subnet info for all subnets, including the primary network -func (n *LocalNetwork) GetAllSubnetsInfo() []interfaces.SubnetTestInfo { - subnets := n.GetSubnetsInfo() - return append(subnets, n.GetPrimaryNetworkInfo()) +// Returns L1 info for all L1s, including the primary network +func (n *LocalNetwork) GetAllL1Infos() []interfaces.L1TestInfo { + l1s := n.GetL1Infos() + return append(l1s, n.GetPrimaryNetworkInfo()) } func (n *LocalNetwork) GetFundedAccountInfo() (common.Address, *ecdsa.PrivateKey) { @@ -453,8 +453,8 @@ func (n *LocalNetwork) SetChainConfigs(chainConfigs map[string]string) { continue } - for _, subnet := range n.Network.Subnets { - for _, chain := range subnet.Chains { + for _, l1 := range n.Network.Subnets { + for _, chain := range l1.Chains { if chain.ChainID.String() == chainIDStr { chain.Config = chainConfig } @@ -465,10 +465,11 @@ func (n *LocalNetwork) SetChainConfigs(chainConfigs map[string]string) { if err != nil { log.Error("failed to write network", "error", err) } - for _, subnet := range n.Network.Subnets { - err := subnet.Write(n.Network.GetSubnetDir(), n.Network.GetChainConfigDir()) + + for _, l1 := range n.Network.Subnets { + err := l1.Write(n.Network.GetSubnetDir(), n.Network.GetChainConfigDir()) if err != nil { - log.Error("failed to write subnets", "error", err) + log.Error("failed to write L1s", "error", err) } } @@ -490,25 +491,25 @@ func (n *LocalNetwork) Dir() string { func (n *LocalNetwork) GetPChainWallet() pwallet.Wallet { // Create the P-Chain wallet to issue transactions kc := secp256k1fx.NewKeychain(n.globalFundedKey) - var subnetIDs []ids.ID - for _, subnet := range n.GetSubnetsInfo() { - subnetIDs = append(subnetIDs, subnet.SubnetID) + var l1IDs []ids.ID + for _, l1 := range n.GetL1Infos() { + l1IDs = append(l1IDs, l1.L1ID) } wallet, err := primary.MakeWallet(context.Background(), &primary.WalletConfig{ URI: n.GetPrimaryNetworkInfo().NodeURIs[0], AVAXKeychain: kc, EthKeychain: kc, - SubnetIDs: subnetIDs, + SubnetIDs: l1IDs, }) Expect(err).Should(BeNil()) return wallet.P() } -func (n *LocalNetwork) GetTwoSubnets() ( - interfaces.SubnetTestInfo, - interfaces.SubnetTestInfo, +func (n *LocalNetwork) GetTwoL1s() ( + interfaces.L1TestInfo, + interfaces.L1TestInfo, ) { - subnets := n.GetSubnetsInfo() - Expect(len(subnets)).Should(BeNumerically(">=", 2)) - return subnets[0], subnets[1] + l1s := n.GetL1Infos() + Expect(len(l1s)).Should(BeNumerically(">=", 2)) + return l1s[0], l1s[1] } diff --git a/tests/suites/governance/governance_suite_test.go b/tests/suites/governance/governance_suite_test.go index 06a909d5e..d0c944dc8 100644 --- a/tests/suites/governance/governance_suite_test.go +++ b/tests/suites/governance/governance_suite_test.go @@ -40,7 +40,7 @@ var _ = ginkgo.BeforeSuite(func() { ctx, "governance-test-local-network", warpGenesisTemplateFile, - []localnetwork.SubnetSpec{ + []localnetwork.L1Spec{ { Name: "A", EVMChainID: 12345, diff --git a/tests/suites/ictt/ictt_suite_test.go b/tests/suites/ictt/ictt_suite_test.go index a21b6fc83..61ae87ca1 100644 --- a/tests/suites/ictt/ictt_suite_test.go +++ b/tests/suites/ictt/ictt_suite_test.go @@ -65,7 +65,7 @@ var _ = ginkgo.BeforeSuite(func() { ctx, "teleporter-test-local-network", warpGenesisTemplateFile, - []localnetwork.SubnetSpec{ + []localnetwork.L1Spec{ { Name: "A", EVMChainID: 12345, @@ -86,10 +86,10 @@ var _ = ginkgo.BeforeSuite(func() { 2, 2, ) - TeleporterInfo = utils.NewTeleporterTestInfo(LocalNetworkInstance.GetAllSubnetsInfo()) + TeleporterInfo = utils.NewTeleporterTestInfo(LocalNetworkInstance.GetAllL1Infos()) log.Info("Started local network") - // Only need to deploy Teleporter on the C-Chain since it is included in the genesis of the subnet chains. + // Only need to deploy Teleporter on the C-Chain since it is included in the genesis of the L1 chains. _, fundedKey := LocalNetworkInstance.GetFundedAccountInfo() TeleporterInfo.DeployTeleporterMessenger( ctx, @@ -99,10 +99,10 @@ var _ = ginkgo.BeforeSuite(func() { teleporterContractAddress, fundedKey, ) - for _, subnet := range LocalNetworkInstance.GetAllSubnetsInfo() { - TeleporterInfo.SetTeleporter(teleporterContractAddress, subnet) - TeleporterInfo.InitializeBlockchainID(subnet, fundedKey) - TeleporterInfo.DeployTeleporterRegistry(subnet, fundedKey) + for _, l1 := range LocalNetworkInstance.GetAllL1Infos() { + TeleporterInfo.SetTeleporter(teleporterContractAddress, l1) + TeleporterInfo.InitializeBlockchainID(l1, fundedKey) + TeleporterInfo.DeployTeleporterRegistry(l1, fundedKey) } }) @@ -114,7 +114,7 @@ var _ = ginkgo.AfterSuite(func() { var _ = ginkgo.Describe("[Validator manager integration tests]", func() { // ICTT tests - ginkgo.It("Transfer an ERC20 token between two Subnets", + ginkgo.It("Transfer an ERC20 token between two L1s", ginkgo.Label(icttLabel, erc20TokenHomeLabel, erc20TokenRemoteLabel), func() { icttFlows.ERC20TokenHomeERC20TokenRemote(LocalNetworkInstance, TeleporterInfo) diff --git a/tests/suites/teleporter/teleporter_suite_test.go b/tests/suites/teleporter/teleporter_suite_test.go index 52d6662b9..c0ac711ca 100644 --- a/tests/suites/teleporter/teleporter_suite_test.go +++ b/tests/suites/teleporter/teleporter_suite_test.go @@ -65,7 +65,7 @@ var _ = ginkgo.BeforeSuite(func() { ctx, "teleporter-test-local-network", warpGenesisTemplateFile, - []network.SubnetSpec{ + []network.L1Spec{ { Name: "A", EVMChainID: 12345, @@ -86,10 +86,10 @@ var _ = ginkgo.BeforeSuite(func() { 2, 2, ) - TeleporterInfo = utils.NewTeleporterTestInfo(LocalNetworkInstance.GetAllSubnetsInfo()) + TeleporterInfo = utils.NewTeleporterTestInfo(LocalNetworkInstance.GetAllL1Infos()) log.Info("Started local network") - // Only need to deploy Teleporter on the C-Chain since it is included in the genesis of the subnet chains. + // Only need to deploy Teleporter on the C-Chain since it is included in the genesis of the l1 chains. _, fundedKey := LocalNetworkInstance.GetFundedAccountInfo() TeleporterInfo.DeployTeleporterMessenger( ctx, @@ -100,13 +100,13 @@ var _ = ginkgo.BeforeSuite(func() { fundedKey, ) - for _, subnet := range LocalNetworkInstance.GetAllSubnetsInfo() { - TeleporterInfo.SetTeleporter(teleporterContractAddress, subnet) - TeleporterInfo.InitializeBlockchainID(subnet, fundedKey) - TeleporterInfo.DeployTeleporterRegistry(subnet, fundedKey) + for _, l1 := range LocalNetworkInstance.GetAllL1Infos() { + TeleporterInfo.SetTeleporter(teleporterContractAddress, l1) + TeleporterInfo.InitializeBlockchainID(l1, fundedKey) + TeleporterInfo.DeployTeleporterRegistry(l1, fundedKey) } - for _, subnet := range LocalNetworkInstance.GetSubnetsInfo() { + for _, subnet := range LocalNetworkInstance.GetL1Infos() { // Choose weights such that we can test validator churn LocalNetworkInstance.ConvertSubnet( ctx, @@ -114,7 +114,8 @@ var _ = ginkgo.BeforeSuite(func() { utils.PoAValidatorManager, []uint64{units.Schmeckle, units.Schmeckle, units.Schmeckle, units.Schmeckle, units.Schmeckle}, fundedKey, - false) + false, + ) } log.Info("Set up ginkgo before suite") @@ -127,7 +128,7 @@ var _ = ginkgo.AfterSuite(func() { var _ = ginkgo.Describe("[Teleporter integration tests]", func() { // Teleporter tests - ginkgo.It("Send a message from Subnet A to Subnet B, and one from B to A", + ginkgo.It("Send a message from L1 A to L1 B, and one from B to A", ginkgo.Label(teleporterMessengerLabel), func() { teleporterFlows.BasicSendReceive(LocalNetworkInstance, TeleporterInfo) diff --git a/tests/suites/validator-manager/validator_manager_suite_test.go b/tests/suites/validator-manager/validator_manager_suite_test.go index 65d6126f0..5013682f5 100644 --- a/tests/suites/validator-manager/validator_manager_suite_test.go +++ b/tests/suites/validator-manager/validator_manager_suite_test.go @@ -40,7 +40,7 @@ var _ = ginkgo.BeforeEach(func() { ctx, "validator-manager-test-local-network", warpGenesisTemplateFile, - []localnetwork.SubnetSpec{ + []localnetwork.L1Spec{ { Name: "A", EVMChainID: 12345, diff --git a/tests/utils/chain.go b/tests/utils/chain.go index a859939cb..a00e43725 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -125,16 +125,16 @@ func GetURIHostAndPort(uri string) (string, uint32, error) { func CreateNativeTransferTransaction( ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, fromKey *ecdsa.PrivateKey, recipient common.Address, amount *big.Int, ) *types.Transaction { fromAddress := crypto.PubkeyToAddress(fromKey.PublicKey) - gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnetInfo, fromAddress) + gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, l1Info, fromAddress) tx := types.NewTx(&types.DynamicFeeTx{ - ChainID: subnetInfo.EVMChainID, + ChainID: l1Info.EVMChainID, Nonce: nonce, To: &recipient, Gas: NativeTransferGas, @@ -143,91 +143,91 @@ func CreateNativeTransferTransaction( Value: amount, }) - return SignTransaction(tx, fromKey, subnetInfo.EVMChainID) + return SignTransaction(tx, fromKey, l1Info.EVMChainID) } func SendNativeTransfer( ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, fromKey *ecdsa.PrivateKey, recipient common.Address, amount *big.Int, ) *types.Receipt { - tx := CreateNativeTransferTransaction(ctx, subnetInfo, fromKey, recipient, amount) - return SendTransactionAndWaitForSuccess(ctx, subnetInfo, tx) + tx := CreateNativeTransferTransaction(ctx, l1Info, fromKey, recipient, amount) + return SendTransactionAndWaitForSuccess(ctx, l1Info, tx) } // Sends a tx, and waits for it to be mined. // Asserts Receipt.status equals success. func sendAndWaitForTransaction( ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, tx *types.Transaction, success bool, ) *types.Receipt { - err := subnetInfo.RPCClient.SendTransaction(ctx, tx) + err := l1Info.RPCClient.SendTransaction(ctx, tx) Expect(err).Should(BeNil()) - return waitForTransaction(ctx, subnetInfo, tx.Hash(), success) + return waitForTransaction(ctx, l1Info, tx.Hash(), success) } // Sends a tx, and waits for it to be mined. // Asserts Receipt.status equals false. func SendTransactionAndWaitForFailure( ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, tx *types.Transaction, ) *types.Receipt { - return sendAndWaitForTransaction(ctx, subnetInfo, tx, false) + return sendAndWaitForTransaction(ctx, l1Info, tx, false) } // Sends a tx, and waits for it to be mined. // Asserts Receipt.status equals true. func SendTransactionAndWaitForSuccess( ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, tx *types.Transaction, ) *types.Receipt { - return sendAndWaitForTransaction(ctx, subnetInfo, tx, true) + return sendAndWaitForTransaction(ctx, l1Info, tx, true) } // Waits for a transaction to be mined. // Asserts Receipt.status equals true. func WaitForTransactionSuccess( ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, txHash common.Hash, ) *types.Receipt { - return waitForTransaction(ctx, subnetInfo, txHash, true) + return waitForTransaction(ctx, l1Info, txHash, true) } // Waits for a transaction to be mined. // Asserts Receipt.status equals false. func WaitForTransactionFailure( ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, txHash common.Hash, ) *types.Receipt { - return waitForTransaction(ctx, subnetInfo, txHash, false) + return waitForTransaction(ctx, l1Info, txHash, false) } // Waits for a transaction to be mined. // Asserts Receipt.status equals success. func waitForTransaction( ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, txHash common.Hash, success bool, ) *types.Receipt { cctx, cancel := context.WithTimeout(ctx, 20*time.Second) defer cancel() - receipt, err := WaitMined(cctx, subnetInfo.RPCClient, txHash) + receipt, err := WaitMined(cctx, l1Info.RPCClient, txHash) Expect(err).Should(BeNil()) if success { if receipt.Status == types.ReceiptStatusFailed { - TraceTransactionAndExit(ctx, subnetInfo.RPCClient, receipt.TxHash) + TraceTransactionAndExit(ctx, l1Info.RPCClient, receipt.TxHash) } } else { Expect(receipt.Status).Should(Equal(types.ReceiptStatusFailed)) @@ -278,16 +278,16 @@ func SignTransaction(tx *types.Transaction, key *ecdsa.PrivateKey, chainID *big. // Returns the gasFeeCap, gasTipCap, and nonce the be used when constructing a transaction from fundedAddress func CalculateTxParams( ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, fundedAddress common.Address, ) (*big.Int, *big.Int, uint64) { - baseFee, err := subnetInfo.RPCClient.EstimateBaseFee(ctx) + baseFee, err := l1Info.RPCClient.EstimateBaseFee(ctx) Expect(err).Should(BeNil()) - gasTipCap, err := subnetInfo.RPCClient.SuggestGasTipCap(ctx) + gasTipCap, err := l1Info.RPCClient.SuggestGasTipCap(ctx) Expect(err).Should(BeNil()) - nonce, err := subnetInfo.RPCClient.NonceAt(ctx, fundedAddress, nil) + nonce, err := l1Info.RPCClient.NonceAt(ctx, fundedAddress, nil) Expect(err).Should(BeNil()) gasFeeCap := baseFee.Mul(baseFee, big.NewInt(gasUtils.BaseFeeFactor)) @@ -386,12 +386,12 @@ func waitForBlockHeight( func GetEventFromLogsOrTrace[T any]( ctx context.Context, receipt *types.Receipt, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, parser func(log types.Log) (T, error), ) T { log, err := GetEventFromLogs(receipt.Logs, parser) if err != nil { - TraceTransactionAndExit(ctx, subnetInfo.RPCClient, receipt.TxHash) + TraceTransactionAndExit(ctx, l1Info.RPCClient, receipt.TxHash) } return log } @@ -443,23 +443,23 @@ func BigIntMul(v1 *big.Int, v2 *big.Int) *big.Int { // Network utils // -func GetPChainInfo(cChainInfo interfaces.SubnetTestInfo) interfaces.SubnetTestInfo { +func GetPChainInfo(cChainInfo interfaces.L1TestInfo) interfaces.L1TestInfo { pChainBlockchainID, err := info.NewClient(cChainInfo.NodeURIs[0]).GetBlockchainID(context.Background(), "P") Expect(err).Should(BeNil()) - return interfaces.SubnetTestInfo{ + return interfaces.L1TestInfo{ BlockchainID: pChainBlockchainID, - SubnetID: ids.Empty, + L1ID: ids.Empty, } } type ChainConfigMap map[string]string -// Sets the chain config in customChainConfigs for the specified subnet -func (m ChainConfigMap) Add(subnet interfaces.SubnetTestInfo, chainConfig string) { - if subnet.SubnetID == constants.PrimaryNetworkID { +// Sets the chain config in customChainConfigs for the specified L! +func (m ChainConfigMap) Add(l1 interfaces.L1TestInfo, chainConfig string) { + if l1.L1ID == constants.PrimaryNetworkID { m[CChainPathSpecifier] = chainConfig } else { - m[subnet.BlockchainID.String()] = chainConfig + m[l1.BlockchainID.String()] = chainConfig } } @@ -525,23 +525,23 @@ func InstantiateGenesisTemplate( templateFileBytes, err := os.ReadFile(templateFileName) Expect(err).Should(BeNil()) - subnetGenesisFile, err := os.CreateTemp(os.TempDir(), "") + l1GenesisFile, err := os.CreateTemp(os.TempDir(), "") Expect(err).Should(BeNil()) - defer subnetGenesisFile.Close() + defer l1GenesisFile.Close() var replaced string = string(templateFileBytes[:]) for _, s := range substitutions { replaced = strings.ReplaceAll(replaced, s.Target, s.Value) } - subnetGenesisFile.WriteString(replaced) + l1GenesisFile.WriteString(replaced) - return subnetGenesisFile.Name() + return l1GenesisFile.Name() } // Aggregator utils -func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.SignatureAggregator { +func NewSignatureAggregator(apiUri string, l1IDs []ids.ID) *aggregator.SignatureAggregator { cfg := sigAggConfig.Config{ PChainAPI: &relayerConfig.APIConfig{ BaseURL: apiUri, @@ -550,8 +550,8 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu BaseURL: apiUri, }, } - trackedSubnets := set.NewSet[ids.ID](len(subnets)) - trackedSubnets.Add(subnets...) + trackedL1s := set.NewSet[ids.ID](len(l1IDs)) + trackedL1s.Add(l1IDs...) registry := prometheus.NewRegistry() messageCreator, err := message.NewCreator( logging.NoLog{}, @@ -564,7 +564,7 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu appRequestNetwork, err := peers.NewNetwork( logging.Error, registry, - trackedSubnets, + trackedL1s, nil, &cfg, ) @@ -590,18 +590,18 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu // Funded key must have admin access to set new admin. func AddNativeMinterAdmin( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, fundedKey *ecdsa.PrivateKey, address common.Address, ) { - nativeMinterPrecompile, err := nativeMinter.NewINativeMinter(nativeminter.ContractAddress, subnet.RPCClient) + nativeMinterPrecompile, err := nativeMinter.NewINativeMinter(nativeminter.ContractAddress, l1.RPCClient) Expect(err).Should(BeNil()) - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := nativeMinterPrecompile.SetAdmin(opts, address) Expect(err).Should(BeNil()) - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) } // Blocks until all validators specified in nodeURIs have reached the specified block height @@ -630,7 +630,7 @@ func WaitForAllValidatorsToAcceptBlock(ctx context.Context, nodeURIs []string, b func ExtractWarpMessageFromLog( ctx context.Context, sourceReceipt *types.Receipt, - source interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, ) *avalancheWarp.UnsignedMessage { log.Info("Fetching relevant warp logs from the newly produced block") logs, err := source.RPCClient.FilterLogs(ctx, subnetEvmInterfaces.FilterQuery{ @@ -652,8 +652,8 @@ func ExtractWarpMessageFromLog( func ConstructSignedWarpMessage( ctx context.Context, sourceReceipt *types.Receipt, - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, + destination interfaces.L1TestInfo, justification []byte, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { @@ -670,21 +670,21 @@ func ConstructSignedWarpMessage( } func GetSignedMessage( - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, + destination interfaces.L1TestInfo, unsignedWarpMessage *avalancheWarp.UnsignedMessage, justification []byte, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { - signingSubnetID := source.SubnetID - if source.SubnetID == constants.PrimaryNetworkID { - signingSubnetID = destination.SubnetID + signingL1ID := source.L1ID + if source.L1ID == constants.PrimaryNetworkID { + signingL1ID = destination.L1ID } signedWarpMessage, err := signatureAggregator.CreateSignedMessage( unsignedWarpMessage, justification, - signingSubnetID, + signingL1ID, warp.WarpDefaultQuorumNumerator, ) Expect(err).Should(BeNil()) @@ -692,15 +692,15 @@ func GetSignedMessage( return signedWarpMessage } -func SetupProposerVM(ctx context.Context, fundedKey *ecdsa.PrivateKey, network *tmpnet.Network, subnetID ids.ID) { - subnetDetails := network.Subnets[slices.IndexFunc( +func SetupProposerVM(ctx context.Context, fundedKey *ecdsa.PrivateKey, network *tmpnet.Network, L1ID ids.ID) { + l1Details := network.Subnets[slices.IndexFunc( network.Subnets, - func(s *tmpnet.Subnet) bool { return s.SubnetID == subnetID }, + func(s *tmpnet.Subnet) bool { return s.SubnetID == L1ID }, )] - chainID := subnetDetails.Chains[0].ChainID + chainID := l1Details.Chains[0].ChainID - nodeURI, err := network.GetURIForNodeID(subnetDetails.ValidatorIDs[0]) + nodeURI, err := network.GetURIForNodeID(l1Details.ValidatorIDs[0]) Expect(err).Should(BeNil()) uri := HttpToWebsocketURI(nodeURI, chainID.String()) diff --git a/tests/utils/erc20.go b/tests/utils/erc20.go index b235dbf6d..cf82a7c8b 100644 --- a/tests/utils/erc20.go +++ b/tests/utils/erc20.go @@ -21,7 +21,7 @@ var ( func DeployExampleERC20( ctx context.Context, senderKey *ecdsa.PrivateKey, - source interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, ) (common.Address, *exampleerc20.ExampleERC20) { opts, err := bind.NewKeyedTransactorWithChainID(senderKey, source.EVMChainID) Expect(err).Should(BeNil()) @@ -48,7 +48,7 @@ func ERC20Approve( token *exampleerc20.ExampleERC20, spender common.Address, amount *big.Int, - source interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, senderKey *ecdsa.PrivateKey, ) { opts, err := bind.NewKeyedTransactorWithChainID(senderKey, source.EVMChainID) diff --git a/tests/utils/governance.go b/tests/utils/governance.go index 8bf3ceaa5..0e9b84db4 100644 --- a/tests/utils/governance.go +++ b/tests/utils/governance.go @@ -19,30 +19,30 @@ import ( func DeployValidatorSetSig( ctx context.Context, senderKey *ecdsa.PrivateKey, - contractSubnet interfaces.SubnetTestInfo, - validatorSubnet interfaces.SubnetTestInfo, + contractL1 interfaces.L1TestInfo, + validatorL1 interfaces.L1TestInfo, ) (common.Address, *validatorsetsig.ValidatorSetSig) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, contractSubnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, contractL1.EVMChainID) Expect(err).Should(BeNil()) address, tx, validatorSetSig, err := validatorsetsig.DeployValidatorSetSig( opts, - contractSubnet.RPCClient, - validatorSubnet.BlockchainID, + contractL1.RPCClient, + validatorL1.BlockchainID, ) Expect(err).Should(BeNil()) // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, contractSubnet, tx.Hash()) + WaitForTransactionSuccess(ctx, contractL1, tx.Hash()) return address, validatorSetSig } // Returns Receipt for the transaction unlike TeleporterRegistry version since this is a non-teleporter case -// and we don't want to add the ValidatorSetSig ABI to the subnetInfo +// and we don't want to add the ValidatorSetSig ABI to the L1Info func ExecuteValidatorSetSigCallAndVerify( ctx context.Context, - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, + destination interfaces.L1TestInfo, validatorSetSigAddress common.Address, senderKey *ecdsa.PrivateKey, unsignedMessage *avalancheWarp.UnsignedMessage, @@ -69,17 +69,17 @@ func ExecuteValidatorSetSigCallAndVerify( func InitOffChainMessageChainConfigValidatorSetSig( networkID uint32, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, validatorSetSigAddress common.Address, validatorSetSigMessages []validatorsetsig.ValidatorSetSigMessage, ) ([]avalancheWarp.UnsignedMessage, string) { unsignedMessages := []avalancheWarp.UnsignedMessage{} for _, message := range validatorSetSigMessages { - unsignedMessage := CreateOffChainValidatorSetSigMessage(networkID, subnet, message) + unsignedMessage := CreateOffChainValidatorSetSigMessage(networkID, l1, message) unsignedMessages = append(unsignedMessages, *unsignedMessage) log.Info("Adding validatorSetSig off-chain message to Warp chain config", "messageID", unsignedMessage.ID(), - "blockchainID", subnet.BlockchainID.String()) + "blockchainID", l1.BlockchainID.String()) } return unsignedMessages, GetChainConfigWithOffChainMessages(unsignedMessages) } @@ -88,7 +88,7 @@ func InitOffChainMessageChainConfigValidatorSetSig( // if the validator set signs this message func CreateOffChainValidatorSetSigMessage( networkID uint32, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, message validatorsetsig.ValidatorSetSigMessage, ) *avalancheWarp.UnsignedMessage { sourceAddress := []byte{} @@ -100,7 +100,7 @@ func CreateOffChainValidatorSetSigMessage( unsignedMessage, err := avalancheWarp.NewUnsignedMessage( networkID, - subnet.BlockchainID, + l1.BlockchainID, addressedPayload.Bytes(), ) Expect(err).Should(BeNil()) diff --git a/tests/utils/ictt.go b/tests/utils/ictt.go index 956c48b3b..946f73d66 100644 --- a/tests/utils/ictt.go +++ b/tests/utils/ictt.go @@ -73,27 +73,27 @@ func DeployERC20TokenHome( ctx context.Context, teleporter TeleporterTestInfo, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, teleporterManager common.Address, tokenAddress common.Address, tokenHomeDecimals uint8, ) (common.Address, *erc20tokenhome.ERC20TokenHome) { opts, err := bind.NewKeyedTransactorWithChainID( senderKey, - subnet.EVMChainID, + l1.EVMChainID, ) Expect(err).Should(BeNil()) implAddress, tx, erc20TokenHome, err := erc20tokenhome.DeployERC20TokenHome( opts, - subnet.RPCClient, - teleporter.TeleporterRegistryAddress(subnet), + l1.RPCClient, + teleporter.TeleporterRegistryAddress(l1), teleporterManager, - teleporter.GetLatestTeleporterVersion(subnet), + teleporter.GetLatestTeleporterVersion(l1), tokenAddress, tokenHomeDecimals, ) Expect(err).Should(BeNil()) - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) return implAddress, erc20TokenHome } @@ -102,7 +102,7 @@ func DeployERC20TokenRemote( ctx context.Context, teleporter TeleporterTestInfo, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, teleporterManager common.Address, tokenHomeBlockchainID ids.ID, tokenHomeAddress common.Address, @@ -113,16 +113,16 @@ func DeployERC20TokenRemote( ) (common.Address, *erc20tokenremote.ERC20TokenRemote) { opts, err := bind.NewKeyedTransactorWithChainID( senderKey, - subnet.EVMChainID, + l1.EVMChainID, ) Expect(err).Should(BeNil()) implAddress, tx, erc20TokenRemote, err := erc20tokenremote.DeployERC20TokenRemote( opts, - subnet.RPCClient, + l1.RPCClient, erc20tokenremote.TokenRemoteSettings{ - TeleporterRegistryAddress: teleporter.TeleporterRegistryAddress(subnet), + TeleporterRegistryAddress: teleporter.TeleporterRegistryAddress(l1), TeleporterManager: teleporterManager, - MinTeleporterVersion: teleporter.GetLatestTeleporterVersion(subnet), + MinTeleporterVersion: teleporter.GetLatestTeleporterVersion(l1), TokenHomeBlockchainID: tokenHomeBlockchainID, TokenHomeAddress: tokenHomeAddress, TokenHomeDecimals: tokenHomeDecimals, @@ -133,7 +133,7 @@ func DeployERC20TokenRemote( ) Expect(err).Should(BeNil()) - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) return implAddress, erc20TokenRemote } @@ -141,7 +141,7 @@ func DeployERC20TokenRemote( func DeployNativeTokenRemote( ctx context.Context, teleporter TeleporterTestInfo, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, symbol string, teleporterManager common.Address, tokenHomeBlockchainID ids.ID, @@ -159,17 +159,17 @@ func DeployNativeTokenRemote( opts, err := bind.NewKeyedTransactorWithChainID( deployerPK, - subnet.EVMChainID, + l1.EVMChainID, ) Expect(err).Should(BeNil()) implAddress, tx, nativeTokenRemote, err := nativetokenremote.DeployNativeTokenRemote( opts, - subnet.RPCClient, + l1.RPCClient, nativetokenremote.TokenRemoteSettings{ - TeleporterRegistryAddress: teleporter.TeleporterRegistryAddress(subnet), + TeleporterRegistryAddress: teleporter.TeleporterRegistryAddress(l1), TeleporterManager: teleporterManager, - MinTeleporterVersion: teleporter.GetLatestTeleporterVersion(subnet), + MinTeleporterVersion: teleporter.GetLatestTeleporterVersion(l1), TokenHomeBlockchainID: tokenHomeBlockchainID, TokenHomeAddress: tokenHomeAddress, TokenHomeDecimals: tokenHomeDecimals, @@ -179,7 +179,7 @@ func DeployNativeTokenRemote( burnedFeesReportingRewardPercentage, ) Expect(err).Should(BeNil()) - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) // Increment to the next deployer key so that the next contract deployment succeeds nativeTokenRemoteDeployerKeyIndex++ @@ -191,25 +191,25 @@ func DeployNativeTokenHome( ctx context.Context, teleporter TeleporterTestInfo, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, teleporterManager common.Address, tokenAddress common.Address, ) (common.Address, *nativetokenhome.NativeTokenHome) { opts, err := bind.NewKeyedTransactorWithChainID( senderKey, - subnet.EVMChainID, + l1.EVMChainID, ) Expect(err).Should(BeNil()) implAddress, tx, nativeTokenHome, err := nativetokenhome.DeployNativeTokenHome( opts, - subnet.RPCClient, - teleporter.TeleporterRegistryAddress(subnet), + l1.RPCClient, + teleporter.TeleporterRegistryAddress(l1), teleporterManager, - teleporter.GetLatestTeleporterVersion(subnet), + teleporter.GetLatestTeleporterVersion(l1), tokenAddress, ) Expect(err).Should(BeNil()) - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) return implAddress, nativeTokenHome } @@ -217,21 +217,21 @@ func DeployNativeTokenHome( func DeployWrappedNativeToken( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, tokenSymbol string, ) (common.Address, *wrappednativetoken.WrappedNativeToken) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) // Deploy mock WAVAX contract address, tx, token, err := wrappednativetoken.DeployWrappedNativeToken( opts, - subnet.RPCClient, + l1.RPCClient, tokenSymbol, ) Expect(err).Should(BeNil()) // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) return address, token } @@ -239,18 +239,18 @@ func DeployWrappedNativeToken( func DeployMockNativeSendAndCallReceiver( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, ) (common.Address, *mockNSACR.MockNativeSendAndCallReceiver) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) // Deploy MockNativeSendAndCallReceiver contract - address, tx, contract, err := mockNSACR.DeployMockNativeSendAndCallReceiver(opts, subnet.RPCClient) + address, tx, contract, err := mockNSACR.DeployMockNativeSendAndCallReceiver(opts, l1.RPCClient) Expect(err).Should(BeNil()) log.Info("Deployed MockNativeSendAndCallReceiver contract", "address", address.Hex(), "txHash", tx.Hash().Hex()) // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) return address, contract } @@ -258,18 +258,18 @@ func DeployMockNativeSendAndCallReceiver( func DeployMockERC20SendAndCallReceiver( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, ) (common.Address, *mockERC20SACR.MockERC20SendAndCallReceiver) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) // Deploy MockERC20SendAndCallReceiver contract - address, tx, contract, err := mockERC20SACR.DeployMockERC20SendAndCallReceiver(opts, subnet.RPCClient) + address, tx, contract, err := mockERC20SACR.DeployMockERC20SendAndCallReceiver(opts, l1.RPCClient) Expect(err).Should(BeNil()) log.Info("Deployed MockERC20SendAndCallReceiver contract", "address", address.Hex(), "txHash", tx.Hash().Hex()) // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) return address, contract } @@ -277,19 +277,19 @@ func DeployMockERC20SendAndCallReceiver( func DeployExampleERC20Decimals( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, tokenDecimals uint8, ) (common.Address, *exampleerc20.ExampleERC20Decimals) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) // Deploy Mock ERC20 contract - address, tx, token, err := exampleerc20.DeployExampleERC20Decimals(opts, subnet.RPCClient, tokenDecimals) + address, tx, token, err := exampleerc20.DeployExampleERC20Decimals(opts, l1.RPCClient, tokenDecimals) Expect(err).Should(BeNil()) log.Info("Deployed Mock ERC20 contract", "address", address.Hex(), "txHash", tx.Hash().Hex()) // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) // Check that the deployer has the expected initial balance senderAddress := crypto.PubkeyToAddress(senderKey.PublicKey) @@ -303,9 +303,9 @@ func DeployExampleERC20Decimals( func RegisterERC20TokenRemoteOnHome( ctx context.Context, teleporter TeleporterTestInfo, - homeSubnet interfaces.SubnetTestInfo, + homeL1 interfaces.L1TestInfo, homeAddress common.Address, - remoteSubnet interfaces.SubnetTestInfo, + remoteL1 interfaces.L1TestInfo, remoteAddress common.Address, fundedKey *ecdsa.PrivateKey, signatureAggregator *aggregator.SignatureAggregator, @@ -313,9 +313,9 @@ func RegisterERC20TokenRemoteOnHome( RegisterTokenRemoteOnHome( ctx, teleporter, - homeSubnet, + homeL1, homeAddress, - remoteSubnet, + remoteL1, remoteAddress, big.NewInt(0), big.NewInt(1), @@ -328,9 +328,9 @@ func RegisterERC20TokenRemoteOnHome( func RegisterTokenRemoteOnHome( ctx context.Context, teleporter TeleporterTestInfo, - homeSubnet interfaces.SubnetTestInfo, + homeL1 interfaces.L1TestInfo, homeAddress common.Address, - remoteSubnet interfaces.SubnetTestInfo, + remoteL1 interfaces.L1TestInfo, remoteAddress common.Address, expectedInitialReserveBalance *big.Int, expectedTokenMultiplier *big.Int, @@ -341,7 +341,7 @@ func RegisterTokenRemoteOnHome( // Call the remote to send a register message to the home tokenRemote, err := tokenremote.NewTokenRemote( remoteAddress, - remoteSubnet.RPCClient, + remoteL1.RPCClient, ) Expect(err).Should(BeNil()) @@ -349,7 +349,7 @@ func RegisterTokenRemoteOnHome( feeTokenAddress, feeToken := DeployExampleERC20Decimals( ctx, fundedKey, - remoteSubnet, + remoteL1, 18, ) @@ -360,11 +360,11 @@ func RegisterTokenRemoteOnHome( feeToken, remoteAddress, feeAmount, - remoteSubnet, + remoteL1, fundedKey, ) - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, remoteSubnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, remoteL1.EVMChainID) Expect(err).Should(BeNil()) sendRegisterTx, err := tokenRemote.RegisterWithHome( @@ -375,14 +375,14 @@ func RegisterTokenRemoteOnHome( }, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, remoteSubnet, sendRegisterTx.Hash()) + receipt := WaitForTransactionSuccess(ctx, remoteL1, sendRegisterTx.Hash()) // Relay the register message to the home receipt = teleporter.RelayTeleporterMessage( ctx, receipt, - remoteSubnet, - homeSubnet, + remoteL1, + homeL1, true, fundedKey, nil, @@ -390,18 +390,18 @@ func RegisterTokenRemoteOnHome( ) _, err = GetEventFromLogs( receipt.Logs, - teleporter.TeleporterMessenger(homeSubnet).ParseMessageExecuted, + teleporter.TeleporterMessenger(homeL1).ParseMessageExecuted, ) if err != nil { - TraceTransactionAndExit(ctx, homeSubnet.RPCClient, receipt.TxHash) + TraceTransactionAndExit(ctx, homeL1.RPCClient, receipt.TxHash) } // Check that the remote registered event was emitted - tokenHome, err := tokenhome.NewTokenHome(homeAddress, homeSubnet.RPCClient) + tokenHome, err := tokenhome.NewTokenHome(homeAddress, homeL1.RPCClient) Expect(err).Should(BeNil()) registerEvent, err := GetEventFromLogs(receipt.Logs, tokenHome.ParseRemoteRegistered) Expect(err).Should(BeNil()) - Expect(registerEvent.RemoteBlockchainID[:]).Should(Equal(remoteSubnet.BlockchainID[:])) + Expect(registerEvent.RemoteBlockchainID[:]).Should(Equal(remoteL1.BlockchainID[:])) Expect(registerEvent.RemoteTokenTransferrerAddress).Should(Equal(remoteAddress)) // Based on the initial reserve balance of the TokenRemote instance, @@ -421,7 +421,7 @@ func RegisterTokenRemoteOnHome( // is returned to the caller. func AddCollateralToERC20TokenHome( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, erc20TokenHome *erc20tokenhome.ERC20TokenHome, erc20TokenHomeAddress common.Address, exampleERC20 *exampleerc20.ExampleERC20Decimals, @@ -436,12 +436,12 @@ func AddCollateralToERC20TokenHome( exampleERC20, erc20TokenHomeAddress, collateralAmount, - subnet, + l1, senderKey, ) // Add collateral to the ERC20TokenHome - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := erc20TokenHome.AddCollateral( opts, @@ -450,7 +450,7 @@ func AddCollateralToERC20TokenHome( collateralAmount, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) event, err := GetEventFromLogs(receipt.Logs, erc20TokenHome.ParseCollateralAdded) Expect(err).Should(BeNil()) Expect(event.RemoteBlockchainID[:]).Should(Equal(remoteBlockchainID[:])) @@ -473,7 +473,7 @@ func AddCollateralToERC20TokenHome( // is returned to the caller. func AddCollateralToNativeTokenHome( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, nativeTokenHome *nativetokenhome.NativeTokenHome, nativeTokenHomeAddress common.Address, remoteBlockchainID ids.ID, @@ -482,7 +482,7 @@ func AddCollateralToNativeTokenHome( senderKey *ecdsa.PrivateKey, ) { // Add collateral to the ERC20TokenHome - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) opts.Value = collateralAmount @@ -492,7 +492,7 @@ func AddCollateralToNativeTokenHome( remoteAddress, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) event, err := GetEventFromLogs(receipt.Logs, nativeTokenHome.ParseCollateralAdded) Expect(err).Should(BeNil()) Expect(event.RemoteBlockchainID[:]).Should(Equal(remoteBlockchainID[:])) @@ -511,7 +511,7 @@ func AddCollateralToNativeTokenHome( func SendERC20TokenHome( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, erc20TokenHome *erc20tokenhome.ERC20TokenHome, erc20TokenHomeAddress common.Address, token *exampleerc20.ExampleERC20Decimals, @@ -525,12 +525,12 @@ func SendERC20TokenHome( token, erc20TokenHomeAddress, big.NewInt(0).Add(amount, input.PrimaryFee), - subnet, + l1, senderKey, ) // Send the tokens and verify expected events - optsA, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + optsA, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := erc20TokenHome.Send( optsA, @@ -539,7 +539,7 @@ func SendERC20TokenHome( ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) event, err := GetEventFromLogs(receipt.Logs, erc20TokenHome.ParseTokensSent) Expect(err).Should(BeNil()) Expect(event.Sender).Should(Equal(crypto.PubkeyToAddress(senderKey.PublicKey))) @@ -558,7 +558,7 @@ func SendERC20TokenHome( func SendNativeTokenHome( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, nativeTokenHome *nativetokenhome.NativeTokenHome, nativeTokenHomeAddress common.Address, wrappedToken *wrappednativetoken.WrappedNativeToken, @@ -568,14 +568,14 @@ func SendNativeTokenHome( ) (*types.Receipt, *big.Int) { DepositAndApproveWrappedTokenForFees( ctx, - subnet, + l1, wrappedToken, input.PrimaryFee, nativeTokenHomeAddress, senderKey, ) - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) opts.Value = amount @@ -585,7 +585,7 @@ func SendNativeTokenHome( ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) event, err := GetEventFromLogs(receipt.Logs, nativeTokenHome.ParseTokensSent) Expect(err).Should(BeNil()) Expect(event.Sender).Should(Equal(crypto.PubkeyToAddress(senderKey.PublicKey))) @@ -604,7 +604,7 @@ func SendNativeTokenHome( func SendNativeTokenRemote( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, nativeTokenRemote *nativetokenremote.NativeTokenRemote, nativeTokenRemoteAddress common.Address, input nativetokenremote.SendTokensInput, @@ -613,14 +613,14 @@ func SendNativeTokenRemote( ) (*types.Receipt, *big.Int) { DepositAndApproveWrappedTokenForFees( ctx, - subnet, + l1, nativeTokenRemote, input.PrimaryFee, nativeTokenRemoteAddress, senderKey, ) - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) opts.Value = amount @@ -630,7 +630,7 @@ func SendNativeTokenRemote( ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) event, err := GetEventFromLogs(receipt.Logs, nativeTokenRemote.ParseTokensSent) Expect(err).Should(BeNil()) Expect(event.Sender).Should(Equal(crypto.PubkeyToAddress(senderKey.PublicKey))) @@ -641,14 +641,14 @@ func SendNativeTokenRemote( func SendERC20TokenRemote( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, erc20TokenRemote *erc20tokenremote.ERC20TokenRemote, erc20TokenRemoteAddress common.Address, input erc20tokenremote.SendTokensInput, amount *big.Int, senderKey *ecdsa.PrivateKey, ) (*types.Receipt, *big.Int) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := erc20TokenRemote.Approve( opts, @@ -657,9 +657,9 @@ func SendERC20TokenRemote( ) Expect(err).Should(BeNil()) - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) - // Transfer the tokens back to subnet A + // Transfer the tokens back to l1 A tx, err = erc20TokenRemote.Send( opts, input, @@ -667,7 +667,7 @@ func SendERC20TokenRemote( ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) event, err := GetEventFromLogs(receipt.Logs, erc20TokenRemote.ParseTokensSent) Expect(err).Should(BeNil()) Expect(event.Sender).Should(Equal(crypto.PubkeyToAddress(senderKey.PublicKey))) @@ -678,7 +678,7 @@ func SendERC20TokenRemote( func SendAndCallERC20TokenHome( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, erc20TokenHome *erc20tokenhome.ERC20TokenHome, erc20TokenHomeAddress common.Address, exampleToken *exampleerc20.ExampleERC20Decimals, @@ -692,12 +692,12 @@ func SendAndCallERC20TokenHome( exampleToken, erc20TokenHomeAddress, big.NewInt(0).Add(amount, input.PrimaryFee), - subnet, + l1, senderKey, ) // Send the tokens and verify expected events - optsA, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + optsA, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := erc20TokenHome.SendAndCall( optsA, @@ -706,7 +706,7 @@ func SendAndCallERC20TokenHome( ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) event, err := GetEventFromLogs(receipt.Logs, erc20TokenHome.ParseTokensAndCallSent) Expect(err).Should(BeNil()) Expect(event.Input.RecipientContract).Should(Equal(input.RecipientContract)) @@ -725,13 +725,13 @@ func SendAndCallERC20TokenHome( func SendAndCallNativeTokenHome( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, nativeTokenHome *nativetokenhome.NativeTokenHome, input nativetokenhome.SendAndCallInput, amount *big.Int, senderKey *ecdsa.PrivateKey, ) (*types.Receipt, *big.Int) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) opts.Value = amount @@ -741,7 +741,7 @@ func SendAndCallNativeTokenHome( ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) event, err := GetEventFromLogs(receipt.Logs, nativeTokenHome.ParseTokensAndCallSent) Expect(err).Should(BeNil()) Expect(event.Input.RecipientContract).Should(Equal(input.RecipientContract)) @@ -765,7 +765,7 @@ func SendAndCallNativeTokenHome( func SendAndCallNativeTokenRemote( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, nativeTokenRemote *nativetokenremote.NativeTokenRemote, input nativetokenremote.SendAndCallInput, amount *big.Int, @@ -773,7 +773,7 @@ func SendAndCallNativeTokenRemote( tokenMultiplier *big.Int, multiplyOnRemote bool, ) (*types.Receipt, *big.Int) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) opts.Value = amount @@ -785,7 +785,7 @@ func SendAndCallNativeTokenRemote( transferredAmount := big.NewInt(0).Sub(amount, input.PrimaryFee) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) event, err := GetEventFromLogs(receipt.Logs, nativeTokenRemote.ParseTokensAndCallSent) Expect(err).Should(BeNil()) Expect(event.Input.RecipientContract).Should(Equal(input.RecipientContract)) @@ -796,14 +796,14 @@ func SendAndCallNativeTokenRemote( func SendAndCallERC20TokenRemote( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, erc20TokenRemote *erc20tokenremote.ERC20TokenRemote, erc20TokenRemoteAddress common.Address, input erc20tokenremote.SendAndCallInput, amount *big.Int, senderKey *ecdsa.PrivateKey, ) (*types.Receipt, *big.Int) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := erc20TokenRemote.Approve( opts, @@ -812,9 +812,9 @@ func SendAndCallERC20TokenRemote( ) Expect(err).Should(BeNil()) - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) - // Transfer the tokens back to subnet A + // Transfer the tokens back to l1 A tx, err = erc20TokenRemote.SendAndCall( opts, input, @@ -822,7 +822,7 @@ func SendAndCallERC20TokenRemote( ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) event, err := GetEventFromLogs(receipt.Logs, erc20TokenRemote.ParseTokensAndCallSent) Expect(err).Should(BeNil()) Expect(event.Input.RecipientContract).Should(Equal(input.RecipientContract)) @@ -840,19 +840,19 @@ func SendNativeMultiHopAndVerify( teleporter TeleporterTestInfo, sendingKey *ecdsa.PrivateKey, recipientAddress common.Address, - fromSubnet interfaces.SubnetTestInfo, + fromL1 interfaces.L1TestInfo, fromTokenTransferrer *nativetokenremote.NativeTokenRemote, fromTokenTransferrerAddress common.Address, - toSubnet interfaces.SubnetTestInfo, + toL1 interfaces.L1TestInfo, toTokenTransferrer *nativetokenremote.NativeTokenRemote, toTokenTransferrerAddress common.Address, - cChainInfo interfaces.SubnetTestInfo, + cChainInfo interfaces.L1TestInfo, amount *big.Int, secondaryFeeAmount *big.Int, signatureAggregator *aggregator.SignatureAggregator, ) { input := nativetokenremote.SendTokensInput{ - DestinationBlockchainID: toSubnet.BlockchainID, + DestinationBlockchainID: toL1.BlockchainID, DestinationTokenTransferrerAddress: toTokenTransferrerAddress, Recipient: recipientAddress, PrimaryFeeTokenAddress: fromTokenTransferrerAddress, @@ -865,7 +865,7 @@ func SendNativeMultiHopAndVerify( // Send tokens through a multi-hop transfer originReceipt, amount := SendNativeTokenRemote( ctx, - fromSubnet, + fromL1, fromTokenTransferrer, fromTokenTransferrerAddress, input, @@ -878,7 +878,7 @@ func SendNativeMultiHopAndVerify( intermediateReceipt := teleporter.RelayTeleporterMessage( ctx, originReceipt, - fromSubnet, + fromL1, cChainInfo, true, sendingKey, @@ -886,7 +886,7 @@ func SendNativeMultiHopAndVerify( signatureAggregator, ) - initialBalance, err := toSubnet.RPCClient.BalanceAt(ctx, recipientAddress, nil) + initialBalance, err := toL1.RPCClient.BalanceAt(ctx, recipientAddress, nil) Expect(err).Should(BeNil()) // When we relay the above message to the home chain, a multi-hop transfer @@ -896,7 +896,7 @@ func SendNativeMultiHopAndVerify( ctx, intermediateReceipt, cChainInfo, - toSubnet, + toL1, true, sendingKey, nil, @@ -908,7 +908,7 @@ func SendNativeMultiHopAndVerify( ctx, recipientAddress, big.NewInt(0).Add(initialBalance, transferredAmount), - toSubnet.RPCClient, + toL1.RPCClient, ) } @@ -918,13 +918,13 @@ func SendERC20TokenMultiHopAndVerify( fundedKey *ecdsa.PrivateKey, sendingKey *ecdsa.PrivateKey, recipientAddress common.Address, - fromSubnet interfaces.SubnetTestInfo, + fromL1 interfaces.L1TestInfo, fromTokenTransferrer *erc20tokenremote.ERC20TokenRemote, fromTokenTransferrerAddress common.Address, - toSubnet interfaces.SubnetTestInfo, + toL1 interfaces.L1TestInfo, toTokenTransferrer *erc20tokenremote.ERC20TokenRemote, toTokenTransferrerAddress common.Address, - cChainInfo interfaces.SubnetTestInfo, + cChainInfo interfaces.L1TestInfo, amount *big.Int, secondaryFeeAmount *big.Int, signatureAggregator *aggregator.SignatureAggregator, @@ -932,13 +932,13 @@ func SendERC20TokenMultiHopAndVerify( // Send tokens to the sender address to have gas for submitting the send tokens transaction SendNativeTransfer( ctx, - fromSubnet, + fromL1, fundedKey, crypto.PubkeyToAddress(sendingKey.PublicKey), big.NewInt(1e18), ) input := erc20tokenremote.SendTokensInput{ - DestinationBlockchainID: toSubnet.BlockchainID, + DestinationBlockchainID: toL1.BlockchainID, DestinationTokenTransferrerAddress: toTokenTransferrerAddress, Recipient: recipientAddress, PrimaryFeeTokenAddress: common.Address{}, @@ -951,7 +951,7 @@ func SendERC20TokenMultiHopAndVerify( // Send tokens through a multi-hop transfer originReceipt, amount := SendERC20TokenRemote( ctx, - fromSubnet, + fromL1, fromTokenTransferrer, fromTokenTransferrerAddress, input, @@ -964,7 +964,7 @@ func SendERC20TokenMultiHopAndVerify( intermediateReceipt := teleporter.RelayTeleporterMessage( ctx, originReceipt, - fromSubnet, + fromL1, cChainInfo, true, fundedKey, @@ -989,15 +989,15 @@ func SendERC20TokenMultiHopAndVerify( ctx, intermediateReceipt, cChainInfo, - toSubnet, + toL1, true, fundedKey, nil, signatureAggregator, ) - _, err = GetEventFromLogs(remoteReceipt.Logs, teleporter.TeleporterMessenger(toSubnet).ParseMessageExecuted) + _, err = GetEventFromLogs(remoteReceipt.Logs, teleporter.TeleporterMessenger(toL1).ParseMessageExecuted) if err != nil { - TraceTransactionAndExit(ctx, toSubnet.RPCClient, remoteReceipt.TxHash) + TraceTransactionAndExit(ctx, toL1.RPCClient, remoteReceipt.TxHash) } transferredAmount := big.NewInt(0).Sub(amount, input.SecondaryFee) @@ -1069,7 +1069,7 @@ type WrappedToken interface { func DepositAndApproveWrappedTokenForFees( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, wrappedToken WrappedToken, amount *big.Int, spender common.Address, @@ -1080,20 +1080,20 @@ func DepositAndApproveWrappedTokenForFees( } // Deposit the native tokens for paying the fee - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) opts.Value = amount tx, err := wrappedToken.Deposit(opts) Expect(err).Should(BeNil()) - _ = WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + _ = WaitForTransactionSuccess(ctx, l1, tx.Hash()) - opts, err = bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err = bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err = wrappedToken.Approve(opts, spender, amount) Expect(err).Should(BeNil()) - _ = WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + _ = WaitForTransactionSuccess(ctx, l1, tx.Hash()) } func ERC20DecimalsApprove( @@ -1101,14 +1101,14 @@ func ERC20DecimalsApprove( token *exampleerc20.ExampleERC20Decimals, spender common.Address, amount *big.Int, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, senderKey *ecdsa.PrivateKey, ) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := token.Approve(opts, spender, amount) Expect(err).Should(BeNil()) log.Info("Approved ERC20", "spender", spender.Hex(), "txHash", tx.Hash().Hex()) - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) } diff --git a/tests/utils/proxy.go b/tests/utils/proxy.go index 5a5e07517..becee3a35 100644 --- a/tests/utils/proxy.go +++ b/tests/utils/proxy.go @@ -15,30 +15,30 @@ import ( func DeployTransparentUpgradeableProxy( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, senderKey *ecdsa.PrivateKey, implAddress common.Address, ) (common.Address, *proxyadmin.ProxyAdmin) { opts, err := bind.NewKeyedTransactorWithChainID( senderKey, - subnet.EVMChainID, + l1.EVMChainID, ) Expect(err).Should((BeNil())) senderAddress := crypto.PubkeyToAddress(senderKey.PublicKey) proxyAddress, tx, proxy, err := transparentupgradeableproxy.DeployTransparentUpgradeableProxy( opts, - subnet.RPCClient, + l1.RPCClient, implAddress, senderAddress, []byte{}, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) proxyAdminEvent, err := GetEventFromLogs(receipt.Logs, proxy.ParseAdminChanged) Expect(err).Should(BeNil()) - proxyAdmin, err := proxyadmin.NewProxyAdmin(proxyAdminEvent.NewAdmin, subnet.RPCClient) + proxyAdmin, err := proxyadmin.NewProxyAdmin(proxyAdminEvent.NewAdmin, l1.RPCClient) Expect(err).Should(BeNil()) return proxyAddress, proxyAdmin diff --git a/tests/utils/teleporter.go b/tests/utils/teleporter.go index 34087135a..071be6365 100644 --- a/tests/utils/teleporter.go +++ b/tests/utils/teleporter.go @@ -45,77 +45,77 @@ type ChainTeleporterInfo struct { type TeleporterTestInfo map[ids.ID]*ChainTeleporterInfo -func NewTeleporterTestInfo(subnets []interfaces.SubnetTestInfo) TeleporterTestInfo { +func NewTeleporterTestInfo(l1s []interfaces.L1TestInfo) TeleporterTestInfo { t := make(TeleporterTestInfo) - for _, subnet := range subnets { - t[subnet.BlockchainID] = &ChainTeleporterInfo{} + for _, l1 := range l1s { + t[l1.BlockchainID] = &ChainTeleporterInfo{} } return t } func (t TeleporterTestInfo) TeleporterMessenger( - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, ) *teleportermessenger.TeleporterMessenger { - return t[subnet.BlockchainID].TeleporterMessenger + return t[l1.BlockchainID].TeleporterMessenger } -func (t TeleporterTestInfo) TeleporterMessengerAddress(subnet interfaces.SubnetTestInfo) common.Address { - return t[subnet.BlockchainID].TeleporterMessengerAddress +func (t TeleporterTestInfo) TeleporterMessengerAddress(l1 interfaces.L1TestInfo) common.Address { + return t[l1.BlockchainID].TeleporterMessengerAddress } func (t TeleporterTestInfo) TeleporterRegistry( - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, ) *teleporterregistry.TeleporterRegistry { - return t[subnet.BlockchainID].TeleporterRegistry + return t[l1.BlockchainID].TeleporterRegistry } -func (t TeleporterTestInfo) TeleporterRegistryAddress(subnet interfaces.SubnetTestInfo) common.Address { - return t[subnet.BlockchainID].TeleporterRegistryAddress +func (t TeleporterTestInfo) TeleporterRegistryAddress(l1 interfaces.L1TestInfo) common.Address { + return t[l1.BlockchainID].TeleporterRegistryAddress } -func (t TeleporterTestInfo) SetTeleporter(address common.Address, subnet interfaces.SubnetTestInfo) { +func (t TeleporterTestInfo) SetTeleporter(address common.Address, l1 interfaces.L1TestInfo) { teleporterMessenger, err := teleportermessenger.NewTeleporterMessenger( - address, subnet.RPCClient, + address, l1.RPCClient, ) Expect(err).Should(BeNil()) - info := t[subnet.BlockchainID] + info := t[l1.BlockchainID] info.TeleporterMessengerAddress = address info.TeleporterMessenger = teleporterMessenger } -func (t TeleporterTestInfo) InitializeBlockchainID(subnet interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey) { - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnet.EVMChainID) +func (t TeleporterTestInfo) InitializeBlockchainID(l1 interfaces.L1TestInfo, fundedKey *ecdsa.PrivateKey) { + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, l1.EVMChainID) Expect(err).Should(BeNil()) - tx, err := t.TeleporterMessenger(subnet).InitializeBlockchainID(opts) + tx, err := t.TeleporterMessenger(l1).InitializeBlockchainID(opts) Expect(err).Should(BeNil()) - WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + WaitForTransactionSuccess(context.Background(), l1, tx.Hash()) } -func (t TeleporterTestInfo) DeployTeleporterRegistry(subnet interfaces.SubnetTestInfo, deployerKey *ecdsa.PrivateKey) { +func (t TeleporterTestInfo) DeployTeleporterRegistry(l1 interfaces.L1TestInfo, deployerKey *ecdsa.PrivateKey) { ctx := context.Background() entries := []teleporterregistry.ProtocolRegistryEntry{ { Version: big.NewInt(1), - ProtocolAddress: t.TeleporterMessengerAddress(subnet), + ProtocolAddress: t.TeleporterMessengerAddress(l1), }, } - opts, err := bind.NewKeyedTransactorWithChainID(deployerKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(deployerKey, l1.EVMChainID) Expect(err).Should(BeNil()) teleporterRegistryAddress, tx, teleporterRegistry, err := teleporterregistry.DeployTeleporterRegistry( - opts, subnet.RPCClient, entries, + opts, l1.RPCClient, entries, ) Expect(err).Should(BeNil()) // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) - info := t[subnet.BlockchainID] + info := t[l1.BlockchainID] info.TeleporterRegistryAddress = teleporterRegistryAddress info.TeleporterRegistry = teleporterRegistry } func (t TeleporterTestInfo) DeployTeleporterMessenger( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, transactionBytes []byte, deployerAddress common.Address, contractAddress common.Address, @@ -124,16 +124,16 @@ func (t TeleporterTestInfo) DeployTeleporterMessenger( // Fund the deployer address fundAmount := big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(11)) // 11 AVAX fundDeployerTx := CreateNativeTransferTransaction( - ctx, subnet, fundedKey, deployerAddress, fundAmount, + ctx, l1, fundedKey, deployerAddress, fundAmount, ) - SendTransactionAndWaitForSuccess(ctx, subnet, fundDeployerTx) + SendTransactionAndWaitForSuccess(ctx, l1, fundDeployerTx) - log.Info("Finished funding Teleporter deployer", "blockchainID", subnet.BlockchainID.Hex()) + log.Info("Finished funding Teleporter deployer", "blockchainID", l1.BlockchainID.Hex()) // Deploy Teleporter contract rpcClient, err := rpc.DialContext( ctx, - HttpToRPCURI(subnet.NodeURIs[0], subnet.BlockchainID.String()), + HttpToRPCURI(l1.NodeURIs[0], l1.BlockchainID.String()), ) Expect(err).Should(BeNil()) defer rpcClient.Close() @@ -141,9 +141,9 @@ func (t TeleporterTestInfo) DeployTeleporterMessenger( txHash := common.Hash{} err = rpcClient.CallContext(ctx, &txHash, "eth_sendRawTransaction", hexutil.Encode(transactionBytes)) Expect(err).Should(BeNil()) - WaitForTransactionSuccess(ctx, subnet, txHash) + WaitForTransactionSuccess(ctx, l1, txHash) - teleporterCode, err := subnet.RPCClient.CodeAt(ctx, contractAddress, nil) + teleporterCode, err := l1.RPCClient.CodeAt(ctx, contractAddress, nil) Expect(err).Should(BeNil()) Expect(len(teleporterCode)).Should(BeNumerically(">", 2)) // 0x is an EOA, contract returns the bytecode } @@ -151,8 +151,8 @@ func (t TeleporterTestInfo) DeployTeleporterMessenger( func (t TeleporterTestInfo) RelayTeleporterMessage( ctx context.Context, sourceReceipt *types.Receipt, - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, + destination interfaces.L1TestInfo, expectSuccess bool, fundedKey *ecdsa.PrivateKey, justification []byte, @@ -200,9 +200,9 @@ func (t TeleporterTestInfo) RelayTeleporterMessage( func (t TeleporterTestInfo) SendExampleCrossChainMessageAndVerify( ctx context.Context, - source interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, sourceExampleMessenger *testmessenger.TestMessenger, - destination interfaces.SubnetTestInfo, + destination interfaces.L1TestInfo, destExampleMessengerAddress common.Address, destExampleMessenger *testmessenger.TestMessenger, senderKey *ecdsa.PrivateKey, @@ -210,7 +210,7 @@ func (t TeleporterTestInfo) SendExampleCrossChainMessageAndVerify( signatureAggregator *aggregator.SignatureAggregator, expectSuccess bool, ) { - // Call the example messenger contract on Subnet A + // Call the example messenger contract on L1 A optsA, err := bind.NewKeyedTransactorWithChainID(senderKey, source.EVMChainID) Expect(err).Should(BeNil()) tx, err := sourceExampleMessenger.SendMessage( @@ -282,30 +282,30 @@ func (t TeleporterTestInfo) SendExampleCrossChainMessageAndVerify( func (t TeleporterTestInfo) AddProtocolVersionAndWaitForAcceptance( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, newTeleporterAddress common.Address, senderKey *ecdsa.PrivateKey, unsignedMessage *avalancheWarp.UnsignedMessage, signatureAggregator *aggregator.SignatureAggregator, ) { - signedWarpMsg := GetSignedMessage(subnet, subnet, unsignedMessage, nil, signatureAggregator) + signedWarpMsg := GetSignedMessage(l1, l1, unsignedMessage, nil, signatureAggregator) log.Info("Got signed warp message", "messageID", signedWarpMsg.ID()) // Construct tx to add protocol version and send to destination chain signedTx := CreateAddProtocolVersionTransaction( ctx, signedWarpMsg, - t.TeleporterRegistryAddress(subnet), + t.TeleporterRegistryAddress(l1), senderKey, - subnet, + l1, ) - curLatestVersion := t.GetLatestTeleporterVersion(subnet) + curLatestVersion := t.GetLatestTeleporterVersion(l1) expectedLatestVersion := big.NewInt(curLatestVersion.Int64() + 1) // Wait for tx to be accepted, and verify events emitted - receipt := SendTransactionAndWaitForSuccess(ctx, subnet, signedTx) - teleporterRegistry := t.TeleporterRegistry(subnet) + receipt := SendTransactionAndWaitForSuccess(ctx, l1, signedTx) + teleporterRegistry := t.TeleporterRegistry(l1) addProtocolVersionEvent, err := GetEventFromLogs(receipt.Logs, teleporterRegistry.ParseAddProtocolVersion) Expect(err).Should(BeNil()) Expect(addProtocolVersionEvent.Version.Cmp(expectedLatestVersion)).Should(Equal(0)) @@ -317,8 +317,8 @@ func (t TeleporterTestInfo) AddProtocolVersionAndWaitForAcceptance( Expect(versionUpdatedEvent.NewVersion.Cmp(expectedLatestVersion)).Should(Equal(0)) } -func (t TeleporterTestInfo) GetLatestTeleporterVersion(subnet interfaces.SubnetTestInfo) *big.Int { - version, err := t.TeleporterRegistry(subnet).LatestVersion(&bind.CallOpts{}) +func (t TeleporterTestInfo) GetLatestTeleporterVersion(l1 interfaces.L1TestInfo) *big.Int { + version, err := t.TeleporterRegistry(l1).LatestVersion(&bind.CallOpts{}) Expect(err).Should(BeNil()) return version } @@ -326,8 +326,8 @@ func (t TeleporterTestInfo) GetLatestTeleporterVersion(subnet interfaces.SubnetT func (t TeleporterTestInfo) ClearReceiptQueue( ctx context.Context, fundedKey *ecdsa.PrivateKey, - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, + destination interfaces.L1TestInfo, signatureAggregator *aggregator.SignatureAggregator, ) { sourceTeleporterMessenger := t.TeleporterMessenger(source) @@ -337,9 +337,9 @@ func (t TeleporterTestInfo) ClearReceiptQueue( ) for outstandReceiptCount.Cmp(big.NewInt(0)) != 0 { log.Info("Emptying receipt queue", "remainingReceipts", outstandReceiptCount.String()) - // Send message from Subnet B to Subnet A to trigger the "regular" method of delivering receipts. + // Send message from L1 B to L1 A to trigger the "regular" method of delivering receipts. // The next message from B->A will contain the same receipts that were manually sent in the above steps, - // but they should not be processed again on Subnet A. + // but they should not be processed again on L1 A. sendCrossChainMessageInput := teleportermessenger.TeleporterMessageInput{ DestinationBlockchainID: destination.BlockchainID, DestinationAddress: common.HexToAddress("0x1111111111111111111111111111111111111111"), @@ -368,7 +368,7 @@ func (t TeleporterTestInfo) ClearReceiptQueue( // Does NOT modify the global Teleporter contract address to provide greater testing flexibility. func (t TeleporterTestInfo) DeployNewTeleporterVersion( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, fundedKey *ecdsa.PrivateKey, teleporterByteCodeFile string, ) common.Address { @@ -386,7 +386,7 @@ func (t TeleporterTestInfo) DeployNewTeleporterVersion( t.DeployTeleporterMessenger( ctx, - subnet, + l1, teleporterDeployerTransaction, teleporterDeployerAddress, teleporterContractAddress, @@ -405,16 +405,16 @@ func DeployTestMessenger( senderKey *ecdsa.PrivateKey, teleporterManager common.Address, registryAddress common.Address, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, ) (common.Address, *testmessenger.TestMessenger) { opts, err := bind.NewKeyedTransactorWithChainID( senderKey, - subnet.EVMChainID, + l1.EVMChainID, ) Expect(err).Should(BeNil()) address, tx, exampleMessenger, err := testmessenger.DeployTestMessenger( opts, - subnet.RPCClient, + l1.RPCClient, registryAddress, teleporterManager, big.NewInt(1), @@ -422,7 +422,7 @@ func DeployTestMessenger( Expect(err).Should(BeNil()) // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) return address, exampleMessenger } @@ -448,8 +448,8 @@ func ParseTeleporterMessage(unsignedMessage avalancheWarp.UnsignedMessage) *tele func SendAddFeeAmountAndWaitForAcceptance( ctx context.Context, - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, + destination interfaces.L1TestInfo, messageID ids.ID, amount *big.Int, feeContractAddress common.Address, @@ -484,23 +484,23 @@ func RetryMessageExecutionAndWaitForAcceptance( ctx context.Context, sourceBlockchainID ids.ID, destinationTeleporterMessenger *teleportermessenger.TeleporterMessenger, - destinationSubnet interfaces.SubnetTestInfo, + destinationL1 interfaces.L1TestInfo, message teleportermessenger.TeleporterMessage, senderKey *ecdsa.PrivateKey, ) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, destinationSubnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, destinationL1.EVMChainID) Expect(err).Should(BeNil()) tx, err := destinationTeleporterMessenger.RetryMessageExecution(opts, sourceBlockchainID, message) Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(ctx, destinationSubnet, tx.Hash()) + return WaitForTransactionSuccess(ctx, destinationL1, tx.Hash()) } func RedeemRelayerRewardsAndConfirm( ctx context.Context, teleporterMessenger *teleportermessenger.TeleporterMessenger, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, feeToken *exampleerc20.ExampleERC20, feeTokenAddress common.Address, redeemerKey *ecdsa.PrivateKey, @@ -516,14 +516,14 @@ func RedeemRelayerRewardsAndConfirm( // Redeem the rewards txOpts, err := bind.NewKeyedTransactorWithChainID( - redeemerKey, subnet.EVMChainID, + redeemerKey, l1.EVMChainID, ) Expect(err).Should(BeNil()) tx, err := teleporterMessenger.RedeemRelayerRewards( txOpts, feeTokenAddress, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) // Check that the ERC20 balance was incremented balanceAfterRedemption, err := feeToken.BalanceOf( @@ -553,7 +553,7 @@ func RedeemRelayerRewardsAndConfirm( func SendSpecifiedReceiptsAndWaitForAcceptance( ctx context.Context, sourceTeleporterMessenger *teleportermessenger.TeleporterMessenger, - source interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, destinationBlockchainID ids.ID, messageIDs [][32]byte, feeInfo teleportermessenger.TeleporterFeeInfo, @@ -584,8 +584,8 @@ func SendSpecifiedReceiptsAndWaitForAcceptance( func SendCrossChainMessageAndWaitForAcceptance( ctx context.Context, sourceTeleporterMessenger *teleportermessenger.TeleporterMessenger, - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, + destination interfaces.L1TestInfo, input teleportermessenger.TeleporterMessageInput, senderKey *ecdsa.PrivateKey, ) (*types.Receipt, ids.ID) { @@ -643,7 +643,7 @@ func GetOutstandingReceiptCount( // Returns the signed transaction. func CreateSendCrossChainMessageTransaction( ctx context.Context, - source interfaces.SubnetTestInfo, + source interfaces.L1TestInfo, input teleportermessenger.TeleporterMessageInput, senderKey *ecdsa.PrivateKey, teleporterContractAddress common.Address, @@ -676,7 +676,7 @@ func CreateReceiveCrossChainMessageTransaction( requiredGasLimit *big.Int, teleporterContractAddress common.Address, senderKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, ) *types.Transaction { // Construct the transaction to send the Warp message to the destination chain log.Info("Constructing receiveCrossChainMessage transaction for the destination chain") @@ -696,10 +696,10 @@ func CreateReceiveCrossChainMessageTransaction( callData, err := teleportermessenger.PackReceiveCrossChainMessage(0, PrivateKeyToAddress(senderKey)) Expect(err).Should(BeNil()) - gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnetInfo, PrivateKeyToAddress(senderKey)) + gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, l1Info, PrivateKeyToAddress(senderKey)) destinationTx := predicateutils.NewPredicateTx( - subnetInfo.EVMChainID, + l1Info.EVMChainID, nonce, &teleporterContractAddress, gasLimit, @@ -712,7 +712,7 @@ func CreateReceiveCrossChainMessageTransaction( signedMessage.Bytes(), ) - return SignTransaction(destinationTx, senderKey, subnetInfo.EVMChainID) + return SignTransaction(destinationTx, senderKey, l1Info.EVMChainID) } // Constructs a transaction to call addProtocolVersion @@ -722,7 +722,7 @@ func CreateAddProtocolVersionTransaction( signedMessage *avalancheWarp.Message, teleporterRegistryAddress common.Address, senderKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, ) *types.Transaction { // Construct the transaction to send the Warp message to the destination chain log.Info("Constructing addProtocolVersion transaction for the destination chain") @@ -730,10 +730,10 @@ func CreateAddProtocolVersionTransaction( callData, err := teleporterregistry.PackAddProtocolVersion(0) Expect(err).Should(BeNil()) - gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnetInfo, PrivateKeyToAddress(senderKey)) + gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, l1Info, PrivateKeyToAddress(senderKey)) destinationTx := predicateutils.NewPredicateTx( - subnetInfo.EVMChainID, + l1Info.EVMChainID, nonce, &teleporterRegistryAddress, 500_000, @@ -746,7 +746,7 @@ func CreateAddProtocolVersionTransaction( signedMessage.Bytes(), ) - return SignTransaction(destinationTx, senderKey, subnetInfo.EVMChainID) + return SignTransaction(destinationTx, senderKey, l1Info.EVMChainID) } func CreateExecuteCallPredicateTransaction( @@ -754,17 +754,17 @@ func CreateExecuteCallPredicateTransaction( signedMessage *avalancheWarp.Message, validatorSetSigAddress common.Address, senderKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, ) *types.Transaction { log.Info("Constructing executeCall transaction for the destination chain") callData, err := validatorsetsig.PackExecuteCall(0) Expect(err).Should(BeNil()) - gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnetInfo, PrivateKeyToAddress(senderKey)) + gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, l1Info, PrivateKeyToAddress(senderKey)) destinationTx := predicateutils.NewPredicateTx( - subnetInfo.EVMChainID, + l1Info.EVMChainID, nonce, &validatorSetSigAddress, 500_000, @@ -776,7 +776,7 @@ func CreateExecuteCallPredicateTransaction( warp.ContractAddress, signedMessage.Bytes(), ) - return SignTransaction(destinationTx, senderKey, subnetInfo.EVMChainID) + return SignTransaction(destinationTx, senderKey, l1Info.EVMChainID) } // @@ -788,14 +788,14 @@ func CreateExecuteCallPredicateTransaction( // off-chain Warp messages func InitOffChainMessageChainConfig( networkID uint32, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, registryAddress common.Address, teleporterAddress common.Address, version uint64, ) (*avalancheWarp.UnsignedMessage, string) { unsignedMessage := CreateOffChainRegistryMessage( networkID, - subnet, + l1, registryAddress, teleporterregistry.ProtocolRegistryEntry{ Version: big.NewInt(int64(version)), @@ -804,7 +804,7 @@ func InitOffChainMessageChainConfig( ) log.Info("Adding off-chain message to Warp chain config", "messageID", unsignedMessage.ID(), - "blockchainID", subnet.BlockchainID.String(), + "blockchainID", l1.BlockchainID.String(), ) return unsignedMessage, GetChainConfigWithOffChainMessages([]avalancheWarp.UnsignedMessage{*unsignedMessage}) @@ -813,7 +813,7 @@ func InitOffChainMessageChainConfig( // Creates an off-chain Warp message that registers a Teleporter protocol version with TeleporterRegistry func CreateOffChainRegistryMessage( networkID uint32, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, registryAddress common.Address, entry teleporterregistry.ProtocolRegistryEntry, ) *avalancheWarp.UnsignedMessage { @@ -826,7 +826,7 @@ func CreateOffChainRegistryMessage( unsignedMessage, err := avalancheWarp.NewUnsignedMessage( networkID, - subnet.BlockchainID, + l1.BlockchainID, addressedPayload.Bytes(), ) Expect(err).Should(BeNil()) diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index de525829e..395b76a10 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -72,10 +72,10 @@ const ( func DeployValidatorManager( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, managerType ValidatorManagerConcreteType, ) (common.Address, *ivalidatormanager.IValidatorManager) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) var ( tx *types.Transaction @@ -89,7 +89,7 @@ func DeployValidatorManager( address, tx, _, err = poavalidatormanager.DeployPoAValidatorManager( opts, - subnet.RPCClient, + l1.RPCClient, 0, // ICMInitializable.Allowed ) Expect(err).Should(BeNil()) @@ -100,7 +100,7 @@ func DeployValidatorManager( address, tx, _, err = erc20tokenstakingmanager.DeployERC20TokenStakingManager( opts, - subnet.RPCClient, + l1.RPCClient, 0, // ICMInitializable.Allowed ) Expect(err).Should(BeNil()) @@ -109,21 +109,21 @@ func DeployValidatorManager( nativetokenstakingmanager.NativeTokenStakingManagerBin = nativetokenstakingmanager.NativeTokenStakingManagerMetaData.Bin - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) address, tx, _, err = nativetokenstakingmanager.DeployNativeTokenStakingManager( opts, - subnet.RPCClient, + l1.RPCClient, 0, // ICMInitializable.Allowed ) Expect(err).Should(BeNil()) } - validatorManager, err = ivalidatormanager.NewIValidatorManager(address, subnet.RPCClient) + validatorManager, err = ivalidatormanager.NewIValidatorManager(address, l1.RPCClient) Expect(err).Should(BeNil()) // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) return address, validatorManager } @@ -131,17 +131,17 @@ func DeployValidatorManager( func DeployAndInitializeValidatorManager( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, managerType ValidatorManagerConcreteType, proxy bool, ) (common.Address, *proxyadmin.ProxyAdmin) { validatorManagerAddress, _ := DeployValidatorManager( ctx, senderKey, - subnet, + l1, managerType, ) - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) var ( @@ -152,7 +152,7 @@ func DeployAndInitializeValidatorManager( // Overwrite the manager address with the proxy address validatorManagerAddress, proxyAdmin = DeployTransparentUpgradeableProxy( ctx, - subnet, + l1, senderKey, validatorManagerAddress, ) @@ -160,12 +160,12 @@ func DeployAndInitializeValidatorManager( switch managerType { case PoAValidatorManager: - poaValidatorManager, err := poavalidatormanager.NewPoAValidatorManager(validatorManagerAddress, subnet.RPCClient) + poaValidatorManager, err := poavalidatormanager.NewPoAValidatorManager(validatorManagerAddress, l1.RPCClient) Expect(err).Should(BeNil()) tx, err = poaValidatorManager.Initialize( opts, poavalidatormanager.ValidatorManagerSettings{ - SubnetID: subnet.SubnetID, + L1ID: l1.L1ID, ChurnPeriodSeconds: uint64(0), MaximumChurnPercentage: uint8(20), }, @@ -173,23 +173,23 @@ func DeployAndInitializeValidatorManager( ) Expect(err).Should(BeNil()) case ERC20TokenStakingManager: - erc20Address, _ := DeployExampleERC20(ctx, senderKey, subnet) + erc20Address, _ := DeployExampleERC20(ctx, senderKey, l1) rewardCalculatorAddress, _ := DeployExampleRewardCalculator( ctx, senderKey, - subnet, + l1, uint64(10), ) erc20StakingManager, err := erc20tokenstakingmanager.NewERC20TokenStakingManager( validatorManagerAddress, - subnet.RPCClient, + l1.RPCClient, ) Expect(err).Should(BeNil()) tx, err = erc20StakingManager.Initialize( opts, erc20tokenstakingmanager.PoSValidatorManagerSettings{ BaseSettings: erc20tokenstakingmanager.ValidatorManagerSettings{ - SubnetID: subnet.SubnetID, + L1ID: l1.L1ID, ChurnPeriodSeconds: DefaultChurnPeriodSeconds, MaximumChurnPercentage: DefaultMaxChurnPercentage, }, @@ -200,7 +200,7 @@ func DeployAndInitializeValidatorManager( MaximumStakeMultiplier: DefaultMaxStakeMultiplier, WeightToValueFactor: big.NewInt(0).SetUint64(DefaultWeightToValueFactor), RewardCalculator: rewardCalculatorAddress, - UptimeBlockchainID: subnet.BlockchainID, + UptimeBlockchainID: l1.BlockchainID, }, erc20Address, ) @@ -209,19 +209,19 @@ func DeployAndInitializeValidatorManager( rewardCalculatorAddress, _ := DeployExampleRewardCalculator( ctx, senderKey, - subnet, + l1, uint64(10), ) nativeStakingManager, err := nativetokenstakingmanager.NewNativeTokenStakingManager( validatorManagerAddress, - subnet.RPCClient, + l1.RPCClient, ) Expect(err).Should(BeNil()) tx, err = nativeStakingManager.Initialize( opts, nativetokenstakingmanager.PoSValidatorManagerSettings{ BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ - SubnetID: subnet.SubnetID, + L1ID: l1.L1ID, ChurnPeriodSeconds: DefaultChurnPeriodSeconds, MaximumChurnPercentage: DefaultMaxChurnPercentage, }, @@ -232,32 +232,32 @@ func DeployAndInitializeValidatorManager( MaximumStakeMultiplier: DefaultMaxStakeMultiplier, WeightToValueFactor: big.NewInt(0).SetUint64(DefaultWeightToValueFactor), RewardCalculator: rewardCalculatorAddress, - UptimeBlockchainID: subnet.BlockchainID, + UptimeBlockchainID: l1.BlockchainID, }, ) Expect(err).Should(BeNil()) } - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) return validatorManagerAddress, proxyAdmin } func DeployExampleRewardCalculator( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, rewardBasisPoints uint64, ) (common.Address, *examplerewardcalculator.ExampleRewardCalculator) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) address, tx, calculator, err := examplerewardcalculator.DeployExampleRewardCalculator( opts, - subnet.RPCClient, + l1.RPCClient, rewardBasisPoints, ) Expect(err).Should(BeNil()) // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, l1, tx.Hash()) return address, calculator } @@ -269,14 +269,14 @@ func DeployExampleRewardCalculator( func InitializeValidatorSet( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, - pChainInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, validatorManagerAddress common.Address, networkID uint32, signatureAggregator *aggregator.SignatureAggregator, nodes []Node, ) []ids.ID { - log.Println("Initializing validator set", "subnet", subnetInfo.SubnetID) + log.Println("Initializing validator set", "l1", l1Info.L1ID) initialValidators := make([]warpMessage.SubnetToL1ConverstionValidatorData, len(nodes)) initialValidatorsABI := make([]ivalidatormanager.InitialValidator, len(nodes)) for i, node := range nodes { @@ -292,37 +292,38 @@ func InitializeValidatorSet( } } - subnetConversionData := warpMessage.SubnetToL1ConversionData{ - SubnetID: subnetInfo.SubnetID, - ManagerChainID: subnetInfo.BlockchainID, + l1ConversionData := warpMessage.SubnetToL1ConversionData{ + SubnetID: l1Info.L1ID, + ManagerChainID: l1Info.BlockchainID, ManagerAddress: validatorManagerAddress[:], Validators: initialValidators, } - subnetConversionDataABI := ivalidatormanager.ConversionData{ - SubnetID: subnetInfo.SubnetID, - ValidatorManagerBlockchainID: subnetInfo.BlockchainID, + l1ConversionDataABI := ivalidatormanager.ConversionData{ + L1ID: l1Info.L1ID, + ValidatorManagerBlockchainID: l1Info.BlockchainID, ValidatorManagerAddress: validatorManagerAddress, InitialValidators: initialValidatorsABI, } - subnetConversionID, err := warpMessage.SubnetToL1ConversionID(subnetConversionData) + l1ConversionID, err := warpMessage.SubnetToL1ConversionID(l1ConversionData) Expect(err).Should(BeNil()) - subnetConversionSignedMessage := ConstructSubnetConversionMessage( - subnetConversionID, - subnetInfo, + l1ConversionSignedMessage := ConstructL1ConversionMessage( + l1ConversionID, + l1Info, pChainInfo, networkID, signatureAggregator, ) - // Deliver the Warp message to the subnet - receipt := DeliverSubnetConversion( + + // Deliver the Warp message to the L1 + receipt := DeliverL1Conversion( ctx, senderKey, - subnetInfo, + l1Info, validatorManagerAddress, - subnetConversionSignedMessage, - subnetConversionDataABI, + l1ConversionSignedMessage, + l1ConversionDataABI, ) - manager, err := ivalidatormanager.NewIValidatorManager(validatorManagerAddress, subnetInfo.RPCClient) + manager, err := ivalidatormanager.NewIValidatorManager(validatorManagerAddress, l1Info.RPCClient) Expect(err).Should(BeNil()) initialValidatorCreatedEvent, err := GetEventFromLogs( receipt.Logs, @@ -331,7 +332,7 @@ func InitializeValidatorSet( Expect(err).Should(BeNil()) var validationIDs []ids.ID for i := range nodes { - validationIDs = append(validationIDs, subnetInfo.SubnetID.Append(uint32(i))) + validationIDs = append(validationIDs, l1Info.L1ID.Append(uint32(i))) } Expect(initialValidatorCreatedEvent.Weight).Should(Equal(nodes[0].Weight)) @@ -342,25 +343,25 @@ func InitializeValidatorSet( return validationIDs } -func DeliverSubnetConversion( +func DeliverL1Conversion( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, validatorManagerAddress common.Address, - subnetConversionSignedMessage *avalancheWarp.Message, - subnetConversionData ivalidatormanager.ConversionData, + l1ConversionSignedMessage *avalancheWarp.Message, + l1ConversionData ivalidatormanager.ConversionData, ) *types.Receipt { abi, err := ivalidatormanager.IValidatorManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("initializeValidatorSet", subnetConversionData, uint32(0)) + callData, err := abi.Pack("initializeValidatorSet", l1ConversionData, uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( ctx, callData, senderKey, - subnet, + l1, validatorManagerAddress, - subnetConversionSignedMessage.Bytes(), + l1ConversionSignedMessage.Bytes(), ) } @@ -371,13 +372,13 @@ func DeliverSubnetConversion( func InitializeNativeValidatorRegistration( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, stakeAmount *big.Int, node Node, expiry uint64, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, ) (*types.Receipt, ids.ID) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) opts.Value = stakeAmount @@ -392,7 +393,7 @@ func InitializeNativeValidatorRegistration( DefaultMinStakeDurationSeconds, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) registrationInitiatedEvent, err := GetEventFromLogs( receipt.Logs, stakingManager.ParseValidationPeriodCreated, @@ -404,7 +405,7 @@ func InitializeNativeValidatorRegistration( func InitializeERC20ValidatorRegistration( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, stakeAmount *big.Int, token *exampleerc20.ExampleERC20, stakingManagerAddress common.Address, @@ -417,11 +418,11 @@ func InitializeERC20ValidatorRegistration( token, stakingManagerAddress, stakeAmount, - subnet, + l1, senderKey, ) - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeValidatorRegistration( @@ -436,7 +437,7 @@ func InitializeERC20ValidatorRegistration( stakeAmount, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) registrationInitiatedEvent, err := GetEventFromLogs( receipt.Logs, stakingManager.ParseValidationPeriodCreated, @@ -448,12 +449,12 @@ func InitializeERC20ValidatorRegistration( func InitializePoAValidatorRegistration( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, node Node, expiry uint64, validatorManager *poavalidatormanager.PoAValidatorManager, ) (*types.Receipt, ids.ID) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := validatorManager.InitializeValidatorRegistration( @@ -466,7 +467,7 @@ func InitializePoAValidatorRegistration( node.Weight, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) registrationInitiatedEvent, err := GetEventFromLogs( receipt.Logs, validatorManager.ParseValidationPeriodCreated, @@ -478,7 +479,7 @@ func InitializePoAValidatorRegistration( func CompleteValidatorRegistration( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, stakingManagerContractAddress common.Address, registrationSignedMessage *avalancheWarp.Message, ) *types.Receipt { @@ -490,7 +491,7 @@ func CompleteValidatorRegistration( ctx, callData, senderKey, - subnet, + l1, stakingManagerContractAddress, registrationSignedMessage.Bytes(), ) @@ -501,13 +502,13 @@ func CallWarpReceiver( ctx context.Context, callData []byte, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, contract common.Address, signedMessageBytes []byte, ) *types.Receipt { - gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnet, PrivateKeyToAddress(senderKey)) + gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, l1, PrivateKeyToAddress(senderKey)) registrationTx := predicateutils.NewPredicateTx( - subnet.EVMChainID, + l1.EVMChainID, nonce, &contract, 2_000_000, @@ -519,16 +520,16 @@ func CallWarpReceiver( warp.ContractAddress, signedMessageBytes, ) - signedRegistrationTx := SignTransaction(registrationTx, senderKey, subnet.EVMChainID) - return SendTransactionAndWaitForSuccess(ctx, subnet, signedRegistrationTx) + signedRegistrationTx := SignTransaction(registrationTx, senderKey, l1.EVMChainID) + return SendTransactionAndWaitForSuccess(ctx, l1, signedRegistrationTx) } func InitializeAndCompleteNativeValidatorRegistration( ctx context.Context, signatureAggregator *aggregator.SignatureAggregator, fundedKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, - pChainInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, stakingManagerContractAddress common.Address, expiry uint64, @@ -545,16 +546,16 @@ func InitializeAndCompleteNativeValidatorRegistration( receipt, validationID := InitializeNativeValidatorRegistration( ctx, fundedKey, - subnetInfo, + l1Info, stakeAmount, node, expiry, stakingManager, ) - // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain + // Gather subnet-evm Warp signatures for the RegisterL1ValidatorMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo, nil, signatureAggregator) + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo, nil, signatureAggregator) _, err = pchainWallet.IssueRegisterL1ValidatorTx( 100*units.Avax, @@ -563,26 +564,26 @@ func InitializeAndCompleteNativeValidatorRegistration( ) Expect(err).Should(BeNil()) PChainProposerVMWorkaround(pchainWallet) - AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) + AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain log.Println("Completing validator registration") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + registrationSignedMessage := ConstructL1ValidatorRegistrationMessage( validationID, expiry, node, true, - subnetInfo, + l1Info, pChainInfo, networkID, signatureAggregator, ) - // Deliver the Warp message to the subnet + // Deliver the Warp message to the L1 receipt = CompleteValidatorRegistration( ctx, fundedKey, - subnetInfo, + l1Info, stakingManagerContractAddress, registrationSignedMessage, ) @@ -601,8 +602,8 @@ func InitializeAndCompleteERC20ValidatorRegistration( ctx context.Context, signatureAggregator *aggregator.SignatureAggregator, fundedKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, - pChainInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, stakingManagerAddress common.Address, erc20 *exampleerc20.ExampleERC20, @@ -622,7 +623,7 @@ func InitializeAndCompleteERC20ValidatorRegistration( receipt, validationID := InitializeERC20ValidatorRegistration( ctx, fundedKey, - subnetInfo, + l1Info, stakeAmount, erc20, stakingManagerAddress, @@ -631,8 +632,8 @@ func InitializeAndCompleteERC20ValidatorRegistration( stakingManager, ) - // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain - signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo, nil, signatureAggregator) + // Gather subnet-evm Warp signatures for the RegisterL1ValidatorMessage & relay to the P-Chain + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo, nil, signatureAggregator) _, err = pchainWallet.IssueRegisterL1ValidatorTx( 100*units.Avax, @@ -641,26 +642,26 @@ func InitializeAndCompleteERC20ValidatorRegistration( ) Expect(err).Should(BeNil()) PChainProposerVMWorkaround(pchainWallet) - AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) + AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain log.Println("Completing validator registration") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + registrationSignedMessage := ConstructL1ValidatorRegistrationMessage( validationID, expiry, node, true, - subnetInfo, + l1Info, pChainInfo, networkID, signatureAggregator, ) - // Deliver the Warp message to the subnet + // Deliver the Warp message to the L1 receipt = CompleteValidatorRegistration( ctx, fundedKey, - subnetInfo, + l1Info, stakingManagerAddress, registrationSignedMessage, ) @@ -680,8 +681,8 @@ func InitializeAndCompletePoAValidatorRegistration( signatureAggregator *aggregator.SignatureAggregator, ownerKey *ecdsa.PrivateKey, fundedKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, - pChainInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, validatorManager *poavalidatormanager.PoAValidatorManager, validatorManagerAddress common.Address, expiry uint64, @@ -693,14 +694,14 @@ func InitializeAndCompletePoAValidatorRegistration( receipt, validationID := InitializePoAValidatorRegistration( ctx, ownerKey, - subnetInfo, + l1Info, node, expiry, validatorManager, ) - // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain - signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo, nil, signatureAggregator) + // Gather subnet-evm Warp signatures for the RegisterL1ValidatorMessage & relay to the P-Chain + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo, nil, signatureAggregator) _, err := pchainWallet.IssueRegisterL1ValidatorTx( 100*units.Avax, @@ -709,26 +710,26 @@ func InitializeAndCompletePoAValidatorRegistration( ) Expect(err).Should(BeNil()) PChainProposerVMWorkaround(pchainWallet) - AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) + AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain log.Println("Completing validator registration") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + registrationSignedMessage := ConstructL1ValidatorRegistrationMessage( validationID, expiry, node, true, - subnetInfo, + l1Info, pChainInfo, networkID, signatureAggregator, ) - // Deliver the Warp message to the subnet + // Deliver the Warp message to the L1 receipt = CompleteValidatorRegistration( ctx, fundedKey, - subnetInfo, + l1Info, validatorManagerAddress, registrationSignedMessage, ) @@ -746,11 +747,11 @@ func InitializeAndCompletePoAValidatorRegistration( func InitializeEndPoSValidation( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, stakingManager *iposvalidatormanager.IPoSValidatorManager, validationID ids.ID, ) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndValidation0( opts, @@ -759,17 +760,17 @@ func InitializeEndPoSValidation( 0, ) Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + return WaitForTransactionSuccess(ctx, l1, tx.Hash()) } func ForceInitializeEndPoSValidation( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, stakingManager *iposvalidatormanager.IPoSValidatorManager, validationID ids.ID, ) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.ForceInitializeEndValidation( opts, @@ -778,13 +779,13 @@ func ForceInitializeEndPoSValidation( 0, ) Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + return WaitForTransactionSuccess(ctx, l1, tx.Hash()) } func ConstructUptimeProofMessage( validationID ids.ID, uptime uint64, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, networkID uint32, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { @@ -794,7 +795,7 @@ func ConstructUptimeProofMessage( Expect(err).Should(BeNil()) uptimeProofUnsignedMessage, err := avalancheWarp.NewUnsignedMessage( networkID, - subnet.BlockchainID, + l1.BlockchainID, addressedCall.Bytes(), ) Expect(err).Should(BeNil()) @@ -802,7 +803,7 @@ func ConstructUptimeProofMessage( uptimeProofSignedMessage, err := signatureAggregator.CreateSignedMessage( uptimeProofUnsignedMessage, nil, - subnet.SubnetID, + l1.L1ID, 67, ) Expect(err).Should(BeNil()) @@ -814,7 +815,7 @@ func ForceInitializeEndPoSValidationWithUptime( networkID uint32, signatureAggregator *aggregator.SignatureAggregator, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, stakingManagerAddress common.Address, validationID ids.ID, uptime uint64, @@ -822,7 +823,7 @@ func ForceInitializeEndPoSValidationWithUptime( uptimeMsg := ConstructUptimeProofMessage( validationID, uptime, - subnet, + l1, networkID, signatureAggregator, ) @@ -835,7 +836,7 @@ func ForceInitializeEndPoSValidationWithUptime( ctx, callData, senderKey, - subnet, + l1, stakingManagerAddress, uptimeMsg.Bytes(), ) @@ -846,7 +847,7 @@ func InitializeEndPoSValidationWithUptime( networkID uint32, signatureAggregator *aggregator.SignatureAggregator, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, stakingManagerAddress common.Address, validationID ids.ID, uptime uint64, @@ -854,7 +855,7 @@ func InitializeEndPoSValidationWithUptime( uptimeMsg := ConstructUptimeProofMessage( validationID, uptime, - subnet, + l1, networkID, signatureAggregator, ) @@ -867,7 +868,7 @@ func InitializeEndPoSValidationWithUptime( ctx, callData, senderKey, - subnet, + l1, stakingManagerAddress, uptimeMsg.Bytes(), ) @@ -876,24 +877,24 @@ func InitializeEndPoSValidationWithUptime( func InitializeEndPoAValidation( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, validatorManager *poavalidatormanager.PoAValidatorManager, validationID ids.ID, ) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := validatorManager.InitializeEndValidation( opts, validationID, ) Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + return WaitForTransactionSuccess(ctx, l1, tx.Hash()) } func CompleteEndValidation( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, stakingManagerContractAddress common.Address, registrationSignedMessage *avalancheWarp.Message, ) *types.Receipt { @@ -905,7 +906,7 @@ func CompleteEndValidation( ctx, callData, senderKey, - subnet, + l1, stakingManagerContractAddress, registrationSignedMessage.Bytes(), ) @@ -914,7 +915,7 @@ func CompleteEndValidation( func InitializeERC20DelegatorRegistration( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, validationID ids.ID, delegationAmount *big.Int, token *exampleerc20.ExampleERC20, @@ -926,11 +927,11 @@ func InitializeERC20DelegatorRegistration( token, stakingManagerAddress, delegationAmount, - subnet, + l1, senderKey, ) - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeDelegatorRegistration( @@ -939,7 +940,7 @@ func InitializeERC20DelegatorRegistration( delegationAmount, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) _, err = GetEventFromLogs( receipt.Logs, stakingManager.ParseDelegatorAdded, @@ -951,13 +952,13 @@ func InitializeERC20DelegatorRegistration( func InitializeNativeDelegatorRegistration( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, validationID ids.ID, delegationAmount *big.Int, stakingManagerAddress common.Address, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, ) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) opts.Value = delegationAmount @@ -966,7 +967,7 @@ func InitializeNativeDelegatorRegistration( validationID, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, l1, tx.Hash()) _, err = GetEventFromLogs( receipt.Logs, stakingManager.ParseDelegatorAdded, @@ -979,7 +980,7 @@ func CompleteDelegatorRegistration( ctx context.Context, senderKey *ecdsa.PrivateKey, delegationID ids.ID, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, stakingManagerContractAddress common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { @@ -991,7 +992,7 @@ func CompleteDelegatorRegistration( ctx, callData, senderKey, - subnet, + l1, stakingManagerContractAddress, signedMessage.Bytes(), ) @@ -1000,14 +1001,14 @@ func CompleteDelegatorRegistration( func InitializeEndDelegation( ctx context.Context, senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, stakingManagerAddress common.Address, delegationID ids.ID, ) *types.Receipt { - stakingManager, err := iposvalidatormanager.NewIPoSValidatorManager(stakingManagerAddress, subnet.RPCClient) + stakingManager, err := iposvalidatormanager.NewIPoSValidatorManager(stakingManagerAddress, l1.RPCClient) Expect(err).Should(BeNil()) - WaitMinStakeDuration(ctx, subnet, senderKey) - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + WaitMinStakeDuration(ctx, l1, senderKey) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.ForceInitializeEndDelegation( opts, @@ -1016,14 +1017,14 @@ func InitializeEndDelegation( 0, ) Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + return WaitForTransactionSuccess(ctx, l1, tx.Hash()) } func CompleteEndDelegation( ctx context.Context, senderKey *ecdsa.PrivateKey, delegationID ids.ID, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, stakingManagerContractAddress common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { @@ -1035,7 +1036,7 @@ func CompleteEndDelegation( ctx, callData, senderKey, - subnet, + l1, stakingManagerContractAddress, signedMessage.Bytes(), ) @@ -1045,8 +1046,8 @@ func InitializeAndCompleteEndInitialPoSValidation( ctx context.Context, signatureAggregator *aggregator.SignatureAggregator, fundedKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, - pChainInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, stakingManager *iposvalidatormanager.IPoSValidatorManager, stakingManagerAddress common.Address, validationID ids.ID, @@ -1056,11 +1057,11 @@ func InitializeAndCompleteEndInitialPoSValidation( networkID uint32, ) { log.Println("Initializing initial validator removal") - WaitMinStakeDuration(ctx, subnetInfo, fundedKey) + WaitMinStakeDuration(ctx, l1Info, fundedKey) receipt := ForceInitializeEndPoSValidation( ctx, fundedKey, - subnetInfo, + l1Info, stakingManager, validationID, ) @@ -1072,13 +1073,13 @@ func InitializeAndCompleteEndInitialPoSValidation( Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) Expect(validatorRemovalEvent.Weight).Should(Equal(weight)) - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // Gather subnet-evm Warp signatures for the SetL1ValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, subnetInfo) + unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, l1Info) signedWarpMessage, err := signatureAggregator.CreateSignedMessage( unsignedMessage, nil, - subnetInfo.SubnetID, + l1Info.L1ID, 67, ) Expect(err).Should(BeNil()) @@ -1086,25 +1087,25 @@ func InitializeAndCompleteEndInitialPoSValidation( // Deliver the Warp message to the P-Chain pchainWallet.IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) PChainProposerVMWorkaround(pchainWallet) - AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) + AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain log.Println("Completing initial validator removal") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessageForInitialValidator( + registrationSignedMessage := ConstructL1ValidatorRegistrationMessageForInitialValidator( validationID, index, false, - subnetInfo, + l1Info, pChainInfo, networkID, signatureAggregator, ) - // Deliver the Warp message to the subnet + // Deliver the Warp message to the L1 receipt = CompleteEndValidation( ctx, fundedKey, - subnetInfo, + l1Info, stakingManagerAddress, registrationSignedMessage, ) @@ -1122,8 +1123,8 @@ func InitializeAndCompleteEndPoSValidation( ctx context.Context, signatureAggregator *aggregator.SignatureAggregator, fundedKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, - pChainInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, stakingManager *iposvalidatormanager.IPoSValidatorManager, stakingManagerAddress common.Address, validationID ids.ID, @@ -1136,7 +1137,7 @@ func InitializeAndCompleteEndPoSValidation( networkID uint32, ) { log.Println("Initializing validator removal") - WaitMinStakeDuration(ctx, subnetInfo, fundedKey) + WaitMinStakeDuration(ctx, l1Info, fundedKey) var receipt *types.Receipt if includeUptime { @@ -1146,7 +1147,7 @@ func InitializeAndCompleteEndPoSValidation( networkID, signatureAggregator, fundedKey, - subnetInfo, + l1Info, stakingManagerAddress, validationID, uptime, @@ -1155,7 +1156,7 @@ func InitializeAndCompleteEndPoSValidation( receipt = ForceInitializeEndPoSValidation( ctx, fundedKey, - subnetInfo, + l1Info, stakingManager, validationID, ) @@ -1169,12 +1170,12 @@ func InitializeAndCompleteEndPoSValidation( Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) Expect(validatorRemovalEvent.Weight).Should(Equal(node.Weight)) - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain - unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, subnetInfo) + // Gather subnet-evm Warp signatures for the SetL1ValidatorWeightMessage & relay to the P-Chain + unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, l1Info) signedWarpMessage, err := signatureAggregator.CreateSignedMessage( unsignedMessage, nil, - subnetInfo.SubnetID, + l1Info.L1ID, 67, ) Expect(err).Should(BeNil()) @@ -1182,26 +1183,26 @@ func InitializeAndCompleteEndPoSValidation( // Deliver the Warp message to the P-Chain pchainWallet.IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) PChainProposerVMWorkaround(pchainWallet) - AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) + AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain log.Println("Completing validator removal") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + registrationSignedMessage := ConstructL1ValidatorRegistrationMessage( validationID, expiry, node, false, - subnetInfo, + l1Info, pChainInfo, networkID, signatureAggregator, ) - // Deliver the Warp message to the subnet + // Deliver the Warp message to the L1 receipt = CompleteEndValidation( ctx, fundedKey, - subnetInfo, + l1Info, stakingManagerAddress, registrationSignedMessage, ) @@ -1220,8 +1221,8 @@ func InitializeAndCompleteEndInitialPoAValidation( signatureAggregator *aggregator.SignatureAggregator, ownerKey *ecdsa.PrivateKey, fundedKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, - pChainInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, stakingManager *poavalidatormanager.PoAValidatorManager, stakingManagerAddress common.Address, validationID ids.ID, @@ -1231,11 +1232,11 @@ func InitializeAndCompleteEndInitialPoAValidation( networkID uint32, ) { log.Println("Initializing initial validator removal") - WaitMinStakeDuration(ctx, subnetInfo, fundedKey) + WaitMinStakeDuration(ctx, l1Info, fundedKey) receipt := InitializeEndPoAValidation( ctx, ownerKey, - subnetInfo, + l1Info, stakingManager, validationID, ) @@ -1247,13 +1248,13 @@ func InitializeAndCompleteEndInitialPoAValidation( Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) Expect(validatorRemovalEvent.Weight).Should(Equal(weight)) - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // Gather subnet-evm Warp signatures for the SetL1ValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, subnetInfo) + unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, l1Info) signedWarpMessage, err := signatureAggregator.CreateSignedMessage( unsignedMessage, nil, - subnetInfo.SubnetID, + l1Info.L1ID, 67, ) Expect(err).Should(BeNil()) @@ -1261,25 +1262,25 @@ func InitializeAndCompleteEndInitialPoAValidation( // Deliver the Warp message to the P-Chain pchainWallet.IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) PChainProposerVMWorkaround(pchainWallet) - AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) + AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain log.Println("Completing initial validator removal") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessageForInitialValidator( + registrationSignedMessage := ConstructL1ValidatorRegistrationMessageForInitialValidator( validationID, index, false, - subnetInfo, + l1Info, pChainInfo, networkID, signatureAggregator, ) - // Deliver the Warp message to the subnet + // Deliver the Warp message to the L1 receipt = CompleteEndValidation( ctx, fundedKey, - subnetInfo, + l1Info, stakingManagerAddress, registrationSignedMessage, ) @@ -1298,8 +1299,8 @@ func InitializeAndCompleteEndPoAValidation( signatureAggregator *aggregator.SignatureAggregator, ownerKey *ecdsa.PrivateKey, fundedKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, - pChainInfo interfaces.SubnetTestInfo, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, validatorManager *poavalidatormanager.PoAValidatorManager, validatorManagerAddress common.Address, validationID ids.ID, @@ -1310,7 +1311,7 @@ func InitializeAndCompleteEndPoAValidation( receipt := InitializeEndPoAValidation( ctx, ownerKey, - subnetInfo, + l1Info, validatorManager, validationID, ) @@ -1322,31 +1323,31 @@ func InitializeAndCompleteEndPoAValidation( Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) Expect(validatorRemovalEvent.Weight).Should(Equal(weight)) - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // Gather subnet-evm Warp signatures for the SetL1ValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo, nil, signatureAggregator) + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo, nil, signatureAggregator) Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) - ValidateSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, nonce) + ValidateL1ValidatorWeightMessage(signedWarpMessage, validationID, 0, nonce) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := ConstructL1ValidatorRegistrationMessage( validationID, 0, Node{}, false, - subnetInfo, + l1Info, pChainInfo, networkID, signatureAggregator, ) - // Deliver the Warp message to the subnet + // Deliver the Warp message to the L1 receipt = CompleteEndValidation( ctx, ownerKey, - subnetInfo, + l1Info, validatorManagerAddress, registrationSignedMessage, ) @@ -1364,19 +1365,19 @@ func InitializeAndCompleteEndPoAValidation( // P-Chain utils // -func ConstructSubnetValidatorRegistrationMessageForInitialValidator( +func ConstructL1ValidatorRegistrationMessageForInitialValidator( validationID ids.ID, index uint32, valid bool, - subnet interfaces.SubnetTestInfo, - pChainInfo interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, networkID uint32, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { justification := platformvm.L1ValidatorRegistrationJustification{ Preimage: &platformvm.L1ValidatorRegistrationJustification_ConvertSubnetToL1TxData{ ConvertSubnetToL1TxData: &platformvm.SubnetIDIndex{ - SubnetId: subnet.SubnetID[:], + SubnetId: l1.L1ID[:], Index: index, }, }, @@ -1398,7 +1399,7 @@ func ConstructSubnetValidatorRegistrationMessageForInitialValidator( registrationSignedMessage, err := signatureAggregator.CreateSignedMessage( registrationUnsignedMessage, justificationBytes, - subnet.SubnetID, + l1.L1ID, 67, ) Expect(err).Should(BeNil()) @@ -1406,18 +1407,18 @@ func ConstructSubnetValidatorRegistrationMessageForInitialValidator( return registrationSignedMessage } -func ConstructSubnetValidatorRegistrationMessage( +func ConstructL1ValidatorRegistrationMessage( validationID ids.ID, expiry uint64, node Node, valid bool, - subnet interfaces.SubnetTestInfo, - pChainInfo interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, networkID uint32, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { msg, err := warpMessage.NewRegisterL1Validator( - subnet.SubnetID, + l1.L1ID, node.NodeID, node.NodePoP.PublicKey, expiry, @@ -1448,7 +1449,7 @@ func ConstructSubnetValidatorRegistrationMessage( registrationSignedMessage, err := signatureAggregator.CreateSignedMessage( registrationUnsignedMessage, justificationBytes, - subnet.SubnetID, + l1.L1ID, 67, ) Expect(err).Should(BeNil()) @@ -1456,12 +1457,12 @@ func ConstructSubnetValidatorRegistrationMessage( return registrationSignedMessage } -func ConstructSubnetValidatorWeightUpdateMessage( +func ConstructL1ValidatorWeightMessage( validationID ids.ID, nonce uint64, weight uint64, - subnet interfaces.SubnetTestInfo, - pChainInfo interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, signatureAggregator *aggregator.SignatureAggregator, networkID uint32, ) *avalancheWarp.Message { @@ -1479,42 +1480,42 @@ func ConstructSubnetValidatorWeightUpdateMessage( updateSignedMessage, err := signatureAggregator.CreateSignedMessage( updateUnsignedMessage, nil, - subnet.SubnetID, + l1.L1ID, 67, ) Expect(err).Should(BeNil()) return updateSignedMessage } -func ConstructSubnetConversionMessage( - subnetConversionID ids.ID, - subnet interfaces.SubnetTestInfo, - pChainInfo interfaces.SubnetTestInfo, +func ConstructL1ConversionMessage( + l1ConversionID ids.ID, + l1 interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, networkID uint32, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { - subnetConversionPayload, err := warpMessage.NewSubnetToL1Conversion(subnetConversionID) + l1ConversionPayload, err := warpMessage.NewSubnetToL1Conversion(l1ConversionID) Expect(err).Should(BeNil()) - subnetConversionAddressedCall, err := warpPayload.NewAddressedCall( + l1ConversionAddressedCall, err := warpPayload.NewAddressedCall( nil, - subnetConversionPayload.Bytes(), + l1ConversionPayload.Bytes(), ) Expect(err).Should(BeNil()) - subnetConversionUnsignedMessage, err := avalancheWarp.NewUnsignedMessage( + l1ConversionUnsignedMessage, err := avalancheWarp.NewUnsignedMessage( networkID, pChainInfo.BlockchainID, - subnetConversionAddressedCall.Bytes(), + l1ConversionAddressedCall.Bytes(), ) Expect(err).Should(BeNil()) - subnetConversionSignedMessage, err := signatureAggregator.CreateSignedMessage( - subnetConversionUnsignedMessage, - subnet.SubnetID[:], - subnet.SubnetID, + l1ConversionSignedMessage, err := signatureAggregator.CreateSignedMessage( + l1ConversionUnsignedMessage, + l1.L1ID[:], + l1.L1ID, 67, ) Expect(err).Should(BeNil()) - return subnetConversionSignedMessage + return l1ConversionSignedMessage } // @@ -1522,11 +1523,11 @@ func ConstructSubnetConversionMessage( // These will be replaced by the actual implementation on the P-Chain in the future // -func ValidateRegisterSubnetValidatorMessage( +func ValidateRegisterL1ValidatorMessage( signedWarpMessage *avalancheWarp.Message, nodeID ids.ID, weight uint64, - subnetID ids.ID, + l1ID ids.ID, blsPublicKey [bls.PublicKeyLen]byte, ) { // Validate the Warp message, (this will be done on the P-Chain in the future) @@ -1542,11 +1543,11 @@ func ValidateRegisterSubnetValidatorMessage( Expect(ver).Should(Equal(uint16(warpMessage.CodecVersion))) Expect(payload.NodeID).Should(Equal(nodeID)) Expect(payload.Weight).Should(Equal(weight)) - Expect(payload.SubnetID).Should(Equal(subnetID)) + Expect(payload.SubnetID).Should(Equal(l1ID)) Expect(payload.BLSPublicKey[:]).Should(Equal(blsPublicKey[:])) } -func ValidateSubnetValidatorWeightMessage( +func ValidateL1ValidatorWeightMessage( signedWarpMessage *avalancheWarp.Message, validationID ids.ID, weight uint64, @@ -1569,7 +1570,7 @@ func ValidateSubnetValidatorWeightMessage( func WaitMinStakeDuration( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, fundedKey *ecdsa.PrivateKey, ) { // Make sure minimum stake duration has passed @@ -1579,16 +1580,16 @@ func WaitMinStakeDuration( // before delisting the validator. SendNativeTransfer( ctx, - subnet, + l1, fundedKey, common.Address{}, big.NewInt(10), ) } -func CalculateSubnetConversionValidationId(subnetID ids.ID, validatorIdx uint32) ids.ID { +func CalculateL1ConversionValidationId(l1ID ids.ID, validatorIdx uint32) ids.ID { preImage := make([]byte, 36) - copy(preImage[0:32], subnetID[:]) + copy(preImage[0:32], l1ID[:]) binary.BigEndian.PutUint32(preImage[32:36], validatorIdx) return sha256.Sum256(preImage) } @@ -1628,7 +1629,7 @@ func PackSubnetConversionData(data interface{}) ([]byte, error) { } } - subnetID := v.FieldByName("SubnetID").Interface().([32]byte) + l1ID := v.FieldByName("SubnetID").Interface().([32]byte) validatorManagerBlockchainID := v.FieldByName("ValidatorManagerBlockchainID").Interface().([32]byte) validatorManagerAddress := v.FieldByName("ValidatorManagerAddress").Interface().(common.Address) initialValidators := v.FieldByName("InitialValidators") @@ -1649,7 +1650,7 @@ func PackSubnetConversionData(data interface{}) ([]byte, error) { b := make([]byte, 94+packedInitialValidatorsLen) binary.BigEndian.PutUint16(b[0:2], uint16(warpMessage.CodecVersion)) - copy(b[2:34], subnetID[:]) + copy(b[2:34], l1ID[:]) copy(b[34:66], validatorManagerBlockchainID[:]) // These are evm addresses and have lengths of 20 so hardcoding here binary.BigEndian.PutUint32(b[66:70], uint32(20)) @@ -1768,14 +1769,14 @@ func PChainProposerVMWorkaround( func AdvanceProposerVM( ctx context.Context, - subnet interfaces.SubnetTestInfo, + l1 interfaces.L1TestInfo, fundedKey *ecdsa.PrivateKey, blocks int, ) { log.Println("Advancing proposer VM") for i := 0; i < blocks; i++ { err := subnetEvmUtils.IssueTxsToActivateProposerVMFork( - ctx, subnet.EVMChainID, fundedKey, subnet.WSClient, + ctx, l1.EVMChainID, fundedKey, l1.WSClient, ) Expect(err).Should(BeNil()) } diff --git a/utils/contract-deployment/README.md b/utils/contract-deployment/README.md index 5af9f384c..74263e859 100644 --- a/utils/contract-deployment/README.md +++ b/utils/contract-deployment/README.md @@ -1,8 +1,8 @@ -# Teleporter Contract Deployment +# TeleporterMessenger Contract Deployment -The `TeleporterMessenger` contract is designed to only send and receive Avalanche Warp messages to and from its own address on different chains. We ensure that the contract can be deployed to the same address on every EVM based chain by using [Nick's Method](https://yamenmerhi.medium.com/nicks-method-ethereum-keyless-execution-168a6659479c). Only allowing messages to be sent and received by the same address guarantees that all messages use the same Teleporter message format because only the same exact contract bytecode could have been deployed to the same address. +The `TeleporterMessenger` contract is designed to only send and receive Avalanche ICM messages to and from its own address on different chains. We ensure that the contract can be deployed to the same address on every EVM based chain by using [Nick's Method](https://yamenmerhi.medium.com/nicks-method-ethereum-keyless-execution-168a6659479c). Only allowing messages to be sent and received by the same address guarantees that all messages use the same TeleporterMessenger message format because only the same exact contract bytecode could have been deployed to the same address. -This directory contains scripts written in Golang to construct a raw transaction using Nick's method that deploys the Teleporter contract, and determine the keyless address that must be prefunded in order for the transaction to be sent. +This directory contains scripts written in Golang to construct a raw transaction using Nick's method that deploys the TeleporterMessenger contract, and determine the keyless address that must be prefunded in order for the transaction to be sent. ## Running @@ -30,11 +30,11 @@ teleporter_deployer_address=$(cat UniversalTeleporterDeployerAddress.txt) cast send --private-key $my_private_key --value 10ether $teleporter_deployer_address --rpc-url $my_rpc_url ``` -Then, deploy Teleporter by sending the keyless transaction: +Then, deploy TeleporterMessenger by sending the keyless transaction: ```bash teleporter_deploy_tx=$(cat UniversalTeleporterDeployerTransaction.txt) cast publish --rpc-url $my_rpc_url $teleporter_deploy_tx ``` -Once you've verified that Teleporter was deployed to the address in `UniversalTeleporterMessengerContractAddress.txt`, Teleporter is ready to use. +Once you've verified that TeleporterMessenger was deployed to the address in `UniversalTeleporterMessengerContractAddress.txt`, TeleporterMessenger and ICM is ready to use. diff --git a/utils/deployment-utils/deployment_utils.go b/utils/deployment-utils/deployment_utils.go index 3f0ba81ca..bce12172a 100644 --- a/utils/deployment-utils/deployment_utils.go +++ b/utils/deployment-utils/deployment_utils.go @@ -126,8 +126,8 @@ func ConstructKeylessTransaction( contractAddress := crypto.CreateAddress(senderAddress, 0) contractAddressString := contractAddress.Hex() // "0x" prepended by Hex() already. - log.Println("Teleporter Contract Keyless Deployer Address: ", senderAddressString) - log.Println("Teleporter Messenger Universal Contract Address: ", contractAddressString) + log.Println("TeleporterMessenger Keyless Deployer Address: ", senderAddressString) + log.Println("TeleporterMessenger Universal Contract Address: ", contractAddressString) if writeFile { err = os.WriteFile(