diff --git a/.github/workflows/manual-whitelist-bridge-token.yml b/.github/workflows/manual-whitelist-bridge-token.yml index 5798dec2bf..f99a1097a0 100644 --- a/.github/workflows/manual-whitelist-bridge-token.yml +++ b/.github/workflows/manual-whitelist-bridge-token.yml @@ -25,6 +25,11 @@ on: description: 'Token Symbol (e.g., "USDC")' required: true type: string + force_rewhitelist: + description: 'Set to "true" to remove an existing whitelist entry and retry from scratch (use to recover from a failed run)' + required: false + default: 'false' + type: string confirmation: description: 'Type "confirm" if whitelisting on sepolia or mainnet' required: false @@ -126,7 +131,7 @@ jobs: fi # External L2 gateway URL - L2_GATEWAY_URL="${{ vars.L2_RPC_URL_VALIDATOR }}" + L2_GATEWAY_URL="${{ vars.GATEWAY_URL }}" echo "L2 Gateway URL: $L2_GATEWAY_URL" echo "Network env: $TESTNET_TYPE" @@ -140,7 +145,8 @@ jobs: -l2_gateway_url="$L2_GATEWAY_URL" \ -private_key=${{ secrets.ACCOUNT_PK_WORKER }} \ -docker_image=${{ vars.DOCKER_BUILD_TAG_L2_HARDHAT_DEPLOYER }} \ - -network_config_addr="${{ steps.parse.outputs.network_config }}" + -network_config_addr="${{ steps.parse.outputs.network_config }}" \ + -force_rewhitelist="${{ github.event.inputs.force_rewhitelist }}" - name: 'Save whitelisting container logs' if: ${{ always() }} diff --git a/contracts/deployment_scripts/testnet/layer1/002_whitelist_tokens_and_setup_weth.ts b/contracts/deployment_scripts/testnet/layer1/002_setup_weth.ts similarity index 56% rename from contracts/deployment_scripts/testnet/layer1/002_whitelist_tokens_and_setup_weth.ts rename to contracts/deployment_scripts/testnet/layer1/002_setup_weth.ts index 7908856f4e..d20215be90 100644 --- a/contracts/deployment_scripts/testnet/layer1/002_whitelist_tokens_and_setup_weth.ts +++ b/contracts/deployment_scripts/testnet/layer1/002_setup_weth.ts @@ -2,12 +2,18 @@ import {HardhatRuntimeEnvironment} from 'hardhat/types'; import {DeployFunction} from 'hardhat-deploy/types'; /* - This script whitelists USDC and USDT tokens on the TenBridge contract - and sets up the WETH address for bridge functionality. + This script sets up the WETH address for bridge functionality. + + Note: Token whitelisting (USDC, USDT, etc.) is intentionally not done here. + Whitelisting must be done via the manual-whitelist-bridge-token workflow, which + handles the full e2e process: + 1. L1 whitelist + 2. Wait for L2 message + 3. Finalisation + relaying the message to create the L2 wrapped token. + + Whitelisting here without the relay step leaves the bridge in a broken half-state. Environment variables: - - USDC_ADDRESS: USDC token address (optional) - - USDT_ADDRESS: USDT token address (optional) - WETH_ADDRESS: WETH token address (optional - defaults to genesis WETH address) WETH is pre-deployed at genesis on both L1 and L2 at address 0x1000000000000000000000000000000000000042. @@ -26,33 +32,9 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const {deployer} = await getNamedAccounts(); // Get environment variables - const usdcAddress = process.env.USDC_ADDRESS; - const usdtAddress = process.env.USDT_ADDRESS; // Use provided WETH address or fall back to genesis WETH address const wethAddress = process.env.WETH_ADDRESS || GENESIS_WETH_ADDRESS; - // Whitelist USDC token if address is provided - if (usdcAddress) { - console.log(`Whitelisting USDC: ${usdcAddress}`); - await deployments.execute('TenBridge', { - from: deployer, - log: true - }, 'whitelistToken', usdcAddress, 'USD Coin', 'USDC'); - } else { - console.log('Skipping USDC whitelist - USDC_ADDRESS not set'); - } - - // Whitelist USDT token if address is provided - if (usdtAddress) { - console.log(`Whitelisting USDT: ${usdtAddress}`); - await deployments.execute('TenBridge', { - from: deployer, - log: true - }, 'whitelistToken', usdtAddress, 'Tether USD', 'USDT'); - } else { - console.log('Skipping USDT whitelist - USDT_ADDRESS not set'); - } - // Set WETH address for WETH unwrapping functionality // This also grants ERC20_TOKEN_ROLE to WETH so it can be bridged via sendERC20 console.log(`Setting WETH address: ${wethAddress}`); diff --git a/contracts/generated/ConfigurableERC20/ConfigurableERC20.go b/contracts/generated/ConfigurableERC20/ConfigurableERC20.go new file mode 100644 index 0000000000..134592796b --- /dev/null +++ b/contracts/generated/ConfigurableERC20/ConfigurableERC20.go @@ -0,0 +1,760 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ConfigurableERC20 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ConfigurableERC20MetaData contains all meta data concerning the ConfigurableERC20 contract. +var ConfigurableERC20MetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"initialSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"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\"},{\"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\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"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\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"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\"}]", + Bin: "0x608060405234801561000f575f5ffd5b50604051610e79380380610e7983398101604081905261002e91610314565b8484600361003c8382610490565b5060046100498282610490565b50505060128360ff1611156100795760405162461bcd60e51b81526004016100709061054b565b60405180910390fd5b6005805460ff191660ff8516179055600681905561009733836100a1565b5050505050610616565b6001600160a01b0382166100ca575f60405163ec442f0560e01b815260040161007091906105a5565b6100d55f83836100d9565b5050565b6001600160a01b038316610103578060025f8282546100f891906105c7565b909155506101609050565b6001600160a01b0383165f90815260208190526040902054818110156101425783818360405163391434e360e21b8152600401610070939291906105e0565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661017c5760028054829003905561019a565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101dd9190610608565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b601f19601f83011681016001600160401b0381118282101715610223576102236101ea565b6040525050565b5f61023460405190565b905061024082826101fe565b919050565b5f6001600160401b0382111561025d5761025d6101ea565b601f19601f83011660200192915050565b8281835e505f910152565b5f61028b61028684610245565b61022a565b90508281528383830111156102a1576102a15f5ffd5b6102af83602083018461026e565b9392505050565b5f82601f8301126102c8576102c85f5ffd5b81516102d8848260208601610279565b949350505050565b60ff81165b81146102ef575f5ffd5b50565b80516102fd816102e0565b92915050565b806102e5565b80516102fd81610303565b5f5f5f5f5f60a0868803121561032b5761032b5f5ffd5b85516001600160401b03811115610343576103435f5ffd5b61034f888289016102b6565b602088015190965090506001600160401b0381111561036f5761036f5f5ffd5b61037b888289016102b6565b94505061038b87604088016102f2565b925061039a8760608801610309565b91506103a98760808801610309565b90509295509295909350565b634e487b7160e01b5f52602260045260245ffd5b6002810460018216806103dd57607f821691505b6020821081036103ef576103ef6103b5565b50919050565b5f6102fd6104008381565b90565b61040c836103f5565b81545f1960089490940293841b1916921b91909117905550565b5f610432818484610403565b505050565b818110156100d5576104495f82610426565b600101610437565b601f821115610432575f818152602090206020601f850104810160208510156104775750805b6104896020601f860104830182610437565b5050505050565b81516001600160401b038111156104a9576104a96101ea565b6104b382546103c9565b6104be828285610451565b506020601f8211600181146104f1575f83156104da5750848201515b5f19600885021c1981166002850217855550610489565b5f84815260208120601f198516915b828110156105205787850151825560209485019460019092019101610500565b508482101561053c57838701515f19601f87166008021c191681555b50505050600202600101905550565b602080825281016102fd81601681527f446563696d616c73206d757374206265203c3d20313800000000000000000000602082015260400190565b5f6001600160a01b0382166102fd565b61059f81610586565b82525050565b602081016102fd8284610596565b634e487b7160e01b5f52601160045260245ffd5b808201808211156102fd576102fd6105b3565b8061059f565b606081016105ee8286610596565b6105fb60208301856105da565b6102d860408301846105da565b602081016102fd82846105da565b610856806106235f395ff3fe608060405234801561000f575f5ffd5b506004361061009f575f3560e01c8063313ce5671161007257806395d89b411161005857806395d89b4114610140578063a9059cbb14610148578063dd62ed3e1461015b575f5ffd5b8063313ce5671461010557806370a0823114610118575f5ffd5b806306fdde03146100a3578063095ea7b3146100c157806318160ddd146100e157806323b872dd146100f2575b5f5ffd5b6100ab610193565b6040516100b8919061060f565b60405180910390f35b6100d46100cf366004610669565b610223565b6040516100b891906106a9565b6002545b6040516100b891906106bd565b6100d46101003660046106cb565b61023c565b60055460ff166040516100b8919061071a565b6100e5610126366004610728565b6001600160a01b03165f9081526020819052604090205490565b6100ab61025f565b6100d4610156366004610669565b61026e565b6100e5610169366004610745565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546101a290610786565b80601f01602080910402602001604051908101604052809291908181526020018280546101ce90610786565b80156102195780601f106101f057610100808354040283529160200191610219565b820191905f5260205f20905b8154815290600101906020018083116101fc57829003601f168201915b5050505050905090565b5f3361023081858561027b565b60019150505b92915050565b5f3361024985828561028d565b610254858585610318565b506001949350505050565b6060600480546101a290610786565b5f33610230818585610318565b61028883838360016103a7565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156103125781811015610304578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016102fb939291906107bb565b60405180910390fd5b61031284848484035f6103a7565b50505050565b6001600160a01b03831661035a575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016102fb91906107eb565b6001600160a01b03821661039c575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016102fb91906107eb565b6102888383836104a9565b6001600160a01b0384166103e9575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016102fb91906107eb565b6001600160a01b03831661042b575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016102fb91906107eb565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561031257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161049b91906106bd565b60405180910390a350505050565b6001600160a01b0383166104d3578060025f8282546104c8919061080d565b909155506105499050565b6001600160a01b0383165f908152602081905260409020548181101561052b578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016102fb939291906107bb565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661056557600280548290039055610583565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516105c691906106bd565b60405180910390a3505050565b8281835e505f910152565b5f6105e7825190565b8084526020840193506105fe8185602086016105d3565b601f01601f19169290920192915050565b6020808252810161062081846105de565b9392505050565b5f6001600160a01b038216610236565b61064081610627565b811461064a575f5ffd5b50565b803561023681610637565b80610640565b803561023681610658565b5f5f6040838503121561067d5761067d5f5ffd5b610687848461064d565b9150610696846020850161065e565b90509250929050565b8015155b82525050565b60208101610236828461069f565b806106a3565b6020810161023682846106b7565b5f5f5f606084860312156106e0576106e05f5ffd5b6106ea858561064d565b92506106f9856020860161064d565b9150610708856040860161065e565b90509250925092565b60ff81166106a3565b602081016102368284610711565b5f6020828403121561073b5761073b5f5ffd5b610620838361064d565b5f5f60408385031215610759576107595f5ffd5b610763848461064d565b9150610696846020850161064d565b634e487b7160e01b5f52602260045260245ffd5b60028104600182168061079a57607f821691505b6020821081036107ac576107ac610772565b50919050565b6106a381610627565b606081016107c982866107b2565b6107d660208301856106b7565b6107e360408301846106b7565b949350505050565b6020810161023682846107b2565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610236576102366107f956fea26469706673582212204766103870d87a41d587c552041f7a898b86be40eb2f7db500e155591945d97664736f6c634300081c0033", +} + +// ConfigurableERC20ABI is the input ABI used to generate the binding from. +// Deprecated: Use ConfigurableERC20MetaData.ABI instead. +var ConfigurableERC20ABI = ConfigurableERC20MetaData.ABI + +// ConfigurableERC20Bin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ConfigurableERC20MetaData.Bin instead. +var ConfigurableERC20Bin = ConfigurableERC20MetaData.Bin + +// DeployConfigurableERC20 deploys a new Ethereum contract, binding an instance of ConfigurableERC20 to it. +func DeployConfigurableERC20(auth *bind.TransactOpts, backend bind.ContractBackend, name string, symbol string, decimals_ uint8, initialSupply *big.Int, salt *big.Int) (common.Address, *types.Transaction, *ConfigurableERC20, error) { + parsed, err := ConfigurableERC20MetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ConfigurableERC20Bin), backend, name, symbol, decimals_, initialSupply, salt) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ConfigurableERC20{ConfigurableERC20Caller: ConfigurableERC20Caller{contract: contract}, ConfigurableERC20Transactor: ConfigurableERC20Transactor{contract: contract}, ConfigurableERC20Filterer: ConfigurableERC20Filterer{contract: contract}}, nil +} + +// ConfigurableERC20 is an auto generated Go binding around an Ethereum contract. +type ConfigurableERC20 struct { + ConfigurableERC20Caller // Read-only binding to the contract + ConfigurableERC20Transactor // Write-only binding to the contract + ConfigurableERC20Filterer // Log filterer for contract events +} + +// ConfigurableERC20Caller is an auto generated read-only Go binding around an Ethereum contract. +type ConfigurableERC20Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ConfigurableERC20Transactor is an auto generated write-only Go binding around an Ethereum contract. +type ConfigurableERC20Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ConfigurableERC20Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ConfigurableERC20Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ConfigurableERC20Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ConfigurableERC20Session struct { + Contract *ConfigurableERC20 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ConfigurableERC20CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ConfigurableERC20CallerSession struct { + Contract *ConfigurableERC20Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ConfigurableERC20TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ConfigurableERC20TransactorSession struct { + Contract *ConfigurableERC20Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ConfigurableERC20Raw is an auto generated low-level Go binding around an Ethereum contract. +type ConfigurableERC20Raw struct { + Contract *ConfigurableERC20 // Generic contract binding to access the raw methods on +} + +// ConfigurableERC20CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ConfigurableERC20CallerRaw struct { + Contract *ConfigurableERC20Caller // Generic read-only contract binding to access the raw methods on +} + +// ConfigurableERC20TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ConfigurableERC20TransactorRaw struct { + Contract *ConfigurableERC20Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewConfigurableERC20 creates a new instance of ConfigurableERC20, bound to a specific deployed contract. +func NewConfigurableERC20(address common.Address, backend bind.ContractBackend) (*ConfigurableERC20, error) { + contract, err := bindConfigurableERC20(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ConfigurableERC20{ConfigurableERC20Caller: ConfigurableERC20Caller{contract: contract}, ConfigurableERC20Transactor: ConfigurableERC20Transactor{contract: contract}, ConfigurableERC20Filterer: ConfigurableERC20Filterer{contract: contract}}, nil +} + +// NewConfigurableERC20Caller creates a new read-only instance of ConfigurableERC20, bound to a specific deployed contract. +func NewConfigurableERC20Caller(address common.Address, caller bind.ContractCaller) (*ConfigurableERC20Caller, error) { + contract, err := bindConfigurableERC20(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ConfigurableERC20Caller{contract: contract}, nil +} + +// NewConfigurableERC20Transactor creates a new write-only instance of ConfigurableERC20, bound to a specific deployed contract. +func NewConfigurableERC20Transactor(address common.Address, transactor bind.ContractTransactor) (*ConfigurableERC20Transactor, error) { + contract, err := bindConfigurableERC20(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ConfigurableERC20Transactor{contract: contract}, nil +} + +// NewConfigurableERC20Filterer creates a new log filterer instance of ConfigurableERC20, bound to a specific deployed contract. +func NewConfigurableERC20Filterer(address common.Address, filterer bind.ContractFilterer) (*ConfigurableERC20Filterer, error) { + contract, err := bindConfigurableERC20(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ConfigurableERC20Filterer{contract: contract}, nil +} + +// bindConfigurableERC20 binds a generic wrapper to an already deployed contract. +func bindConfigurableERC20(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ConfigurableERC20MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ConfigurableERC20 *ConfigurableERC20Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ConfigurableERC20.Contract.ConfigurableERC20Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ConfigurableERC20 *ConfigurableERC20Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ConfigurableERC20.Contract.ConfigurableERC20Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ConfigurableERC20 *ConfigurableERC20Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ConfigurableERC20.Contract.ConfigurableERC20Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ConfigurableERC20 *ConfigurableERC20CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ConfigurableERC20.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ConfigurableERC20 *ConfigurableERC20TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ConfigurableERC20.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ConfigurableERC20 *ConfigurableERC20TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ConfigurableERC20.Contract.contract.Transact(opts, method, params...) +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256) +func (_ConfigurableERC20 *ConfigurableERC20Caller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) { + var out []interface{} + err := _ConfigurableERC20.contract.Call(opts, &out, "allowance", owner, spender) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256) +func (_ConfigurableERC20 *ConfigurableERC20Session) Allowance(owner common.Address, spender common.Address) (*big.Int, error) { + return _ConfigurableERC20.Contract.Allowance(&_ConfigurableERC20.CallOpts, owner, spender) +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256) +func (_ConfigurableERC20 *ConfigurableERC20CallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) { + return _ConfigurableERC20.Contract.Allowance(&_ConfigurableERC20.CallOpts, owner, spender) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_ConfigurableERC20 *ConfigurableERC20Caller) BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error) { + var out []interface{} + err := _ConfigurableERC20.contract.Call(opts, &out, "balanceOf", account) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_ConfigurableERC20 *ConfigurableERC20Session) BalanceOf(account common.Address) (*big.Int, error) { + return _ConfigurableERC20.Contract.BalanceOf(&_ConfigurableERC20.CallOpts, account) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_ConfigurableERC20 *ConfigurableERC20CallerSession) BalanceOf(account common.Address) (*big.Int, error) { + return _ConfigurableERC20.Contract.BalanceOf(&_ConfigurableERC20.CallOpts, account) +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_ConfigurableERC20 *ConfigurableERC20Caller) Decimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _ConfigurableERC20.contract.Call(opts, &out, "decimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_ConfigurableERC20 *ConfigurableERC20Session) Decimals() (uint8, error) { + return _ConfigurableERC20.Contract.Decimals(&_ConfigurableERC20.CallOpts) +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_ConfigurableERC20 *ConfigurableERC20CallerSession) Decimals() (uint8, error) { + return _ConfigurableERC20.Contract.Decimals(&_ConfigurableERC20.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_ConfigurableERC20 *ConfigurableERC20Caller) Name(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ConfigurableERC20.contract.Call(opts, &out, "name") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_ConfigurableERC20 *ConfigurableERC20Session) Name() (string, error) { + return _ConfigurableERC20.Contract.Name(&_ConfigurableERC20.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_ConfigurableERC20 *ConfigurableERC20CallerSession) Name() (string, error) { + return _ConfigurableERC20.Contract.Name(&_ConfigurableERC20.CallOpts) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_ConfigurableERC20 *ConfigurableERC20Caller) Symbol(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ConfigurableERC20.contract.Call(opts, &out, "symbol") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_ConfigurableERC20 *ConfigurableERC20Session) Symbol() (string, error) { + return _ConfigurableERC20.Contract.Symbol(&_ConfigurableERC20.CallOpts) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_ConfigurableERC20 *ConfigurableERC20CallerSession) Symbol() (string, error) { + return _ConfigurableERC20.Contract.Symbol(&_ConfigurableERC20.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_ConfigurableERC20 *ConfigurableERC20Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ConfigurableERC20.contract.Call(opts, &out, "totalSupply") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_ConfigurableERC20 *ConfigurableERC20Session) TotalSupply() (*big.Int, error) { + return _ConfigurableERC20.Contract.TotalSupply(&_ConfigurableERC20.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_ConfigurableERC20 *ConfigurableERC20CallerSession) TotalSupply() (*big.Int, error) { + return _ConfigurableERC20.Contract.TotalSupply(&_ConfigurableERC20.CallOpts) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 value) returns(bool) +func (_ConfigurableERC20 *ConfigurableERC20Transactor) Approve(opts *bind.TransactOpts, spender common.Address, value *big.Int) (*types.Transaction, error) { + return _ConfigurableERC20.contract.Transact(opts, "approve", spender, value) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 value) returns(bool) +func (_ConfigurableERC20 *ConfigurableERC20Session) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) { + return _ConfigurableERC20.Contract.Approve(&_ConfigurableERC20.TransactOpts, spender, value) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 value) returns(bool) +func (_ConfigurableERC20 *ConfigurableERC20TransactorSession) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) { + return _ConfigurableERC20.Contract.Approve(&_ConfigurableERC20.TransactOpts, spender, value) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 value) returns(bool) +func (_ConfigurableERC20 *ConfigurableERC20Transactor) Transfer(opts *bind.TransactOpts, to common.Address, value *big.Int) (*types.Transaction, error) { + return _ConfigurableERC20.contract.Transact(opts, "transfer", to, value) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 value) returns(bool) +func (_ConfigurableERC20 *ConfigurableERC20Session) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) { + return _ConfigurableERC20.Contract.Transfer(&_ConfigurableERC20.TransactOpts, to, value) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 value) returns(bool) +func (_ConfigurableERC20 *ConfigurableERC20TransactorSession) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) { + return _ConfigurableERC20.Contract.Transfer(&_ConfigurableERC20.TransactOpts, to, value) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 value) returns(bool) +func (_ConfigurableERC20 *ConfigurableERC20Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) { + return _ConfigurableERC20.contract.Transact(opts, "transferFrom", from, to, value) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 value) returns(bool) +func (_ConfigurableERC20 *ConfigurableERC20Session) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) { + return _ConfigurableERC20.Contract.TransferFrom(&_ConfigurableERC20.TransactOpts, from, to, value) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 value) returns(bool) +func (_ConfigurableERC20 *ConfigurableERC20TransactorSession) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) { + return _ConfigurableERC20.Contract.TransferFrom(&_ConfigurableERC20.TransactOpts, from, to, value) +} + +// ConfigurableERC20ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the ConfigurableERC20 contract. +type ConfigurableERC20ApprovalIterator struct { + Event *ConfigurableERC20Approval // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ConfigurableERC20ApprovalIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ConfigurableERC20Approval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ConfigurableERC20Approval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ConfigurableERC20ApprovalIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ConfigurableERC20ApprovalIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ConfigurableERC20Approval represents a Approval event raised by the ConfigurableERC20 contract. +type ConfigurableERC20Approval struct { + Owner common.Address + Spender common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_ConfigurableERC20 *ConfigurableERC20Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*ConfigurableERC20ApprovalIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var spenderRule []interface{} + for _, spenderItem := range spender { + spenderRule = append(spenderRule, spenderItem) + } + + logs, sub, err := _ConfigurableERC20.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule) + if err != nil { + return nil, err + } + return &ConfigurableERC20ApprovalIterator{contract: _ConfigurableERC20.contract, event: "Approval", logs: logs, sub: sub}, nil +} + +// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_ConfigurableERC20 *ConfigurableERC20Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *ConfigurableERC20Approval, owner []common.Address, spender []common.Address) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var spenderRule []interface{} + for _, spenderItem := range spender { + spenderRule = append(spenderRule, spenderItem) + } + + logs, sub, err := _ConfigurableERC20.contract.WatchLogs(opts, "Approval", ownerRule, spenderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ConfigurableERC20Approval) + if err := _ConfigurableERC20.contract.UnpackLog(event, "Approval", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_ConfigurableERC20 *ConfigurableERC20Filterer) ParseApproval(log types.Log) (*ConfigurableERC20Approval, error) { + event := new(ConfigurableERC20Approval) + if err := _ConfigurableERC20.contract.UnpackLog(event, "Approval", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ConfigurableERC20TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the ConfigurableERC20 contract. +type ConfigurableERC20TransferIterator struct { + Event *ConfigurableERC20Transfer // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ConfigurableERC20TransferIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ConfigurableERC20Transfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ConfigurableERC20Transfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ConfigurableERC20TransferIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ConfigurableERC20TransferIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ConfigurableERC20Transfer represents a Transfer event raised by the ConfigurableERC20 contract. +type ConfigurableERC20Transfer struct { + From common.Address + To common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_ConfigurableERC20 *ConfigurableERC20Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ConfigurableERC20TransferIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _ConfigurableERC20.contract.FilterLogs(opts, "Transfer", fromRule, toRule) + if err != nil { + return nil, err + } + return &ConfigurableERC20TransferIterator{contract: _ConfigurableERC20.contract, event: "Transfer", logs: logs, sub: sub}, nil +} + +// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_ConfigurableERC20 *ConfigurableERC20Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ConfigurableERC20Transfer, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _ConfigurableERC20.contract.WatchLogs(opts, "Transfer", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ConfigurableERC20Transfer) + if err := _ConfigurableERC20.contract.UnpackLog(event, "Transfer", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_ConfigurableERC20 *ConfigurableERC20Filterer) ParseTransfer(log types.Log) (*ConfigurableERC20Transfer, error) { + event := new(ConfigurableERC20Transfer) + if err := _ConfigurableERC20.contract.UnpackLog(event, "Transfer", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts/generated/Ten/Ten.go b/contracts/generated/Ten/Ten.go new file mode 100644 index 0000000000..0436cc8747 --- /dev/null +++ b/contracts/generated/Ten/Ten.go @@ -0,0 +1,2857 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package Ten + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// CheckpointsCheckpoint208 is an auto generated low-level Go binding around an user-defined struct. +type CheckpointsCheckpoint208 struct { + Key *big.Int + Value *big.Int +} + +// Erc20WithLockInitialAllocation is an auto generated low-level Go binding around an user-defined struct. +type Erc20WithLockInitialAllocation struct { + Account common.Address + Amount *big.Int + Locked bool +} + +// TenMetaData contains all meta data concerning the Ten contract. +var TenMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CheckpointUnorderedInsertion\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"increasedSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"cap\",\"type\":\"uint256\"}],\"name\":\"ERC20ExceededSafeSupply\",\"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\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC2612ExpiredSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC2612InvalidSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"clock\",\"type\":\"uint48\"}],\"name\":\"ERC5805FutureLookup\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC6372InconsistentClock\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"currentNonce\",\"type\":\"uint256\"}],\"name\":\"InvalidAccountNonce\",\"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\":[{\"internalType\":\"uint8\",\"name\":\"bits\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeCastOverflowedUintDowncast\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"}],\"name\":\"VotesExpiredSignature\",\"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\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousVotes\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotes\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"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\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"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\":\"CLOCK_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VESTING_ROLE\",\"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\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint48\",\"name\":\"_key\",\"type\":\"uint48\"},{\"internalType\":\"uint208\",\"name\":\"_value\",\"type\":\"uint208\"}],\"internalType\":\"structCheckpoints.Checkpoint208\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clock\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createLockedAccount\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantVesting\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"locked\",\"type\":\"bool\"}],\"internalType\":\"structErc20WithLock.InitialAllocation[]\",\"name\":\"allocations\",\"type\":\"tuple[]\"}],\"name\":\"initializeAllocations\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"locked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeVesting\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"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\"}]", + Bin: "0x608060405234801561000f575f5ffd5b5061001861001d565b6100fc565b5f6100266100bd565b805490915068010000000000000000900460ff16156100585760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100ba5780546001600160401b0319166001600160401b0390811782556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2916100b1916100e7565b60405180910390a15b50565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b6001600160401b0382168152602081016100e1565b613828806101095f395ff3fe608060405234801561000f575f5ffd5b50600436106102b7575f3560e01c80638129fc1c11610171578063a217fddf116100d2578063d505accf11610088578063dd62ed3e1161006e578063dd62ed3e14610659578063f1127ed8146106b0578063f2fde38b146106d0575f5ffd5b8063d505accf14610633578063d547741f14610646575f5ffd5b8063a9fb3efd116100b8578063a9fb3efd146105eb578063c3cda520146105fe578063cbf9fe5f14610611575f5ffd5b8063a217fddf146105d1578063a9059cbb146105d8575f5ffd5b806391d148541161012757806395d89b411161010d57806395d89b411461058f5780639ab24eb014610597578063a1c1418c146105aa575f5ffd5b806391d148541461052357806391ddadf41461057a575f5ffd5b80638bcf86f8116101575780638bcf86f8146104d85780638da5cb5b146104e05780638e539e8c14610510575f5ffd5b80638129fc1c146104b557806384b0196e146104bd575f5ffd5b80633a46b1a81161021b5780635c19a95c116101d157806370a08231116101b757806370a0823114610487578063715018a61461049a5780637ecebe00146104a2575f5ffd5b80635c19a95c146104545780636fcfff4514610467575f5ffd5b80634a3bbe2b116102015780634a3bbe2b146103f55780634bf5d7e914610408578063587cde1e14610410575f5ffd5b80633a46b1a8146103cf5780633b0da260146103e2575f5ffd5b8063248a9ca311610270578063313ce56711610256578063313ce567146103a55780633644e515146103b457806336568abe146103bc575f5ffd5b8063248a9ca31461034f5780632f2ff15d14610390575f5ffd5b8063095ea7b3116102a0578063095ea7b3146102f957806318160ddd1461030c57806323b872dd1461033c575f5ffd5b806301ffc9a7146102bb57806306fdde03146102e4575b5f5ffd5b6102ce6102c9366004612b2e565b6106e3565b6040516102db9190612b55565b60405180910390f35b6102ec61077b565b6040516102db9190612b9f565b6102ce610307366004612be5565b610833565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02545b6040516102db9190612c21565b6102ce61034a366004612c2f565b61084a565b61032f61035d366004612c75565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6103a361039e366004612c92565b610860565b005b60126040516102db9190612cc8565b61032f6108a9565b6103a36103ca366004612c92565b6108b7565b61032f6103dd366004612be5565b610908565b6103a36103f0366004612cd6565b610953565b6103a3610403366004612cd6565b610988565b6102ec6109e9565b61044761041e366004612cd6565b6001600160a01b039081165f9081525f5160206137d35f395f51905f5260205260409020541690565b6040516102db9190612cfc565b6103a3610462366004612cd6565b610a7a565b61047a610475366004612cd6565b610a89565b6040516102db9190612d16565b61032f610495366004612cd6565b610a93565b6103a3610ad6565b61032f6104b0366004612cd6565b610ae9565b6103a3610af3565b6104c5610c9c565b6040516102db9796959493929190612da8565b6102ce610d4c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610447565b61032f61051e366004612c75565b610d9b565b6102ce610531366004612c92565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b610582610dd0565b6040516102db9190612e32565b6102ec610dd9565b61032f6105a5366004612cd6565b610e2a565b61032f7f6343452265350cc926492d9bfc7710ca06328d7c328cdb091fde925c1441e7a881565b61032f5f81565b6102ce6105e6366004612be5565b610e78565b6103a36105f9366004612fa6565b610e83565b6103a361060c366004612ff2565b610fb4565b6102ce61061f366004612cd6565b5f6020819052908152604090205460ff1681565b6103a361064136600461306b565b611070565b6103a3610654366004612c92565b6111c5565b61032f6106673660046130f6565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6106c36106be36600461312b565b611208565b6040516102db9190613186565b6103a36106de366004612cd6565b611225565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061077557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60605f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace005b90508060030180546107b1906131a8565b80601f01602080910402602001604051908101604052809291908181526020018280546107dd906131a8565b80156108285780601f106107ff57610100808354040283529160200191610828565b820191905f5260205f20905b81548152906001019060200180831161080b57829003601f168201915b505050505091505090565b5f33610840818585611278565b5060019392505050565b5f610856848484611285565b90505b9392505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260409020600101546108998161129c565b6108a383836112a6565b50505050565b5f6108b2611372565b905090565b6001600160a01b03811633146108f9576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610903828261137b565b505050565b5f5f5160206137d35f395f51905f526109426109238461141f565b6001600160a01b0386165f908152600184016020526040902090611479565b6001600160d01b0316949350505050565b61095b61152c565b6109857f6343452265350cc926492d9bfc7710ca06328d7c328cdb091fde925c1441e7a8826111c5565b50565b61099061152c565b6001600160a01b0381166109bf5760405162461bcd60e51b81526004016109b690613206565b60405180910390fd5b6109857f6343452265350cc926492d9bfc7710ca06328d7c328cdb091fde925c1441e7a882610860565b60606109f36115a0565b65ffffffffffff16610a03610dd0565b65ffffffffffff1614610a42576040517f6ff0714000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b33610a8581836115aa565b5050565b5f61077582611662565b5f807f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace005b6001600160a01b039093165f9081526020939093525050604090205490565b610ade61152c565b610ae75f6116b1565b565b5f6107758261172e565b5f610afc611738565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015610b285750825b90505f8267ffffffffffffffff166001148015610b445750303b155b905081158015610b52575080155b15610b89576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610bbd57845468ff00000000000000001916680100000000000000001785555b610bfd604051806040016040528060038152602001622a22a760e91b815250604051806040016040528060038152602001622a22a760e91b815250611760565b610c21604051806040016040528060038152602001622a22a760e91b815250611772565b610c296117b9565b610c32336117c1565b610c3a6117b9565b610c445f336112a6565b508315610c9557845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290610c8c90600190613239565b60405180910390a15b5050505050565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1008054909150158015610cda57506001810154155b610cf65760405162461bcd60e51b81526004016109b690613279565b610cfe6117d2565b610d06611823565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b335f9081526020819052604081205460ff1615610d7b5760405162461bcd60e51b81526004016109b6906132bb565b50335f908152602081905260409020805460ff1916600190811790915590565b5f5f5160206137d35f395f51905f52610dc0610db68461141f565b6002830190611479565b6001600160d01b03169392505050565b5f6108b26115a0565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00916107b1906131a8565b6001600160a01b0381165f9081527fe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d01602052604081205f5160206137d35f395f51905f5290610dc09061184c565b5f6108598383611886565b610e8b61152c565b60015460ff1615610eae5760405162461bcd60e51b81526004016109b690613325565b5f5b8151811015610fa4575f828281518110610ecc57610ecc613335565b60200260200101515f015190505f838381518110610eec57610eec613335565b60200260200101516020015190505f6001600160a01b0316826001600160a01b031603610f2b5760405162461bcd60e51b81526004016109b690613206565b5f8111610f4a5760405162461bcd60e51b81526004016109b69061337b565b610f5482826118a5565b838381518110610f6657610f66613335565b60200260200101516040015115610f9a576001600160a01b0382165f908152602081905260409020805460ff191660011790555b5050600101610eb0565b50506001805460ff191681179055565b83421115610ff057836040517f4683af0e0000000000000000000000000000000000000000000000000000000081526004016109b69190612c21565b5f6110516110497fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf89898960405160200161102e949392919061338b565b604051602081830303815290604052805190602001206118d9565b858585611920565b905061105d818761194c565b61106781886115aa565b50505050505050565b834211156110ac57836040517f627913020000000000000000000000000000000000000000000000000000000081526004016109b69190612c21565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886111168c6001600160a01b03165f9081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040902080546001810190915590565b8960405160200161112c969594939291906133c9565b6040516020818303038152906040528051906020012090505f61114e826118d9565b90505f61115d82878787611920565b9050896001600160a01b0316816001600160a01b0316146111ae57808a6040517f4b800e460000000000000000000000000000000000000000000000000000000081526004016109b6929190613418565b6111b98a8a8a611278565b50505050505050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260409020600101546111fe8161129c565b6108a3838361137b565b604080518082019091525f808252602082015261085983836119c8565b61122d61152c565b6001600160a01b03811661126f575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016109b69190612cfc565b610985816116b1565b6109038383836001611a29565b5f611291848484611b4f565b610856848484611c4b565b6109858133611c6e565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611369575f848152602082815260408083206001600160a01b03871684529091529020805460ff1916600117905561131f3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610775565b5f915050610775565b5f6108b2611cec565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611369575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610775565b5f5f611429610dd0565b90508065ffffffffffff1683106114705782816040517fecd3f81e0000000000000000000000000000000000000000000000000000000081526004016109b6929190613433565b61085983611d4f565b81545f90818160058111156114d5575f61149284611d80565b61149c9085613462565b5f8881526020902090915081015465ffffffffffff90811690871610156114c5578091506114d3565b6114d0816001613475565b92505b505b5f6114e287878585611ee5565b9050801561151f57611506876114f9600184613462565b5f91825260209091200190565b54660100000000000090046001600160d01b0316611521565b5f5b979650505050505050565b3361155e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610ae757336040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016109b69190612cfc565b5f6108b243611d4f565b5f5160206137d35f395f51905f525f6115e6846001600160a01b039081165f9081525f5160206137d35f395f51905f5260205260409020541690565b6001600160a01b038581165f81815260208690526040808220805473ffffffffffffffffffffffffffffffffffffffff1916898616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46108a3818461165d87611f44565b611f4e565b6001600160a01b0381165f9081527fe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d0160205260408120545f5160206137d35f395f51905f5290610859906120b2565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610775826120dd565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610775565b611768612105565b610a858282612143565b61177a612105565b610985816040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506121a6565b610ae7612105565b6117c9612105565b61098581612218565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100916107b1906131a8565b60605f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1006107a0565b80545f90801561187e57611865836114f9600184613462565b54660100000000000090046001600160d01b0316610859565b5f9392505050565b5f33611893818585611b4f565b61189d8484612220565b949350505050565b6001600160a01b0382166118ce575f60405163ec442f0560e01b81526004016109b69190612cfc565b610a855f838361222d565b5f6107756118e5611372565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61193088888888612238565b92509250925061194082826122f2565b50909695505050505050565b6001600160a01b0382165f9081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb00602052604090208054600181019091558181146109035782816040517f752d88c00000000000000000000000000000000000000000000000000000000081526004016109b6929190613488565b6040805180820182525f80825260208083018290526001600160a01b03861682527fe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d019052919091205f5160206137d35f395f51905f529061189d90846123f3565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038516611a8c575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016109b69190612cfc565b6001600160a01b038416611ace575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016109b69190612cfc565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115610c9557836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051611b409190612c21565b60405180910390a35050505050565b6001600160a01b038381165f8181527f17362d2595b5f80a872a5bc168967525161500ca3618caf47c0af678e68e5412602090815260408083205494871683528083205491839052808320549383529091205460ff9384169391821692821691168315611bbf5750505050505050565b8215611bce5750505050505050565b8015611c285781611bf15760405162461bcd60e51b81526004016109b6906134d3565b84611bfb88610a93565b03611067576001600160a01b0387165f908152602081905260409020805460ff1916905550505050505050565b81156110675780611bf15760405162461bcd60e51b81526004016109b69061353b565b5f33611c58858285612463565b611c638585856124fe565b506001949350505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610a855780826040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526004016109b6929190613488565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611d16612574565b611d1e6125ef565b4630604051602001611d3495949392919061354b565b60405160208183030381529060405280519060200120905090565b5f65ffffffffffff821115611d7c576030826040516306dfcc6560e41b81526004016109b69291906135aa565b5090565b5f60018211611d8d575090565b8160017001000000000000000000000000000000008210611db35760809190911c9060401b5b680100000000000000008210611dce5760409190911c9060201b5b6401000000008210611de55760209190911c9060101b5b620100008210611dfa5760109190911c9060081b5b6101008210611e0e5760089190911c9060041b5b60108210611e215760049190911c9060021b5b60048210611e2d5760011b5b600302600190811c90818581611e4557611e456135b8565b048201901c90506001818581611e5d57611e5d6135b8565b048201901c90506001818581611e7557611e756135b8565b048201901c90506001818581611e8d57611e8d6135b8565b048201901c90506001818581611ea557611ea56135b8565b048201901c90506001818581611ebd57611ebd6135b8565b048201901c9050611edc818581611ed657611ed66135b8565b04821190565b90039392505050565b5f5b81831015611f3c575f611efa8484612644565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff161115611f2857809250611f36565b611f33816001613475565b93505b50611ee7565b509392505050565b5f61077582610a93565b5f5160206137d35f395f51905f526001600160a01b0384811690841614801590611f7757505f82115b156108a3576001600160a01b03841615612017576001600160a01b0384165f90815260018201602052604081208190611fbb9061265e611fb687612669565b612697565b6001600160d01b031691506001600160d01b03169150856001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161200c9291906135cc565b60405180910390a250505b6001600160a01b038316156108a3576001600160a01b0383165f90815260018201602052604081208190612051906126cf611fb687612669565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516120a29291906135cc565b60405180910390a2505050505050565b5f63ffffffff821115611d7c576020826040516306dfcc6560e41b81526004016109b69291906135aa565b5f807f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb00610ab7565b61210d6126da565b610ae7576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214b612105565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036121978482613666565b50600481016108a38382613666565b6121ae612105565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1026121fa8482613666565b50600381016122098382613666565b505f8082556001909101555050565b61122d612105565b5f336108408185856124fe565b6109038383836126f8565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561227157505f915060039050826122e8565b5f6001888888886040515f81526020016040526040516122949493929190613722565b6020604051602081039080840390855afa1580156122b4573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122df57505f9250600191508290506122e8565b92505f91508190505b9450945094915050565b5f8260038111156123055761230561373d565b0361230e575050565b60018260038111156123225761232261373d565b03612359576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600282600381111561236d5761236d61373d565b036123a6576040517ffce698f70000000000000000000000000000000000000000000000000000000081526109b6908290600401612c21565b60038260038111156123ba576123ba61373d565b03610a8557806040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004016109b69190612c21565b604080518082019091525f8082526020820152825f018263ffffffff168154811061242057612420613335565b5f9182526020918290206040805180820190915291015465ffffffffffff81168252660100000000000090046001600160d01b0316918101919091529392505050565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f198110156108a357818110156124f0578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016109b693929190613751565b6108a384848484035f611a29565b6001600160a01b038316612540575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016109b69190612cfc565b6001600160a01b038216612569575f60405163ec442f0560e01b81526004016109b69190612cfc565b61090383838361222d565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1008161259f6117d2565b8051909150156125b757805160209091012092915050565b815480156125c6579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1008161261a611823565b80519091501561263257805160209091012092915050565b600182015480156125c6579392505050565b5f6126526002848418613779565b61085990848416613475565b5f610859828461378c565b5f6001600160d01b03821115611d7c5760d0826040516306dfcc6560e41b81526004016109b69291906135aa565b5f5f6126c26126a4610dd0565b6126ba6126b08861184c565b868863ffffffff16565b879190612790565b915091505b935093915050565b5f61085982846137af565b5f6126e3611738565b5468010000000000000000900460ff16919050565b61270383838361279d565b6001600160a01b038316612785575f61273a7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b90506001600160d01b03808211156127825781816040517f1cb15d260000000000000000000000000000000000000000000000000000000081526004016109b69291906135cc565b50505b6109038383836128ed565b5f806126c2858585612980565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b0384166127ea5781816002015f8282546127df9190613475565b909155506128609050565b6001600160a01b0384165f9081526020829052604090205482811015612842578481846040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016109b693929190613751565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b03831661287e57600281018054839003905561289c565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128df9190612c21565b60405180910390a350505050565b5f5160206137d35f395f51905f526001600160a01b03841661291f5761291c816002016126cf611fb685612669565b50505b6001600160a01b038316612943576129408160020161265e611fb685612669565b50505b6001600160a01b038481165f9081525f5160206137d35f395f51905f5260205260408082205486841683529120546108a392918216911684611f4e565b82545f9081908015612a98575f61299c876114f9600185613462565b805490915065ffffffffffff80821691660100000000000090046001600160d01b03169088168211156129fb576040517f2520601d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff1603612a3757825465ffffffffffff1666010000000000006001600160d01b03891602178355612a8a565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f815291909120945191519092166601000000000000029216919091179101555b94508593506126c792505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a81529182209551925190931666010000000000000291909316179201919091559050816126c7565b7fffffffff0000000000000000000000000000000000000000000000000000000081165b8114610985575f5ffd5b803561077581612af5565b5f60208284031215612b4157612b415f5ffd5b6108598383612b23565b8015155b82525050565b602081016107758284612b4b565b8281835e505f910152565b5f612b77825190565b808452602084019350612b8e818560208601612b63565b601f01601f19169290920192915050565b602080825281016108598184612b6e565b5f6001600160a01b038216610775565b612b1981612bb0565b803561077581612bc0565b80612b19565b803561077581612bd4565b5f5f60408385031215612bf957612bf95f5ffd5b612c038484612bc9565b9150612c128460208501612bda565b90509250929050565b80612b4f565b602081016107758284612c1b565b5f5f5f60608486031215612c4457612c445f5ffd5b612c4e8585612bc9565b9250612c5d8560208601612bc9565b9150612c6c8560408601612bda565b90509250925092565b5f60208284031215612c8857612c885f5ffd5b6108598383612bda565b5f5f60408385031215612ca657612ca65f5ffd5b612cb08484612bda565b9150612c128460208501612bc9565b60ff8116612b4f565b602081016107758284612cbf565b5f60208284031215612ce957612ce95f5ffd5b6108598383612bc9565b612b4f81612bb0565b602081016107758284612cf3565b63ffffffff8116612b4f565b602081016107758284612d0a565b7fff000000000000000000000000000000000000000000000000000000000000008116612b4f565b612d568282612c1b565b5060200190565b60200190565b5f612d6c825190565b80845260209384019383015f5b82811015612d9e578151612d8d8782612d4c565b965050602082019150600101612d79565b5093949350505050565b60e08101612db6828a612d24565b8181036020830152612dc88189612b6e565b90508181036040830152612ddc8188612b6e565b9050612deb6060830187612c1b565b612df86080830186612cf3565b612e0560a0830185612c1b565b81810360c0830152612e178184612d63565b9998505050505050505050565b65ffffffffffff8116612b4f565b602081016107758284612e24565b634e487b7160e01b5f52604160045260245ffd5b601f19601f830116810181811067ffffffffffffffff82111715612e7a57612e7a612e40565b6040525050565b5f612e8b60405190565b9050612e978282612e54565b919050565b5f67ffffffffffffffff821115612eb557612eb5612e40565b5060209081020190565b801515612b19565b803561077581612ebf565b5f60608284031215612ee557612ee55f5ffd5b612eef6060612e81565b9050612efb8383612bc9565b8152612f0a8360208401612bda565b6020820152612f1c8360408401612ec7565b604082015292915050565b5f612f39612f3484612e9c565b612e81565b83815290506020810160608402830185811115612f5757612f575f5ffd5b835b81811015612f7b57612f6b8782612ed2565b8352602090920191606001612f59565b5050509392505050565b5f82601f830112612f9757612f975f5ffd5b61085983833560208501612f27565b5f60208284031215612fb957612fb95f5ffd5b813567ffffffffffffffff811115612fd257612fd25f5ffd5b61189d84828501612f85565b60ff8116612b19565b803561077581612fde565b5f5f5f5f5f5f60c0878903121561300a5761300a5f5ffd5b6130148888612bc9565b95506130238860208901612bda565b94506130328860408901612bda565b93506130418860608901612fe7565b92506130508860808901612bda565b915061305f8860a08901612bda565b90509295509295509295565b5f5f5f5f5f5f5f60e0888a031215613084576130845f5ffd5b61308e8989612bc9565b965061309d8960208a01612bc9565b95506130ac8960408a01612bda565b94506130bb8960608a01612bda565b93506130ca8960808a01612fe7565b92506130d98960a08a01612bda565b91506130e88960c08a01612bda565b905092959891949750929550565b5f5f6040838503121561310a5761310a5f5ffd5b612cb08484612bc9565b63ffffffff8116612b19565b803561077581613114565b5f5f6040838503121561313f5761313f5f5ffd5b6131498484612bc9565b9150612c128460208501613120565b6001600160d01b038116612b4f565b80516131738382612e24565b5060208101516109036020840182613158565b604081016107758284613167565b634e487b7160e01b5f52602260045260245ffd5b6002810460018216806131bc57607f821691505b6020821081036131ce576131ce613194565b50919050565b600f8152602081017f496e76616c6964206163636f756e74000000000000000000000000000000000081529050612d5d565b60208082528101610775816131d4565b5f61077582613223565b90565b67ffffffffffffffff1690565b612b4f81613216565b602081016107758284613230565b60158152602081017f4549503731323a20556e696e697469616c697a6564000000000000000000000081529050612d5d565b6020808252810161077581613247565b600e8152602081017f416c7265616479206c6f636b656400000000000000000000000000000000000081529050612d5d565b6020808252810161077581613289565b60268152602081017f496e697469616c20616c6c6f636174696f6e7320616c726561647920636f6e6681527f6967757265640000000000000000000000000000000000000000000000000000602082015290505b60400190565b60208082528101610775816132cb565b634e487b7160e01b5f52603260045260245ffd5b60178152602081017f416d6f756e74206d75737420626520706f73697469766500000000000000000081529050612d5d565b6020808252810161077581613349565b608081016133998287612c1b565b6133a66020830186612cf3565b6133b36040830185612c1b565b6133c06060830184612c1b565b95945050505050565b60c081016133d78289612c1b565b6133e46020830188612cf3565b6133f16040830187612cf3565b6133fe6060830186612c1b565b61340b6080830185612c1b565b61152160a0830184612c1b565b604081016134268285612cf3565b6108596020830184612cf3565b604081016134418285612c1b565b6108596020830184612e24565b634e487b7160e01b5f52601160045260245ffd5b818103818111156107755761077561344e565b808201808211156107755761077561344e565b604081016134968285612cf3565b6108596020830184612c1b565b60208082527f4c6f636b65643a207472616e73666572206f6e6c7920746f2076657374696e679101908152612d5d565b60208082528101610775816134a3565b60398152602081017f43616e206f6e6c79207472616e73666572206c6f636b656420746f6b656e732081527f746f206f74686572206c6f636b6564206163636f756e74732e000000000000006020820152905061331f565b60208082528101610775816134e3565b60a081016135598288612c1b565b6135666020830187612c1b565b6135736040830186612c1b565b6135806060830185612c1b565b61358d6080830184612cf3565b9695505050505050565b5f60ff8216610775565b612b4f81613597565b6040810161349682856135a1565b634e487b7160e01b5f52601260045260245ffd5b604081016134968285612c1b565b5f6107756132208381565b6135ee836135da565b81545f1960089490940293841b1916921b91909117905550565b5f6109038184846135e5565b81811015610a85576136265f82613608565b600101613614565b601f821115610903575f818152602090206020601f850104810160208510156136545750805b610c956020601f860104830182613614565b815167ffffffffffffffff81111561368057613680612e40565b61368a82546131a8565b61369582828561362e565b506020601f8211600181146136c8575f83156136b15750848201515b5f19600885021c1981166002850217855550610c95565b5f84815260208120601f198516915b828110156136f757878501518255602094850194600190920191016136d7565b508482101561371357838701515f19601f87166008021c191681555b50505050600202600101905550565b608081016137308287612c1b565b6133a66020830186612cbf565b634e487b7160e01b5f52602160045260245ffd5b6060810161375f8286612cf3565b61376c6020830185612c1b565b61189d6040830184612c1b565b5f82613787576137876135b8565b500490565b6001600160d01b039182169190811690828203908111156107755761077561344e565b6001600160d01b039182169190811690828201908111156107755761077561344e56fee8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d00a2646970667358221220251ea70af387f3d138d39ac86dee22aa167980788788b130debd77bc49a0957764736f6c634300081c0033", +} + +// TenABI is the input ABI used to generate the binding from. +// Deprecated: Use TenMetaData.ABI instead. +var TenABI = TenMetaData.ABI + +// TenBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use TenMetaData.Bin instead. +var TenBin = TenMetaData.Bin + +// DeployTen deploys a new Ethereum contract, binding an instance of Ten to it. +func DeployTen(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Ten, error) { + parsed, err := TenMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(TenBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Ten{TenCaller: TenCaller{contract: contract}, TenTransactor: TenTransactor{contract: contract}, TenFilterer: TenFilterer{contract: contract}}, nil +} + +// Ten is an auto generated Go binding around an Ethereum contract. +type Ten struct { + TenCaller // Read-only binding to the contract + TenTransactor // Write-only binding to the contract + TenFilterer // Log filterer for contract events +} + +// TenCaller is an auto generated read-only Go binding around an Ethereum contract. +type TenCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// TenTransactor is an auto generated write-only Go binding around an Ethereum contract. +type TenTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// TenFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type TenFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// TenSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type TenSession struct { + Contract *Ten // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// TenCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type TenCallerSession struct { + Contract *TenCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// TenTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type TenTransactorSession struct { + Contract *TenTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// TenRaw is an auto generated low-level Go binding around an Ethereum contract. +type TenRaw struct { + Contract *Ten // Generic contract binding to access the raw methods on +} + +// TenCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type TenCallerRaw struct { + Contract *TenCaller // Generic read-only contract binding to access the raw methods on +} + +// TenTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type TenTransactorRaw struct { + Contract *TenTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewTen creates a new instance of Ten, bound to a specific deployed contract. +func NewTen(address common.Address, backend bind.ContractBackend) (*Ten, error) { + contract, err := bindTen(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Ten{TenCaller: TenCaller{contract: contract}, TenTransactor: TenTransactor{contract: contract}, TenFilterer: TenFilterer{contract: contract}}, nil +} + +// NewTenCaller creates a new read-only instance of Ten, bound to a specific deployed contract. +func NewTenCaller(address common.Address, caller bind.ContractCaller) (*TenCaller, error) { + contract, err := bindTen(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &TenCaller{contract: contract}, nil +} + +// NewTenTransactor creates a new write-only instance of Ten, bound to a specific deployed contract. +func NewTenTransactor(address common.Address, transactor bind.ContractTransactor) (*TenTransactor, error) { + contract, err := bindTen(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &TenTransactor{contract: contract}, nil +} + +// NewTenFilterer creates a new log filterer instance of Ten, bound to a specific deployed contract. +func NewTenFilterer(address common.Address, filterer bind.ContractFilterer) (*TenFilterer, error) { + contract, err := bindTen(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &TenFilterer{contract: contract}, nil +} + +// bindTen binds a generic wrapper to an already deployed contract. +func bindTen(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := TenMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Ten *TenRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Ten.Contract.TenCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Ten *TenRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Ten.Contract.TenTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Ten *TenRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Ten.Contract.TenTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Ten *TenCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Ten.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Ten *TenTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Ten.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Ten *TenTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Ten.Contract.contract.Transact(opts, method, params...) +} + +// CLOCKMODE is a free data retrieval call binding the contract method 0x4bf5d7e9. +// +// Solidity: function CLOCK_MODE() view returns(string) +func (_Ten *TenCaller) CLOCKMODE(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "CLOCK_MODE") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// CLOCKMODE is a free data retrieval call binding the contract method 0x4bf5d7e9. +// +// Solidity: function CLOCK_MODE() view returns(string) +func (_Ten *TenSession) CLOCKMODE() (string, error) { + return _Ten.Contract.CLOCKMODE(&_Ten.CallOpts) +} + +// CLOCKMODE is a free data retrieval call binding the contract method 0x4bf5d7e9. +// +// Solidity: function CLOCK_MODE() view returns(string) +func (_Ten *TenCallerSession) CLOCKMODE() (string, error) { + return _Ten.Contract.CLOCKMODE(&_Ten.CallOpts) +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_Ten *TenCaller) DEFAULTADMINROLE(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "DEFAULT_ADMIN_ROLE") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_Ten *TenSession) DEFAULTADMINROLE() ([32]byte, error) { + return _Ten.Contract.DEFAULTADMINROLE(&_Ten.CallOpts) +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_Ten *TenCallerSession) DEFAULTADMINROLE() ([32]byte, error) { + return _Ten.Contract.DEFAULTADMINROLE(&_Ten.CallOpts) +} + +// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515. +// +// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32) +func (_Ten *TenCaller) DOMAINSEPARATOR(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "DOMAIN_SEPARATOR") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515. +// +// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32) +func (_Ten *TenSession) DOMAINSEPARATOR() ([32]byte, error) { + return _Ten.Contract.DOMAINSEPARATOR(&_Ten.CallOpts) +} + +// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515. +// +// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32) +func (_Ten *TenCallerSession) DOMAINSEPARATOR() ([32]byte, error) { + return _Ten.Contract.DOMAINSEPARATOR(&_Ten.CallOpts) +} + +// VESTINGROLE is a free data retrieval call binding the contract method 0xa1c1418c. +// +// Solidity: function VESTING_ROLE() view returns(bytes32) +func (_Ten *TenCaller) VESTINGROLE(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "VESTING_ROLE") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// VESTINGROLE is a free data retrieval call binding the contract method 0xa1c1418c. +// +// Solidity: function VESTING_ROLE() view returns(bytes32) +func (_Ten *TenSession) VESTINGROLE() ([32]byte, error) { + return _Ten.Contract.VESTINGROLE(&_Ten.CallOpts) +} + +// VESTINGROLE is a free data retrieval call binding the contract method 0xa1c1418c. +// +// Solidity: function VESTING_ROLE() view returns(bytes32) +func (_Ten *TenCallerSession) VESTINGROLE() ([32]byte, error) { + return _Ten.Contract.VESTINGROLE(&_Ten.CallOpts) +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256) +func (_Ten *TenCaller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "allowance", owner, spender) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256) +func (_Ten *TenSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) { + return _Ten.Contract.Allowance(&_Ten.CallOpts, owner, spender) +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256) +func (_Ten *TenCallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) { + return _Ten.Contract.Allowance(&_Ten.CallOpts, owner, spender) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_Ten *TenCaller) BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "balanceOf", account) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_Ten *TenSession) BalanceOf(account common.Address) (*big.Int, error) { + return _Ten.Contract.BalanceOf(&_Ten.CallOpts, account) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_Ten *TenCallerSession) BalanceOf(account common.Address) (*big.Int, error) { + return _Ten.Contract.BalanceOf(&_Ten.CallOpts, account) +} + +// Checkpoints is a free data retrieval call binding the contract method 0xf1127ed8. +// +// Solidity: function checkpoints(address account, uint32 pos) view returns((uint48,uint208)) +func (_Ten *TenCaller) Checkpoints(opts *bind.CallOpts, account common.Address, pos uint32) (CheckpointsCheckpoint208, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "checkpoints", account, pos) + + if err != nil { + return *new(CheckpointsCheckpoint208), err + } + + out0 := *abi.ConvertType(out[0], new(CheckpointsCheckpoint208)).(*CheckpointsCheckpoint208) + + return out0, err + +} + +// Checkpoints is a free data retrieval call binding the contract method 0xf1127ed8. +// +// Solidity: function checkpoints(address account, uint32 pos) view returns((uint48,uint208)) +func (_Ten *TenSession) Checkpoints(account common.Address, pos uint32) (CheckpointsCheckpoint208, error) { + return _Ten.Contract.Checkpoints(&_Ten.CallOpts, account, pos) +} + +// Checkpoints is a free data retrieval call binding the contract method 0xf1127ed8. +// +// Solidity: function checkpoints(address account, uint32 pos) view returns((uint48,uint208)) +func (_Ten *TenCallerSession) Checkpoints(account common.Address, pos uint32) (CheckpointsCheckpoint208, error) { + return _Ten.Contract.Checkpoints(&_Ten.CallOpts, account, pos) +} + +// Clock is a free data retrieval call binding the contract method 0x91ddadf4. +// +// Solidity: function clock() view returns(uint48) +func (_Ten *TenCaller) Clock(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "clock") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Clock is a free data retrieval call binding the contract method 0x91ddadf4. +// +// Solidity: function clock() view returns(uint48) +func (_Ten *TenSession) Clock() (*big.Int, error) { + return _Ten.Contract.Clock(&_Ten.CallOpts) +} + +// Clock is a free data retrieval call binding the contract method 0x91ddadf4. +// +// Solidity: function clock() view returns(uint48) +func (_Ten *TenCallerSession) Clock() (*big.Int, error) { + return _Ten.Contract.Clock(&_Ten.CallOpts) +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_Ten *TenCaller) Decimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "decimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_Ten *TenSession) Decimals() (uint8, error) { + return _Ten.Contract.Decimals(&_Ten.CallOpts) +} + +// Decimals is a free data retrieval call binding the contract method 0x313ce567. +// +// Solidity: function decimals() view returns(uint8) +func (_Ten *TenCallerSession) Decimals() (uint8, error) { + return _Ten.Contract.Decimals(&_Ten.CallOpts) +} + +// Delegates is a free data retrieval call binding the contract method 0x587cde1e. +// +// Solidity: function delegates(address account) view returns(address) +func (_Ten *TenCaller) Delegates(opts *bind.CallOpts, account common.Address) (common.Address, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "delegates", account) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Delegates is a free data retrieval call binding the contract method 0x587cde1e. +// +// Solidity: function delegates(address account) view returns(address) +func (_Ten *TenSession) Delegates(account common.Address) (common.Address, error) { + return _Ten.Contract.Delegates(&_Ten.CallOpts, account) +} + +// Delegates is a free data retrieval call binding the contract method 0x587cde1e. +// +// Solidity: function delegates(address account) view returns(address) +func (_Ten *TenCallerSession) Delegates(account common.Address) (common.Address, error) { + return _Ten.Contract.Delegates(&_Ten.CallOpts, account) +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_Ten *TenCaller) Eip712Domain(opts *bind.CallOpts) (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "eip712Domain") + + outstruct := new(struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.Fields = *abi.ConvertType(out[0], new([1]byte)).(*[1]byte) + outstruct.Name = *abi.ConvertType(out[1], new(string)).(*string) + outstruct.Version = *abi.ConvertType(out[2], new(string)).(*string) + outstruct.ChainId = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int) + outstruct.VerifyingContract = *abi.ConvertType(out[4], new(common.Address)).(*common.Address) + outstruct.Salt = *abi.ConvertType(out[5], new([32]byte)).(*[32]byte) + outstruct.Extensions = *abi.ConvertType(out[6], new([]*big.Int)).(*[]*big.Int) + + return *outstruct, err + +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_Ten *TenSession) Eip712Domain() (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + return _Ten.Contract.Eip712Domain(&_Ten.CallOpts) +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_Ten *TenCallerSession) Eip712Domain() (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + return _Ten.Contract.Eip712Domain(&_Ten.CallOpts) +} + +// GetPastTotalSupply is a free data retrieval call binding the contract method 0x8e539e8c. +// +// Solidity: function getPastTotalSupply(uint256 timepoint) view returns(uint256) +func (_Ten *TenCaller) GetPastTotalSupply(opts *bind.CallOpts, timepoint *big.Int) (*big.Int, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "getPastTotalSupply", timepoint) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetPastTotalSupply is a free data retrieval call binding the contract method 0x8e539e8c. +// +// Solidity: function getPastTotalSupply(uint256 timepoint) view returns(uint256) +func (_Ten *TenSession) GetPastTotalSupply(timepoint *big.Int) (*big.Int, error) { + return _Ten.Contract.GetPastTotalSupply(&_Ten.CallOpts, timepoint) +} + +// GetPastTotalSupply is a free data retrieval call binding the contract method 0x8e539e8c. +// +// Solidity: function getPastTotalSupply(uint256 timepoint) view returns(uint256) +func (_Ten *TenCallerSession) GetPastTotalSupply(timepoint *big.Int) (*big.Int, error) { + return _Ten.Contract.GetPastTotalSupply(&_Ten.CallOpts, timepoint) +} + +// GetPastVotes is a free data retrieval call binding the contract method 0x3a46b1a8. +// +// Solidity: function getPastVotes(address account, uint256 timepoint) view returns(uint256) +func (_Ten *TenCaller) GetPastVotes(opts *bind.CallOpts, account common.Address, timepoint *big.Int) (*big.Int, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "getPastVotes", account, timepoint) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetPastVotes is a free data retrieval call binding the contract method 0x3a46b1a8. +// +// Solidity: function getPastVotes(address account, uint256 timepoint) view returns(uint256) +func (_Ten *TenSession) GetPastVotes(account common.Address, timepoint *big.Int) (*big.Int, error) { + return _Ten.Contract.GetPastVotes(&_Ten.CallOpts, account, timepoint) +} + +// GetPastVotes is a free data retrieval call binding the contract method 0x3a46b1a8. +// +// Solidity: function getPastVotes(address account, uint256 timepoint) view returns(uint256) +func (_Ten *TenCallerSession) GetPastVotes(account common.Address, timepoint *big.Int) (*big.Int, error) { + return _Ten.Contract.GetPastVotes(&_Ten.CallOpts, account, timepoint) +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_Ten *TenCaller) GetRoleAdmin(opts *bind.CallOpts, role [32]byte) ([32]byte, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "getRoleAdmin", role) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_Ten *TenSession) GetRoleAdmin(role [32]byte) ([32]byte, error) { + return _Ten.Contract.GetRoleAdmin(&_Ten.CallOpts, role) +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_Ten *TenCallerSession) GetRoleAdmin(role [32]byte) ([32]byte, error) { + return _Ten.Contract.GetRoleAdmin(&_Ten.CallOpts, role) +} + +// GetVotes is a free data retrieval call binding the contract method 0x9ab24eb0. +// +// Solidity: function getVotes(address account) view returns(uint256) +func (_Ten *TenCaller) GetVotes(opts *bind.CallOpts, account common.Address) (*big.Int, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "getVotes", account) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetVotes is a free data retrieval call binding the contract method 0x9ab24eb0. +// +// Solidity: function getVotes(address account) view returns(uint256) +func (_Ten *TenSession) GetVotes(account common.Address) (*big.Int, error) { + return _Ten.Contract.GetVotes(&_Ten.CallOpts, account) +} + +// GetVotes is a free data retrieval call binding the contract method 0x9ab24eb0. +// +// Solidity: function getVotes(address account) view returns(uint256) +func (_Ten *TenCallerSession) GetVotes(account common.Address) (*big.Int, error) { + return _Ten.Contract.GetVotes(&_Ten.CallOpts, account) +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_Ten *TenCaller) HasRole(opts *bind.CallOpts, role [32]byte, account common.Address) (bool, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "hasRole", role, account) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_Ten *TenSession) HasRole(role [32]byte, account common.Address) (bool, error) { + return _Ten.Contract.HasRole(&_Ten.CallOpts, role, account) +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_Ten *TenCallerSession) HasRole(role [32]byte, account common.Address) (bool, error) { + return _Ten.Contract.HasRole(&_Ten.CallOpts, role, account) +} + +// Locked is a free data retrieval call binding the contract method 0xcbf9fe5f. +// +// Solidity: function locked(address ) view returns(bool) +func (_Ten *TenCaller) Locked(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "locked", arg0) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// Locked is a free data retrieval call binding the contract method 0xcbf9fe5f. +// +// Solidity: function locked(address ) view returns(bool) +func (_Ten *TenSession) Locked(arg0 common.Address) (bool, error) { + return _Ten.Contract.Locked(&_Ten.CallOpts, arg0) +} + +// Locked is a free data retrieval call binding the contract method 0xcbf9fe5f. +// +// Solidity: function locked(address ) view returns(bool) +func (_Ten *TenCallerSession) Locked(arg0 common.Address) (bool, error) { + return _Ten.Contract.Locked(&_Ten.CallOpts, arg0) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_Ten *TenCaller) Name(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "name") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_Ten *TenSession) Name() (string, error) { + return _Ten.Contract.Name(&_Ten.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_Ten *TenCallerSession) Name() (string, error) { + return _Ten.Contract.Name(&_Ten.CallOpts) +} + +// Nonces is a free data retrieval call binding the contract method 0x7ecebe00. +// +// Solidity: function nonces(address owner) view returns(uint256) +func (_Ten *TenCaller) Nonces(opts *bind.CallOpts, owner common.Address) (*big.Int, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "nonces", owner) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Nonces is a free data retrieval call binding the contract method 0x7ecebe00. +// +// Solidity: function nonces(address owner) view returns(uint256) +func (_Ten *TenSession) Nonces(owner common.Address) (*big.Int, error) { + return _Ten.Contract.Nonces(&_Ten.CallOpts, owner) +} + +// Nonces is a free data retrieval call binding the contract method 0x7ecebe00. +// +// Solidity: function nonces(address owner) view returns(uint256) +func (_Ten *TenCallerSession) Nonces(owner common.Address) (*big.Int, error) { + return _Ten.Contract.Nonces(&_Ten.CallOpts, owner) +} + +// NumCheckpoints is a free data retrieval call binding the contract method 0x6fcfff45. +// +// Solidity: function numCheckpoints(address account) view returns(uint32) +func (_Ten *TenCaller) NumCheckpoints(opts *bind.CallOpts, account common.Address) (uint32, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "numCheckpoints", account) + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// NumCheckpoints is a free data retrieval call binding the contract method 0x6fcfff45. +// +// Solidity: function numCheckpoints(address account) view returns(uint32) +func (_Ten *TenSession) NumCheckpoints(account common.Address) (uint32, error) { + return _Ten.Contract.NumCheckpoints(&_Ten.CallOpts, account) +} + +// NumCheckpoints is a free data retrieval call binding the contract method 0x6fcfff45. +// +// Solidity: function numCheckpoints(address account) view returns(uint32) +func (_Ten *TenCallerSession) NumCheckpoints(account common.Address) (uint32, error) { + return _Ten.Contract.NumCheckpoints(&_Ten.CallOpts, account) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_Ten *TenCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_Ten *TenSession) Owner() (common.Address, error) { + return _Ten.Contract.Owner(&_Ten.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_Ten *TenCallerSession) Owner() (common.Address, error) { + return _Ten.Contract.Owner(&_Ten.CallOpts) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Ten *TenCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Ten *TenSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _Ten.Contract.SupportsInterface(&_Ten.CallOpts, interfaceId) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Ten *TenCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _Ten.Contract.SupportsInterface(&_Ten.CallOpts, interfaceId) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_Ten *TenCaller) Symbol(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "symbol") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_Ten *TenSession) Symbol() (string, error) { + return _Ten.Contract.Symbol(&_Ten.CallOpts) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_Ten *TenCallerSession) Symbol() (string, error) { + return _Ten.Contract.Symbol(&_Ten.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_Ten *TenCaller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Ten.contract.Call(opts, &out, "totalSupply") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_Ten *TenSession) TotalSupply() (*big.Int, error) { + return _Ten.Contract.TotalSupply(&_Ten.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_Ten *TenCallerSession) TotalSupply() (*big.Int, error) { + return _Ten.Contract.TotalSupply(&_Ten.CallOpts) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 value) returns(bool) +func (_Ten *TenTransactor) Approve(opts *bind.TransactOpts, spender common.Address, value *big.Int) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "approve", spender, value) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 value) returns(bool) +func (_Ten *TenSession) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) { + return _Ten.Contract.Approve(&_Ten.TransactOpts, spender, value) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address spender, uint256 value) returns(bool) +func (_Ten *TenTransactorSession) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) { + return _Ten.Contract.Approve(&_Ten.TransactOpts, spender, value) +} + +// CreateLockedAccount is a paid mutator transaction binding the contract method 0x8bcf86f8. +// +// Solidity: function createLockedAccount() returns(bool) +func (_Ten *TenTransactor) CreateLockedAccount(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "createLockedAccount") +} + +// CreateLockedAccount is a paid mutator transaction binding the contract method 0x8bcf86f8. +// +// Solidity: function createLockedAccount() returns(bool) +func (_Ten *TenSession) CreateLockedAccount() (*types.Transaction, error) { + return _Ten.Contract.CreateLockedAccount(&_Ten.TransactOpts) +} + +// CreateLockedAccount is a paid mutator transaction binding the contract method 0x8bcf86f8. +// +// Solidity: function createLockedAccount() returns(bool) +func (_Ten *TenTransactorSession) CreateLockedAccount() (*types.Transaction, error) { + return _Ten.Contract.CreateLockedAccount(&_Ten.TransactOpts) +} + +// Delegate is a paid mutator transaction binding the contract method 0x5c19a95c. +// +// Solidity: function delegate(address delegatee) returns() +func (_Ten *TenTransactor) Delegate(opts *bind.TransactOpts, delegatee common.Address) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "delegate", delegatee) +} + +// Delegate is a paid mutator transaction binding the contract method 0x5c19a95c. +// +// Solidity: function delegate(address delegatee) returns() +func (_Ten *TenSession) Delegate(delegatee common.Address) (*types.Transaction, error) { + return _Ten.Contract.Delegate(&_Ten.TransactOpts, delegatee) +} + +// Delegate is a paid mutator transaction binding the contract method 0x5c19a95c. +// +// Solidity: function delegate(address delegatee) returns() +func (_Ten *TenTransactorSession) Delegate(delegatee common.Address) (*types.Transaction, error) { + return _Ten.Contract.Delegate(&_Ten.TransactOpts, delegatee) +} + +// DelegateBySig is a paid mutator transaction binding the contract method 0xc3cda520. +// +// Solidity: function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) returns() +func (_Ten *TenTransactor) DelegateBySig(opts *bind.TransactOpts, delegatee common.Address, nonce *big.Int, expiry *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "delegateBySig", delegatee, nonce, expiry, v, r, s) +} + +// DelegateBySig is a paid mutator transaction binding the contract method 0xc3cda520. +// +// Solidity: function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) returns() +func (_Ten *TenSession) DelegateBySig(delegatee common.Address, nonce *big.Int, expiry *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) { + return _Ten.Contract.DelegateBySig(&_Ten.TransactOpts, delegatee, nonce, expiry, v, r, s) +} + +// DelegateBySig is a paid mutator transaction binding the contract method 0xc3cda520. +// +// Solidity: function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) returns() +func (_Ten *TenTransactorSession) DelegateBySig(delegatee common.Address, nonce *big.Int, expiry *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) { + return _Ten.Contract.DelegateBySig(&_Ten.TransactOpts, delegatee, nonce, expiry, v, r, s) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_Ten *TenTransactor) GrantRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "grantRole", role, account) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_Ten *TenSession) GrantRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Ten.Contract.GrantRole(&_Ten.TransactOpts, role, account) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_Ten *TenTransactorSession) GrantRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Ten.Contract.GrantRole(&_Ten.TransactOpts, role, account) +} + +// GrantVesting is a paid mutator transaction binding the contract method 0x4a3bbe2b. +// +// Solidity: function grantVesting(address account) returns() +func (_Ten *TenTransactor) GrantVesting(opts *bind.TransactOpts, account common.Address) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "grantVesting", account) +} + +// GrantVesting is a paid mutator transaction binding the contract method 0x4a3bbe2b. +// +// Solidity: function grantVesting(address account) returns() +func (_Ten *TenSession) GrantVesting(account common.Address) (*types.Transaction, error) { + return _Ten.Contract.GrantVesting(&_Ten.TransactOpts, account) +} + +// GrantVesting is a paid mutator transaction binding the contract method 0x4a3bbe2b. +// +// Solidity: function grantVesting(address account) returns() +func (_Ten *TenTransactorSession) GrantVesting(account common.Address) (*types.Transaction, error) { + return _Ten.Contract.GrantVesting(&_Ten.TransactOpts, account) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_Ten *TenTransactor) Initialize(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "initialize") +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_Ten *TenSession) Initialize() (*types.Transaction, error) { + return _Ten.Contract.Initialize(&_Ten.TransactOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_Ten *TenTransactorSession) Initialize() (*types.Transaction, error) { + return _Ten.Contract.Initialize(&_Ten.TransactOpts) +} + +// InitializeAllocations is a paid mutator transaction binding the contract method 0xa9fb3efd. +// +// Solidity: function initializeAllocations((address,uint256,bool)[] allocations) returns() +func (_Ten *TenTransactor) InitializeAllocations(opts *bind.TransactOpts, allocations []Erc20WithLockInitialAllocation) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "initializeAllocations", allocations) +} + +// InitializeAllocations is a paid mutator transaction binding the contract method 0xa9fb3efd. +// +// Solidity: function initializeAllocations((address,uint256,bool)[] allocations) returns() +func (_Ten *TenSession) InitializeAllocations(allocations []Erc20WithLockInitialAllocation) (*types.Transaction, error) { + return _Ten.Contract.InitializeAllocations(&_Ten.TransactOpts, allocations) +} + +// InitializeAllocations is a paid mutator transaction binding the contract method 0xa9fb3efd. +// +// Solidity: function initializeAllocations((address,uint256,bool)[] allocations) returns() +func (_Ten *TenTransactorSession) InitializeAllocations(allocations []Erc20WithLockInitialAllocation) (*types.Transaction, error) { + return _Ten.Contract.InitializeAllocations(&_Ten.TransactOpts, allocations) +} + +// Permit is a paid mutator transaction binding the contract method 0xd505accf. +// +// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns() +func (_Ten *TenTransactor) Permit(opts *bind.TransactOpts, owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "permit", owner, spender, value, deadline, v, r, s) +} + +// Permit is a paid mutator transaction binding the contract method 0xd505accf. +// +// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns() +func (_Ten *TenSession) Permit(owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) { + return _Ten.Contract.Permit(&_Ten.TransactOpts, owner, spender, value, deadline, v, r, s) +} + +// Permit is a paid mutator transaction binding the contract method 0xd505accf. +// +// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns() +func (_Ten *TenTransactorSession) Permit(owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) { + return _Ten.Contract.Permit(&_Ten.TransactOpts, owner, spender, value, deadline, v, r, s) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_Ten *TenTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_Ten *TenSession) RenounceOwnership() (*types.Transaction, error) { + return _Ten.Contract.RenounceOwnership(&_Ten.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_Ten *TenTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _Ten.Contract.RenounceOwnership(&_Ten.TransactOpts) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_Ten *TenTransactor) RenounceRole(opts *bind.TransactOpts, role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "renounceRole", role, callerConfirmation) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_Ten *TenSession) RenounceRole(role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _Ten.Contract.RenounceRole(&_Ten.TransactOpts, role, callerConfirmation) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_Ten *TenTransactorSession) RenounceRole(role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _Ten.Contract.RenounceRole(&_Ten.TransactOpts, role, callerConfirmation) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_Ten *TenTransactor) RevokeRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "revokeRole", role, account) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_Ten *TenSession) RevokeRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Ten.Contract.RevokeRole(&_Ten.TransactOpts, role, account) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_Ten *TenTransactorSession) RevokeRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Ten.Contract.RevokeRole(&_Ten.TransactOpts, role, account) +} + +// RevokeVesting is a paid mutator transaction binding the contract method 0x3b0da260. +// +// Solidity: function revokeVesting(address account) returns() +func (_Ten *TenTransactor) RevokeVesting(opts *bind.TransactOpts, account common.Address) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "revokeVesting", account) +} + +// RevokeVesting is a paid mutator transaction binding the contract method 0x3b0da260. +// +// Solidity: function revokeVesting(address account) returns() +func (_Ten *TenSession) RevokeVesting(account common.Address) (*types.Transaction, error) { + return _Ten.Contract.RevokeVesting(&_Ten.TransactOpts, account) +} + +// RevokeVesting is a paid mutator transaction binding the contract method 0x3b0da260. +// +// Solidity: function revokeVesting(address account) returns() +func (_Ten *TenTransactorSession) RevokeVesting(account common.Address) (*types.Transaction, error) { + return _Ten.Contract.RevokeVesting(&_Ten.TransactOpts, account) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 value) returns(bool) +func (_Ten *TenTransactor) Transfer(opts *bind.TransactOpts, to common.Address, value *big.Int) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "transfer", to, value) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 value) returns(bool) +func (_Ten *TenSession) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) { + return _Ten.Contract.Transfer(&_Ten.TransactOpts, to, value) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 value) returns(bool) +func (_Ten *TenTransactorSession) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) { + return _Ten.Contract.Transfer(&_Ten.TransactOpts, to, value) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 value) returns(bool) +func (_Ten *TenTransactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "transferFrom", from, to, value) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 value) returns(bool) +func (_Ten *TenSession) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) { + return _Ten.Contract.TransferFrom(&_Ten.TransactOpts, from, to, value) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 value) returns(bool) +func (_Ten *TenTransactorSession) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) { + return _Ten.Contract.TransferFrom(&_Ten.TransactOpts, from, to, value) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_Ten *TenTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _Ten.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_Ten *TenSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _Ten.Contract.TransferOwnership(&_Ten.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_Ten *TenTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _Ten.Contract.TransferOwnership(&_Ten.TransactOpts, newOwner) +} + +// TenApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the Ten contract. +type TenApprovalIterator struct { + Event *TenApproval // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TenApprovalIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TenApproval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TenApproval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TenApprovalIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TenApprovalIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TenApproval represents a Approval event raised by the Ten contract. +type TenApproval struct { + Owner common.Address + Spender common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_Ten *TenFilterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*TenApprovalIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var spenderRule []interface{} + for _, spenderItem := range spender { + spenderRule = append(spenderRule, spenderItem) + } + + logs, sub, err := _Ten.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule) + if err != nil { + return nil, err + } + return &TenApprovalIterator{contract: _Ten.contract, event: "Approval", logs: logs, sub: sub}, nil +} + +// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_Ten *TenFilterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *TenApproval, owner []common.Address, spender []common.Address) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var spenderRule []interface{} + for _, spenderItem := range spender { + spenderRule = append(spenderRule, spenderItem) + } + + logs, sub, err := _Ten.contract.WatchLogs(opts, "Approval", ownerRule, spenderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TenApproval) + if err := _Ten.contract.UnpackLog(event, "Approval", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_Ten *TenFilterer) ParseApproval(log types.Log) (*TenApproval, error) { + event := new(TenApproval) + if err := _Ten.contract.UnpackLog(event, "Approval", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TenDelegateChangedIterator is returned from FilterDelegateChanged and is used to iterate over the raw logs and unpacked data for DelegateChanged events raised by the Ten contract. +type TenDelegateChangedIterator struct { + Event *TenDelegateChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TenDelegateChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TenDelegateChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TenDelegateChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TenDelegateChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TenDelegateChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TenDelegateChanged represents a DelegateChanged event raised by the Ten contract. +type TenDelegateChanged struct { + Delegator common.Address + FromDelegate common.Address + ToDelegate common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegateChanged is a free log retrieval operation binding the contract event 0x3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f. +// +// Solidity: event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate) +func (_Ten *TenFilterer) FilterDelegateChanged(opts *bind.FilterOpts, delegator []common.Address, fromDelegate []common.Address, toDelegate []common.Address) (*TenDelegateChangedIterator, error) { + + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + var fromDelegateRule []interface{} + for _, fromDelegateItem := range fromDelegate { + fromDelegateRule = append(fromDelegateRule, fromDelegateItem) + } + var toDelegateRule []interface{} + for _, toDelegateItem := range toDelegate { + toDelegateRule = append(toDelegateRule, toDelegateItem) + } + + logs, sub, err := _Ten.contract.FilterLogs(opts, "DelegateChanged", delegatorRule, fromDelegateRule, toDelegateRule) + if err != nil { + return nil, err + } + return &TenDelegateChangedIterator{contract: _Ten.contract, event: "DelegateChanged", logs: logs, sub: sub}, nil +} + +// WatchDelegateChanged is a free log subscription operation binding the contract event 0x3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f. +// +// Solidity: event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate) +func (_Ten *TenFilterer) WatchDelegateChanged(opts *bind.WatchOpts, sink chan<- *TenDelegateChanged, delegator []common.Address, fromDelegate []common.Address, toDelegate []common.Address) (event.Subscription, error) { + + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + var fromDelegateRule []interface{} + for _, fromDelegateItem := range fromDelegate { + fromDelegateRule = append(fromDelegateRule, fromDelegateItem) + } + var toDelegateRule []interface{} + for _, toDelegateItem := range toDelegate { + toDelegateRule = append(toDelegateRule, toDelegateItem) + } + + logs, sub, err := _Ten.contract.WatchLogs(opts, "DelegateChanged", delegatorRule, fromDelegateRule, toDelegateRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TenDelegateChanged) + if err := _Ten.contract.UnpackLog(event, "DelegateChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegateChanged is a log parse operation binding the contract event 0x3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f. +// +// Solidity: event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate) +func (_Ten *TenFilterer) ParseDelegateChanged(log types.Log) (*TenDelegateChanged, error) { + event := new(TenDelegateChanged) + if err := _Ten.contract.UnpackLog(event, "DelegateChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TenDelegateVotesChangedIterator is returned from FilterDelegateVotesChanged and is used to iterate over the raw logs and unpacked data for DelegateVotesChanged events raised by the Ten contract. +type TenDelegateVotesChangedIterator struct { + Event *TenDelegateVotesChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TenDelegateVotesChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TenDelegateVotesChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TenDelegateVotesChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TenDelegateVotesChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TenDelegateVotesChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TenDelegateVotesChanged represents a DelegateVotesChanged event raised by the Ten contract. +type TenDelegateVotesChanged struct { + Delegate common.Address + PreviousVotes *big.Int + NewVotes *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegateVotesChanged is a free log retrieval operation binding the contract event 0xdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724. +// +// Solidity: event DelegateVotesChanged(address indexed delegate, uint256 previousVotes, uint256 newVotes) +func (_Ten *TenFilterer) FilterDelegateVotesChanged(opts *bind.FilterOpts, delegate []common.Address) (*TenDelegateVotesChangedIterator, error) { + + var delegateRule []interface{} + for _, delegateItem := range delegate { + delegateRule = append(delegateRule, delegateItem) + } + + logs, sub, err := _Ten.contract.FilterLogs(opts, "DelegateVotesChanged", delegateRule) + if err != nil { + return nil, err + } + return &TenDelegateVotesChangedIterator{contract: _Ten.contract, event: "DelegateVotesChanged", logs: logs, sub: sub}, nil +} + +// WatchDelegateVotesChanged is a free log subscription operation binding the contract event 0xdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724. +// +// Solidity: event DelegateVotesChanged(address indexed delegate, uint256 previousVotes, uint256 newVotes) +func (_Ten *TenFilterer) WatchDelegateVotesChanged(opts *bind.WatchOpts, sink chan<- *TenDelegateVotesChanged, delegate []common.Address) (event.Subscription, error) { + + var delegateRule []interface{} + for _, delegateItem := range delegate { + delegateRule = append(delegateRule, delegateItem) + } + + logs, sub, err := _Ten.contract.WatchLogs(opts, "DelegateVotesChanged", delegateRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TenDelegateVotesChanged) + if err := _Ten.contract.UnpackLog(event, "DelegateVotesChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegateVotesChanged is a log parse operation binding the contract event 0xdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724. +// +// Solidity: event DelegateVotesChanged(address indexed delegate, uint256 previousVotes, uint256 newVotes) +func (_Ten *TenFilterer) ParseDelegateVotesChanged(log types.Log) (*TenDelegateVotesChanged, error) { + event := new(TenDelegateVotesChanged) + if err := _Ten.contract.UnpackLog(event, "DelegateVotesChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TenEIP712DomainChangedIterator is returned from FilterEIP712DomainChanged and is used to iterate over the raw logs and unpacked data for EIP712DomainChanged events raised by the Ten contract. +type TenEIP712DomainChangedIterator struct { + Event *TenEIP712DomainChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TenEIP712DomainChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TenEIP712DomainChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TenEIP712DomainChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TenEIP712DomainChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TenEIP712DomainChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TenEIP712DomainChanged represents a EIP712DomainChanged event raised by the Ten contract. +type TenEIP712DomainChanged struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEIP712DomainChanged is a free log retrieval operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_Ten *TenFilterer) FilterEIP712DomainChanged(opts *bind.FilterOpts) (*TenEIP712DomainChangedIterator, error) { + + logs, sub, err := _Ten.contract.FilterLogs(opts, "EIP712DomainChanged") + if err != nil { + return nil, err + } + return &TenEIP712DomainChangedIterator{contract: _Ten.contract, event: "EIP712DomainChanged", logs: logs, sub: sub}, nil +} + +// WatchEIP712DomainChanged is a free log subscription operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_Ten *TenFilterer) WatchEIP712DomainChanged(opts *bind.WatchOpts, sink chan<- *TenEIP712DomainChanged) (event.Subscription, error) { + + logs, sub, err := _Ten.contract.WatchLogs(opts, "EIP712DomainChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TenEIP712DomainChanged) + if err := _Ten.contract.UnpackLog(event, "EIP712DomainChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEIP712DomainChanged is a log parse operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_Ten *TenFilterer) ParseEIP712DomainChanged(log types.Log) (*TenEIP712DomainChanged, error) { + event := new(TenEIP712DomainChanged) + if err := _Ten.contract.UnpackLog(event, "EIP712DomainChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TenInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Ten contract. +type TenInitializedIterator struct { + Event *TenInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TenInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TenInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TenInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TenInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TenInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TenInitialized represents a Initialized event raised by the Ten contract. +type TenInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Ten *TenFilterer) FilterInitialized(opts *bind.FilterOpts) (*TenInitializedIterator, error) { + + logs, sub, err := _Ten.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &TenInitializedIterator{contract: _Ten.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Ten *TenFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *TenInitialized) (event.Subscription, error) { + + logs, sub, err := _Ten.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TenInitialized) + if err := _Ten.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Ten *TenFilterer) ParseInitialized(log types.Log) (*TenInitialized, error) { + event := new(TenInitialized) + if err := _Ten.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TenOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the Ten contract. +type TenOwnershipTransferredIterator struct { + Event *TenOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TenOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TenOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TenOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TenOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TenOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TenOwnershipTransferred represents a OwnershipTransferred event raised by the Ten contract. +type TenOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_Ten *TenFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*TenOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _Ten.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &TenOwnershipTransferredIterator{contract: _Ten.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_Ten *TenFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *TenOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _Ten.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TenOwnershipTransferred) + if err := _Ten.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_Ten *TenFilterer) ParseOwnershipTransferred(log types.Log) (*TenOwnershipTransferred, error) { + event := new(TenOwnershipTransferred) + if err := _Ten.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TenRoleAdminChangedIterator is returned from FilterRoleAdminChanged and is used to iterate over the raw logs and unpacked data for RoleAdminChanged events raised by the Ten contract. +type TenRoleAdminChangedIterator struct { + Event *TenRoleAdminChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TenRoleAdminChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TenRoleAdminChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TenRoleAdminChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TenRoleAdminChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TenRoleAdminChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TenRoleAdminChanged represents a RoleAdminChanged event raised by the Ten contract. +type TenRoleAdminChanged struct { + Role [32]byte + PreviousAdminRole [32]byte + NewAdminRole [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleAdminChanged is a free log retrieval operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_Ten *TenFilterer) FilterRoleAdminChanged(opts *bind.FilterOpts, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (*TenRoleAdminChangedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var previousAdminRoleRule []interface{} + for _, previousAdminRoleItem := range previousAdminRole { + previousAdminRoleRule = append(previousAdminRoleRule, previousAdminRoleItem) + } + var newAdminRoleRule []interface{} + for _, newAdminRoleItem := range newAdminRole { + newAdminRoleRule = append(newAdminRoleRule, newAdminRoleItem) + } + + logs, sub, err := _Ten.contract.FilterLogs(opts, "RoleAdminChanged", roleRule, previousAdminRoleRule, newAdminRoleRule) + if err != nil { + return nil, err + } + return &TenRoleAdminChangedIterator{contract: _Ten.contract, event: "RoleAdminChanged", logs: logs, sub: sub}, nil +} + +// WatchRoleAdminChanged is a free log subscription operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_Ten *TenFilterer) WatchRoleAdminChanged(opts *bind.WatchOpts, sink chan<- *TenRoleAdminChanged, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var previousAdminRoleRule []interface{} + for _, previousAdminRoleItem := range previousAdminRole { + previousAdminRoleRule = append(previousAdminRoleRule, previousAdminRoleItem) + } + var newAdminRoleRule []interface{} + for _, newAdminRoleItem := range newAdminRole { + newAdminRoleRule = append(newAdminRoleRule, newAdminRoleItem) + } + + logs, sub, err := _Ten.contract.WatchLogs(opts, "RoleAdminChanged", roleRule, previousAdminRoleRule, newAdminRoleRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TenRoleAdminChanged) + if err := _Ten.contract.UnpackLog(event, "RoleAdminChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRoleAdminChanged is a log parse operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_Ten *TenFilterer) ParseRoleAdminChanged(log types.Log) (*TenRoleAdminChanged, error) { + event := new(TenRoleAdminChanged) + if err := _Ten.contract.UnpackLog(event, "RoleAdminChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TenRoleGrantedIterator is returned from FilterRoleGranted and is used to iterate over the raw logs and unpacked data for RoleGranted events raised by the Ten contract. +type TenRoleGrantedIterator struct { + Event *TenRoleGranted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TenRoleGrantedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TenRoleGranted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TenRoleGranted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TenRoleGrantedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TenRoleGrantedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TenRoleGranted represents a RoleGranted event raised by the Ten contract. +type TenRoleGranted struct { + Role [32]byte + Account common.Address + Sender common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleGranted is a free log retrieval operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_Ten *TenFilterer) FilterRoleGranted(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*TenRoleGrantedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Ten.contract.FilterLogs(opts, "RoleGranted", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &TenRoleGrantedIterator{contract: _Ten.contract, event: "RoleGranted", logs: logs, sub: sub}, nil +} + +// WatchRoleGranted is a free log subscription operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_Ten *TenFilterer) WatchRoleGranted(opts *bind.WatchOpts, sink chan<- *TenRoleGranted, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Ten.contract.WatchLogs(opts, "RoleGranted", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TenRoleGranted) + if err := _Ten.contract.UnpackLog(event, "RoleGranted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRoleGranted is a log parse operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_Ten *TenFilterer) ParseRoleGranted(log types.Log) (*TenRoleGranted, error) { + event := new(TenRoleGranted) + if err := _Ten.contract.UnpackLog(event, "RoleGranted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TenRoleRevokedIterator is returned from FilterRoleRevoked and is used to iterate over the raw logs and unpacked data for RoleRevoked events raised by the Ten contract. +type TenRoleRevokedIterator struct { + Event *TenRoleRevoked // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TenRoleRevokedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TenRoleRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TenRoleRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TenRoleRevokedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TenRoleRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TenRoleRevoked represents a RoleRevoked event raised by the Ten contract. +type TenRoleRevoked struct { + Role [32]byte + Account common.Address + Sender common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleRevoked is a free log retrieval operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_Ten *TenFilterer) FilterRoleRevoked(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*TenRoleRevokedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Ten.contract.FilterLogs(opts, "RoleRevoked", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &TenRoleRevokedIterator{contract: _Ten.contract, event: "RoleRevoked", logs: logs, sub: sub}, nil +} + +// WatchRoleRevoked is a free log subscription operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_Ten *TenFilterer) WatchRoleRevoked(opts *bind.WatchOpts, sink chan<- *TenRoleRevoked, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Ten.contract.WatchLogs(opts, "RoleRevoked", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TenRoleRevoked) + if err := _Ten.contract.UnpackLog(event, "RoleRevoked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRoleRevoked is a log parse operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_Ten *TenFilterer) ParseRoleRevoked(log types.Log) (*TenRoleRevoked, error) { + event := new(TenRoleRevoked) + if err := _Ten.contract.UnpackLog(event, "RoleRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TenTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the Ten contract. +type TenTransferIterator struct { + Event *TenTransfer // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TenTransferIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TenTransfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TenTransfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TenTransferIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TenTransferIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TenTransfer represents a Transfer event raised by the Ten contract. +type TenTransfer struct { + From common.Address + To common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_Ten *TenFilterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*TenTransferIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Ten.contract.FilterLogs(opts, "Transfer", fromRule, toRule) + if err != nil { + return nil, err + } + return &TenTransferIterator{contract: _Ten.contract, event: "Transfer", logs: logs, sub: sub}, nil +} + +// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_Ten *TenFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *TenTransfer, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _Ten.contract.WatchLogs(opts, "Transfer", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TenTransfer) + if err := _Ten.contract.UnpackLog(event, "Transfer", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_Ten *TenFilterer) ParseTransfer(log types.Log) (*TenTransfer, error) { + event := new(TenTransfer) + if err := _Ten.contract.UnpackLog(event, "Transfer", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts/generated/TenBridge/TenBridge.go b/contracts/generated/TenBridge/TenBridge.go index e5dfc6d4cd..9ce413a220 100644 --- a/contracts/generated/TenBridge/TenBridge.go +++ b/contracts/generated/TenBridge/TenBridge.go @@ -31,8 +31,8 @@ var ( // TenBridgeMetaData contains all meta data concerning the TenBridge contract. var TenBridgeMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC20_TOKEN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAUSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUSPENDED_ERC20_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UNPAUSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantPauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantUnpauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageBus\",\"outputs\":[{\"internalType\":\"contractIMessageBus\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"contractICrossChainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"pauseToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"promoteToAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"receiveAssets\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"receiveNativeWrapped\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"remoteBridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokePauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeUnpauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"sendERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"sendNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bridge\",\"type\":\"address\"}],\"name\":\"setRemoteBridge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_weth\",\"type\":\"address\"}],\"name\":\"setWeth\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"multisig\",\"type\":\"address\"}],\"name\":\"transferUnpauserRoleToMultisig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"unpauseToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"}],\"name\":\"whitelistToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x6080604052348015600e575f5ffd5b506131368061001c5f395ff3fe608060405260043610610260575f3560e01c80636c11c21c1161014b578063a1a227fa116100c6578063d547741f1161007c578063e63ab1e911610062578063e63ab1e9146107bc578063f865af08146107ef578063fb1bb9de1461080e575f5ffd5b8063d547741f1461076a578063e4c3ebc714610789575f5ffd5b8063a381c8e2116100ac578063a381c8e2146106ad578063affed0e0146106c0578063b8d1452f1461074b575f5ffd5b8063a1a227fa14610686578063a217fddf1461069a575f5ffd5b80637c41ad2c1161011b5780638456cb59116101015780638456cb59146105f057806391d148541461060457806393b3744214610667575f5ffd5b80637c41ad2c146105b257806383bece4d146105d1575f5ffd5b80636c11c21c146105225780637533087a1461054157806375b238fc146105605780637920c98614610593575f5ffd5b80633b3bff0f116101db578063485cc955116101ab5780635c975abb116101915780635c975abb146104865780635ccc9613146104bc5780635d872970146104ef575f5ffd5b8063485cc95514610448578063498d82ab14610467575f5ffd5b80633b3bff0f146103d55780633cb747bf146103f45780633f4ba83a146104155780633fc8cef314610429575f5ffd5b8063248a9ca3116102305780632f2ff15d116102165780632f2ff15d14610378578063329687821461039757806336568abe146103b6575f5ffd5b8063248a9ca3146102ff5780632540e2da14610359575f5ffd5b806301ffc9a71461026b5780630f0a9a4b146102a057806316ce8149146102cb5780631888d712146102ec575f5ffd5b3661026757005b5f5ffd5b348015610276575f5ffd5b5061028a61028536600461255c565b610841565b604051610297919061258a565b60405180910390f35b3480156102ab575f5ffd5b505f546102be906001600160a01b031681565b60405161029791906125b1565b3480156102d6575f5ffd5b506102ea6102e53660046125d3565b6108a9565b005b6102ea6102fa3660046125d3565b610961565b34801561030a575f5ffd5b5061034c610319366004612601565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6040516102979190612624565b348015610364575f5ffd5b506102ea6103733660046125d3565b6109da565b348015610383575f5ffd5b506102ea610392366004612632565b610a13565b3480156103a2575f5ffd5b506102ea6103b13660046125d3565b610a5c565b3480156103c1575f5ffd5b506102ea6103d0366004612632565b610a90565b3480156103e0575f5ffd5b506102ea6103ef3660046125d3565b610adc565b3480156103ff575f5ffd5b50610408610b30565b6040516102979190612685565b348015610420575f5ffd5b506102ea610bbb565b348015610434575f5ffd5b506001546102be906001600160a01b031681565b348015610453575f5ffd5b506102ea610462366004612693565b610bf0565b348015610472575f5ffd5b506102ea6104813660046126ff565b610e07565b348015610491575f5ffd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1661028a565b3480156104c7575f5ffd5b5061034c7fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e81565b3480156104fa575f5ffd5b5061034c7f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a81565b34801561052d575f5ffd5b506102ea61053c3660046125d3565b610f53565b34801561054c575f5ffd5b506102ea61055b366004612786565b610f87565b34801561056b575f5ffd5b5061034c7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b34801561059e575f5ffd5b506102ea6105ad3660046125d3565b6110a2565b3480156105bd575f5ffd5b506102ea6105cc3660046125d3565b611127565b3480156105dc575f5ffd5b506102ea6105eb3660046127b3565b6111d1565b3480156105fb575f5ffd5b506102ea61132e565b34801561060f575f5ffd5b5061028a61061e366004612632565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b348015610672575f5ffd5b506102ea6106813660046125d3565b611360565b348015610691575f5ffd5b506104086113c2565b3480156106a5575f5ffd5b5061034c5f81565b6102ea6106bb3660046127b3565b611442565b3480156106cb575f5ffd5b5060408051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e63650000000000006020909101527f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f527fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd005461034c565b348015610756575f5ffd5b506102ea6107653660046125d3565b6116ad565b348015610775575f5ffd5b506102ea610784366004612632565b61178e565b348015610794575f5ffd5b5061034c7fd2fb17ceaa388942529b17e0006ffc4d559f040dd4f2157b8070f17ad211057881565b3480156107c7575f5ffd5b5061034c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b3480156107fa575f5ffd5b506102ea6108093660046125d3565b6117d1565b348015610819575f5ffd5b5061034c7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b5f6001600160e01b031982167f7965db0b0000000000000000000000000000000000000000000000000000000014806108a357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756108d381611805565b6108db61180f565b6001600160a01b03821661090a5760405162461bcd60e51b81526004016109019061282d565b60405180910390fd5b5f546001600160a01b0316156109325760405162461bcd60e51b815260040161090190612897565b505f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61096961180f565b5f34116109885760405162461bcd60e51b8152600401610901906128d9565b5f6040518060400160405280348152602001836001600160a01b03168152506040516020016109b79190612908565b60408051601f1981840301815291905290506109d68160025f5f61186d565b5050565b5f6109e481611805565b610a0e7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a83611978565b505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610a4c81611805565b610a568383611a25565b50505050565b5f610a6681611805565b610a0e7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a83611a25565b6001600160a01b0381163314610ad2576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a0e8282611978565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610b0681611805565b610a0e7fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e83611978565b60408051808201909152601e81527f43726f7373436861696e456e61626c656454454e2e6d657373656e67657200006020909101527fa8b5aada5c72138bb5566a3940e8fe06f59ef8af1e490446ba6ea7fa80395d525f9081527f3b49b3a570909bb4d324cb0ca029c61a2f4f7251edd27af783a6ad02851382005b546001600160a01b0316919050565b7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a610be581611805565b610bed611ae8565b50565b5f610bf9611b54565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015610c255750825b90505f8267ffffffffffffffff166001148015610c415750303b155b905081158015610c4f575080155b15610c86576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cba57845468ff00000000000000001916680100000000000000001785555b6001600160a01b038716610ce05760405162461bcd60e51b815260040161090190612948565b6001600160a01b038616610d065760405162461bcd60e51b81526004016109019061298a565b610d0f87611b7c565b610d1886611d7d565b610d225f87611a25565b50610d2d5f30611a25565b50610d587fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217755f611df5565b610d827fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177587611a25565b50610dad7fd2fb17ceaa388942529b17e0006ffc4d559f040dd4f2157b8070f17ad21105785f611a25565b508315610dfe57845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290610df5906001906129b4565b60405180910390a15b50505050505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610e3181611805565b610e3961180f565b6001600160a01b038616610e5f5760405162461bcd60e51b8152600401610901906129f4565b6001600160a01b0386165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff1615610eb65760405162461bcd60e51b815260040161090190612a36565b610ee07f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a87611a25565b505f63458ffd6360e01b8787878787604051602401610f03959493929190612a71565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091525f54909150610dfe906001600160a01b03168260015b5f5f5f611e96565b5f610f5d81611805565b610a0e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a83611a25565b5f546001600160a01b0316610f9a612010565b610fb65760405162461bcd60e51b815260040161090190612b0a565b806001600160a01b0316610fc8612032565b6001600160a01b031614610fee5760405162461bcd60e51b815260040161090190612b72565b30610ff761209f565b6001600160a01b03161461101d5760405162461bcd60e51b815260040161090190612bda565b61102561180f565b60015f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015611072575f5ffd5b505af1158015611084573d5f5f3e3d5ffd5b5050600154610a0e93506001600160a01b03169150849050856120e3565b5f6110ac81611805565b6001600160a01b0382166110d25760405162461bcd60e51b815260040161090190612c1c565b6110fc7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a33611978565b50610a0e7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a83611a25565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561115181611805565b6001600160a01b0382165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff166111a75760405162461bcd60e51b815260040161090190612c5e565b610a0e7fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e83611a25565b5f546001600160a01b03166111e4612010565b6112005760405162461bcd60e51b815260040161090190612b0a565b806001600160a01b0316611212612032565b6001600160a01b0316146112385760405162461bcd60e51b815260040161090190612b72565b3061124161209f565b6001600160a01b0316146112675760405162461bcd60e51b815260040161090190612bda565b61126f61213e565b61127761180f565b6001600160a01b0384165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff16156112c6576112c18484846120e3565b611326565b6001600160a01b0384165f9081527e5fd0bb0e17815069821c0eac859eb66a4da90a93d511d999ef71402d667e27602052604090205460ff161561130e576112c182846121c4565b60405162461bcd60e51b815260040161090190612cc6565b610a56612276565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61135881611805565b610bed6122a0565b5f61136a81611805565b61137261180f565b6001600160a01b0382166113985760405162461bcd60e51b815260040161090190612d08565b6109d67fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177583610a13565b60408051808201909152601f81527f43726f7373436861696e456e61626c656454454e2e6d657373616765427573006020909101527f3e1bb302f668bd876eab4a48b3759a1d614a1ecbcc67ee27a10c9a116878004e5f9081527f6c6664e79adefe2c614a8e3c94fc27135b7678c3722965a80d01e330dd948d00610bac565b61144a61180f565b6001600160a01b0383165f9081527ff8f9f0c07f8f13fae35355825022a620ece4ae820bcc59c97dd7358124668dc9602052604090205460ff16156114a15760405162461bcd60e51b815260040161090190612d4a565b5f82116114c05760405162461bcd60e51b815260040161090190612d8c565b6001600160a01b0383165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff166115165760405162461bcd60e51b815260040161090190612d9c565b611522833330856122fb565b6001546001600160a01b039081169084160361168f576001546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690632e1a7d4d90611581908590600401612624565b5f604051808303815f87803b158015611598575f5ffd5b505af11580156115aa573d5f5f3e3d5ffd5b50505f546040517f1888d712000000000000000000000000000000000000000000000000000000008152309350631888d712925085916115f8916001600160a01b03909116906004016125b1565b5f604051808303818588803b15801561160f575f5ffd5b505af1158015611621573d5f5f3e3d5ffd5b50505050505f637533087a60e01b8284604051602401611642929190612e23565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091525f8054919250610a56916001600160a01b0316908390610f4b565b5f6383bece4d60e01b84848460405160240161164293929190612e3e565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756116d781611805565b6116df61180f565b6001600160a01b0382166117055760405162461bcd60e51b815260040161090190612ea0565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091555f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff166109d657610a0e7f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a83611a25565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260409020600101546117c781611805565b610a568383611978565b5f6117db81611805565b610a0e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a83611978565b610bed8133612355565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff161561186b576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6118756113c2565b60408051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e63650000000000006020909101527f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f526001600160a01b0316630d3fd67c837fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd008054905f61190a83612edd565b919050558688866040518663ffffffff1660e01b81526004016119309493929190612f56565b60206040518083038185885af115801561194c573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906119719190612fb6565b5050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611a1c575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506108a3565b5f9150506108a3565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611a1c575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055611a9e3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506108a3565b611af06123d3565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051611b4991906125b1565b60405180910390a150565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006108a3565b60408051808201909152601e81527f43726f7373436861696e456e61626c656454454e2e6d657373656e67657200006020909101527fa8b5aada5c72138bb5566a3940e8fe06f59ef8af1e490446ba6ea7fa80395d525f527f3b49b3a570909bb4d324cb0ca029c61a2f4f7251edd27af783a6ad0285138200805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316179055611c23610b30565b6001600160a01b031663a1a227fa6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c5e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c829190612fde565b604080518082018252601f81527f43726f7373436861696e456e61626c656454454e2e6d657373616765427573006020918201527f6c6664e79adefe2c614a8e3c94fc27135b7678c3722965a80d01e330dd948d00805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0394909416939093179092558051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e6365000000000000910152507f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f9081527fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd0055565b611d8561242e565b611d8d61246c565b611d9561246c565b611d9f5f82611a25565b50611dca7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82611a25565b506109d67f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a82611a25565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f611e4e845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b6001600160a01b038616611ebc5760405162461bcd60e51b81526004016109019061302d565b5f6040518060600160405280886001600160a01b0316815260200187815260200185815250604051602001611ef19190613085565b6040516020818303038152906040529050611f0a6113c2565b60408051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e63650000000000006020909101527f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f526001600160a01b0316630d3fd67c837fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd008054905f611f9f83612edd565b919050558885886040518663ffffffff1660e01b8152600401611fc59493929190612f56565b60206040518083038185885af1158015611fe1573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906120069190612fb6565b5050505050505050565b5f612019610b30565b6001600160a01b0316336001600160a01b031614905090565b5f61203b610b30565b6001600160a01b03166363012de56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612076573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061209a9190612fde565b905090565b5f6120a8610b30565b6001600160a01b031663b859ce836040518163ffffffff1660e01b8152600401602060405180830381865afa158015612076573d5f5f3e3d5ffd5b6120ee838284612474565b826001600160a01b0316816001600160a01b03167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398846040516121319190612624565b60405180910390a3505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c15612197576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61186b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b9061249a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461220d576040519150601f19603f3d011682016040523d82523d5f602084013e612212565b606091505b50509050806122335760405162461bcd60e51b8152600401610901906130c8565b5f6001600160a01b0316836001600160a01b03167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398846040516121319190612624565b61186b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006121be565b6122a861180f565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611b3c565b610a5684856001600160a01b03166323b872dd868686604051602401612323939291906130d8565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506124a1565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff166109d65780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401610901929190612e23565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1661186b576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61243661251d565b61186b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61186b61242e565b610a0e83846001600160a01b031663a9059cbb8585604051602401612323929190612e23565b80825d5050565b5f5f60205f8451602086015f885af1806124c0576040513d5f823e3d81fd5b50505f513d915081156124d75780600114156124e4565b6001600160a01b0384163b155b15610a5657836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161090191906125b1565b5f612526611b54565b5468010000000000000000900460ff16919050565b6001600160e01b031981165b8114610bed575f5ffd5b80356108a38161253b565b5f6020828403121561256f5761256f5f5ffd5b6125798383612551565b9392505050565b8015155b82525050565b602081016108a38284612580565b5f6001600160a01b0382166108a3565b61258481612598565b602081016108a382846125a8565b61254781612598565b80356108a3816125bf565b5f602082840312156125e6576125e65f5ffd5b61257983836125c8565b80612547565b80356108a3816125f0565b5f60208284031215612614576126145f5ffd5b61257983836125f6565b80612584565b602081016108a3828461261e565b5f5f60408385031215612646576126465f5ffd5b61265084846125f6565b915061265f84602085016125c8565b90509250929050565b5f6108a382612598565b5f6108a382612668565b61258481612672565b602081016108a3828461267c565b5f5f604083850312156126a7576126a75f5ffd5b61265084846125c8565b5f5f83601f8401126126c4576126c45f5ffd5b50813567ffffffffffffffff8111156126de576126de5f5ffd5b6020830191508360018202830111156126f8576126f85f5ffd5b9250929050565b5f5f5f5f5f60608688031215612716576127165f5ffd5b61272087876125c8565b9450602086013567ffffffffffffffff81111561273e5761273e5f5ffd5b61274a888289016126b1565b9450945050604086013567ffffffffffffffff81111561276b5761276b5f5ffd5b612777888289016126b1565b92509250509295509295909350565b5f5f6040838503121561279a5761279a5f5ffd5b6127a484846125c8565b915061265f84602085016125f6565b5f5f5f606084860312156127c8576127c85f5ffd5b6127d285856125c8565b92506127e185602086016125f6565b91506127f085604086016125c8565b90509250925092565b60148152602081017f4272696467652063616e6e6f7420626520307830000000000000000000000000815290505b60200190565b602080825281016108a3816127f9565b60228152602081017f52656d6f746520627269646765206164647265737320616c726561647920736581527f742e000000000000000000000000000000000000000000000000000000000000602082015290505b60400190565b602080825281016108a38161283d565b600f8152602081017f456d707479207472616e736665722e000000000000000000000000000000000081529050612827565b602080825281016108a3816128a7565b80516128f5838261261e565b506020810151610a0e60208401826125a8565b604081016108a382846128e9565b60178152602081017f4d657373656e6765722063616e6e6f742062652030783000000000000000000081529050612827565b602080825281016108a381612916565b60138152602081017f4f776e65722063616e6e6f74206265203078300000000000000000000000000081529050612827565b602080825281016108a381612958565b5f67ffffffffffffffff82166108a3565b6125848161299a565b602081016108a382846129ab565b60138152602081017f41737365742063616e6e6f74206265203078300000000000000000000000000081529050612827565b602080825281016108a3816129c2565b60198152602081017f546f6b656e20616c72656164792077686974656c69737465640000000000000081529050612827565b602080825281016108a381612a04565b82818337505f910152565b818352602083019250612a65828483612a46565b50601f01601f19160190565b60608101612a7f82886125a8565b8181036020830152612a92818688612a51565b90508181036040830152612aa7818486612a51565b979650505050505050565b60308152602081017f436f6e74726163742063616c6c6572206973206e6f742074686520726567697381527f7465726564206d657373656e676572210000000000000000000000000000000060208201529050612891565b602080825281016108a381612ab2565b60318152602081017f43726f737320636861696e206d65737361676520636f6d696e672066726f6d2081527f696e636f72726563742073656e6465722100000000000000000000000000000060208201529050612891565b602080825281016108a381612b1a565b60318152602081017f43726f737320636861696e206d65737361676520636f6d696e672066726f6d2081527f696e636f7272656374207461726765742100000000000000000000000000000060208201529050612891565b602080825281016108a381612b82565b60188152602081017f496e76616c6964206d756c74697369672061646472657373000000000000000081529050612827565b602080825281016108a381612bea565b60188152602081017f546f6b656e206973206e6f742077686974656c6973746564000000000000000081529050612827565b602080825281016108a381612c2c565b60258152602081017f417474656d7074696e6720746f20776974686472617720756e6b6e6f776e206181527f737365742e00000000000000000000000000000000000000000000000000000060208201529050612891565b602080825281016108a381612c6e565b60178152602081017f4e65772061646d696e2063616e6e6f742062652030783000000000000000000081529050612827565b602080825281016108a381612cd6565b60108152602081017f546f6b656e206973207061757365642e0000000000000000000000000000000081529050612827565b602080825281016108a381612d18565b601a8152602081017f417474656d7074696e6720656d707479207472616e736665722e00000000000081529050612827565b602080825281016108a381612d5a565b602080825281016108a381604e81527f54686973206164647265737320686173206e6f74206265656e20676976656e2060208201527f61207479706520616e64206973207468757320636f6e73696465726564206e6f60408201527f742077686974656c69737465642e000000000000000000000000000000000000606082015260800190565b60408101612e3182856125a8565b612579602083018461261e565b60608101612e4c82866125a8565b612e59602083018561261e565b612e6660408301846125a8565b949350505050565b60128152602081017f574554482063616e6e6f7420626520307830000000000000000000000000000081529050612827565b602080825281016108a381612e6e565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f60018201612eee57612eee612eb0565b5060010190565b67ffffffffffffffff8116612584565b63ffffffff8116612584565b8281835e505f910152565b5f612f25825190565b808452602084019350612f3c818560208601612f11565b601f01601f19169290920192915050565b60ff8116612584565b60808101612f648287612ef5565b612f716020830186612f05565b8181036040830152612f838185612f1c565b9050612f926060830184612f4d565b95945050505050565b67ffffffffffffffff8116612547565b80516108a381612f9b565b5f60208284031215612fc957612fc95f5ffd5b6125798383612fab565b80516108a3816125bf565b5f60208284031215612ff157612ff15f5ffd5b6125798383612fd3565b60148152602081017f5461726765742063616e6e6f742062652030783000000000000000000000000081529050612827565b602080825281016108a381612ffb565b80515f90606084019061305085826125a8565b50602083015184820360208601526130688282612f1c565b915050604083015161307d604086018261261e565b509392505050565b60208082528101612579818461303d565b60148152602081017f4661696c656420746f2073656e6420457468657200000000000000000000000081529050612827565b602080825281016108a381613096565b606081016130e682866125a8565b6130f360208301856125a8565b612e66604083018461261e56fea2646970667358221220464a682c7e813cbd099b690d79870203a05b17b5bc7e99ec79b0a46afd25f07264736f6c634300081c0033", + ABI: "[{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC20_TOKEN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAUSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUSPENDED_ERC20_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UNPAUSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantPauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantUnpauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageBus\",\"outputs\":[{\"internalType\":\"contractIMessageBus\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"contractICrossChainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"pauseToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"promoteToAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"receiveAssets\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"receiveNativeWrapped\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"remoteBridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"removeWhitelistedToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokePauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeUnpauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"sendERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"sendNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bridge\",\"type\":\"address\"}],\"name\":\"setRemoteBridge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_weth\",\"type\":\"address\"}],\"name\":\"setWeth\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"multisig\",\"type\":\"address\"}],\"name\":\"transferUnpauserRoleToMultisig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"unpauseToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"}],\"name\":\"whitelistToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x6080604052348015600e575f5ffd5b506131a68061001c5f395ff3fe60806040526004361061027a575f3560e01c80636c11c21c1161014b578063a1a227fa116100c6578063d547741f1161007c578063e63ab1e911610062578063e63ab1e9146107e2578063f865af0814610815578063fb1bb9de14610834575f5ffd5b8063d547741f14610790578063e4c3ebc7146107af575f5ffd5b8063a381c8e2116100ac578063a381c8e2146106d3578063affed0e0146106e6578063b8d1452f14610771575f5ffd5b8063a1a227fa146106ac578063a217fddf146106c0575f5ffd5b80637c41ad2c1161011b5780638456cb59116101015780638456cb591461061657806391d148541461062a57806393b374421461068d575f5ffd5b80637c41ad2c146105d857806383bece4d146105f7575f5ffd5b80636c11c21c1461055b5780637533087a1461057a57806375b238fc146105995780637920c986146105b9575f5ffd5b806336568abe116101f5578063485cc955116101ab5780635c975abb116101915780635c975abb146104bf5780635ccc9613146104f55780635d87297014610528575f5ffd5b8063485cc95514610481578063498d82ab146104a0575f5ffd5b80633cb747bf116101db5780633cb747bf1461042d5780633f4ba83a1461044e5780633fc8cef314610462575f5ffd5b806336568abe146103ef5780633b3bff0f1461040e575f5ffd5b80631c88705d1161024a5780632540e2da116102305780632540e2da146103925780632f2ff15d146103b157806332968782146103d0575f5ffd5b80631c88705d14610319578063248a9ca314610338575f5ffd5b806301ffc9a7146102855780630f0a9a4b146102ba57806316ce8149146102e55780631888d71214610306575f5ffd5b3661028157005b5f5ffd5b348015610290575f5ffd5b506102a461029f3660046125ac565b610867565b6040516102b191906125da565b60405180910390f35b3480156102c5575f5ffd5b505f546102d8906001600160a01b031681565b6040516102b19190612601565b3480156102f0575f5ffd5b506103046102ff366004612623565b6108cf565b005b610304610314366004612623565b610974565b348015610324575f5ffd5b50610304610333366004612623565b6109ed565b348015610343575f5ffd5b50610385610352366004612651565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6040516102b19190612674565b34801561039d575f5ffd5b506103046103ac366004612623565b610ab4565b3480156103bc575f5ffd5b506103046103cb366004612682565b610ae8565b3480156103db575f5ffd5b506103046103ea366004612623565b610b31565b3480156103fa575f5ffd5b50610304610409366004612682565b610b65565b348015610419575f5ffd5b50610304610428366004612623565b610bb1565b348015610438575f5ffd5b50610441610bf2565b6040516102b191906126d5565b348015610459575f5ffd5b50610304610c7d565b34801561046d575f5ffd5b506001546102d8906001600160a01b031681565b34801561048c575f5ffd5b5061030461049b3660046126e3565b610cb2565b3480156104ab575f5ffd5b506103046104ba36600461274f565b610ea3565b3480156104ca575f5ffd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff166102a4565b348015610500575f5ffd5b506103857fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e81565b348015610533575f5ffd5b506103857f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a81565b348015610566575f5ffd5b50610304610575366004612623565b610fdc565b348015610585575f5ffd5b506103046105943660046127d6565b611010565b3480156105a4575f5ffd5b506103855f5160206131515f395f51905f5281565b3480156105c4575f5ffd5b506103046105d3366004612623565b61112b565b3480156105e3575f5ffd5b506103046105f2366004612623565b6111b0565b348015610602575f5ffd5b50610304610611366004612803565b611247565b348015610621575f5ffd5b506103046113a4565b348015610635575f5ffd5b506102a4610644366004612682565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b348015610698575f5ffd5b506103046106a7366004612623565b6113d6565b3480156106b7575f5ffd5b50610441611425565b3480156106cb575f5ffd5b506103855f81565b6103046106e1366004612803565b6114a5565b3480156106f1575f5ffd5b5060408051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e63650000000000006020909101527f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f527fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd0054610385565b34801561077c575f5ffd5b5061030461078b366004612623565b611710565b34801561079b575f5ffd5b506103046107aa366004612682565b6117de565b3480156107ba575f5ffd5b506103857fd2fb17ceaa388942529b17e0006ffc4d559f040dd4f2157b8070f17ad211057881565b3480156107ed575f5ffd5b506103857f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b348015610820575f5ffd5b5061030461082f366004612623565b611821565b34801561083f575f5ffd5b506103857f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b5f6001600160e01b031982167f7965db0b0000000000000000000000000000000000000000000000000000000014806108c957507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b5f5160206131515f395f51905f526108e681611855565b6108ee61185f565b6001600160a01b03821661091d5760405162461bcd60e51b81526004016109149061287d565b60405180910390fd5b5f546001600160a01b0316156109455760405162461bcd60e51b8152600401610914906128e7565b505f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61097c61185f565b5f341161099b5760405162461bcd60e51b815260040161091490612929565b5f6040518060400160405280348152602001836001600160a01b03168152506040516020016109ca9190612958565b60408051601f1981840301815291905290506109e98160025f5f6118bd565b5050565b5f5160206131515f395f51905f52610a0481611855565b6001600160a01b0382165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff16610a5a5760405162461bcd60e51b815260040161091490612998565b610a847f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a836119c8565b50610aaf7fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e836119c8565b505050565b5f610abe81611855565b610aaf7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a836119c8565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610b2181611855565b610b2b8383611a75565b50505050565b5f610b3b81611855565b610aaf7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a83611a75565b6001600160a01b0381163314610ba7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aaf82826119c8565b5f5160206131515f395f51905f52610bc881611855565b610aaf7fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e836119c8565b60408051808201909152601e81527f43726f7373436861696e456e61626c656454454e2e6d657373656e67657200006020909101527fa8b5aada5c72138bb5566a3940e8fe06f59ef8af1e490446ba6ea7fa80395d525f9081527f3b49b3a570909bb4d324cb0ca029c61a2f4f7251edd27af783a6ad02851382005b546001600160a01b0316919050565b7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a610ca781611855565b610caf611b38565b50565b5f610cbb611ba4565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015610ce75750825b90505f8267ffffffffffffffff166001148015610d035750303b155b905081158015610d11575080155b15610d48576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610d7c57845468ff00000000000000001916680100000000000000001785555b6001600160a01b038716610da25760405162461bcd60e51b8152600401610914906129da565b6001600160a01b038616610dc85760405162461bcd60e51b815260040161091490612a1c565b610dd187611bcc565b610dda86611dcd565b610de45f87611a75565b50610def5f30611a75565b50610e075f5160206131515f395f51905f525f611e45565b610e1e5f5160206131515f395f51905f5287611a75565b50610e497fd2fb17ceaa388942529b17e0006ffc4d559f040dd4f2157b8070f17ad21105785f611a75565b508315610e9a57845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290610e9190600190612a46565b60405180910390a15b50505050505050565b5f5160206131515f395f51905f52610eba81611855565b610ec261185f565b6001600160a01b038616610ee85760405162461bcd60e51b815260040161091490612a86565b6001600160a01b0386165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff1615610f3f5760405162461bcd60e51b815260040161091490612ac8565b610f697f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a87611a75565b505f63458ffd6360e01b8787878787604051602401610f8c959493929190612b03565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091525f54909150610e9a906001600160a01b03168260015b5f5f5f611ee6565b5f610fe681611855565b610aaf7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a83611a75565b5f546001600160a01b0316611023612060565b61103f5760405162461bcd60e51b815260040161091490612b9c565b806001600160a01b0316611051612082565b6001600160a01b0316146110775760405162461bcd60e51b815260040161091490612c04565b306110806120ef565b6001600160a01b0316146110a65760405162461bcd60e51b815260040161091490612c6c565b6110ae61185f565b60015f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b1580156110fb575f5ffd5b505af115801561110d573d5f5f3e3d5ffd5b5050600154610aaf93506001600160a01b0316915084905085612133565b5f61113581611855565b6001600160a01b03821661115b5760405162461bcd60e51b815260040161091490612cae565b6111857f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a336119c8565b50610aaf7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a83611a75565b5f5160206131515f395f51905f526111c781611855565b6001600160a01b0382165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff1661121d5760405162461bcd60e51b815260040161091490612998565b610aaf7fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e83611a75565b5f546001600160a01b031661125a612060565b6112765760405162461bcd60e51b815260040161091490612b9c565b806001600160a01b0316611288612082565b6001600160a01b0316146112ae5760405162461bcd60e51b815260040161091490612c04565b306112b76120ef565b6001600160a01b0316146112dd5760405162461bcd60e51b815260040161091490612c6c565b6112e561218e565b6112ed61185f565b6001600160a01b0384165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff161561133c57611337848484612133565b61139c565b6001600160a01b0384165f9081527e5fd0bb0e17815069821c0eac859eb66a4da90a93d511d999ef71402d667e27602052604090205460ff1615611384576113378284612214565b60405162461bcd60e51b815260040161091490612d16565b610b2b6122c6565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6113ce81611855565b610caf6122f0565b5f6113e081611855565b6113e861185f565b6001600160a01b03821661140e5760405162461bcd60e51b815260040161091490612d58565b6109e95f5160206131515f395f51905f5283610ae8565b60408051808201909152601f81527f43726f7373436861696e456e61626c656454454e2e6d657373616765427573006020909101527f3e1bb302f668bd876eab4a48b3759a1d614a1ecbcc67ee27a10c9a116878004e5f9081527f6c6664e79adefe2c614a8e3c94fc27135b7678c3722965a80d01e330dd948d00610c6e565b6114ad61185f565b6001600160a01b0383165f9081527ff8f9f0c07f8f13fae35355825022a620ece4ae820bcc59c97dd7358124668dc9602052604090205460ff16156115045760405162461bcd60e51b815260040161091490612d9a565b5f82116115235760405162461bcd60e51b815260040161091490612ddc565b6001600160a01b0383165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff166115795760405162461bcd60e51b815260040161091490612dec565b6115858333308561234b565b6001546001600160a01b03908116908416036116f2576001546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690632e1a7d4d906115e4908590600401612674565b5f604051808303815f87803b1580156115fb575f5ffd5b505af115801561160d573d5f5f3e3d5ffd5b50505f546040517f1888d712000000000000000000000000000000000000000000000000000000008152309350631888d7129250859161165b916001600160a01b0390911690600401612601565b5f604051808303818588803b158015611672575f5ffd5b505af1158015611684573d5f5f3e3d5ffd5b50505050505f637533087a60e01b82846040516024016116a5929190612e73565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091525f8054919250610b2b916001600160a01b0316908390610fd4565b5f6383bece4d60e01b8484846040516024016116a593929190612e8e565b5f5160206131515f395f51905f5261172781611855565b61172f61185f565b6001600160a01b0382166117555760405162461bcd60e51b815260040161091490612ef0565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091555f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff166109e957610aaf7f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a83611a75565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461181781611855565b610b2b83836119c8565b5f61182b81611855565b610aaf7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a836119c8565b610caf81336123a5565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16156118bb576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6118c5611425565b60408051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e63650000000000006020909101527f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f526001600160a01b0316630d3fd67c837fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd008054905f61195a83612f2d565b919050558688866040518663ffffffff1660e01b81526004016119809493929190612fa6565b60206040518083038185885af115801561199c573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906119c19190613006565b5050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611a6c575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506108c9565b5f9150506108c9565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611a6c575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055611aee3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506108c9565b611b40612423565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051611b999190612601565b60405180910390a150565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006108c9565b60408051808201909152601e81527f43726f7373436861696e456e61626c656454454e2e6d657373656e67657200006020909101527fa8b5aada5c72138bb5566a3940e8fe06f59ef8af1e490446ba6ea7fa80395d525f527f3b49b3a570909bb4d324cb0ca029c61a2f4f7251edd27af783a6ad0285138200805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316179055611c73610bf2565b6001600160a01b031663a1a227fa6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cae573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd2919061302e565b604080518082018252601f81527f43726f7373436861696e456e61626c656454454e2e6d657373616765427573006020918201527f6c6664e79adefe2c614a8e3c94fc27135b7678c3722965a80d01e330dd948d00805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0394909416939093179092558051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e6365000000000000910152507f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f9081527fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd0055565b611dd561247e565b611ddd6124bc565b611de56124bc565b611def5f82611a75565b50611e1a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82611a75565b506109e97f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a82611a75565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f611e9e845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b6001600160a01b038616611f0c5760405162461bcd60e51b81526004016109149061307d565b5f6040518060600160405280886001600160a01b0316815260200187815260200185815250604051602001611f4191906130d5565b6040516020818303038152906040529050611f5a611425565b60408051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e63650000000000006020909101527f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f526001600160a01b0316630d3fd67c837fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd008054905f611fef83612f2d565b919050558885886040518663ffffffff1660e01b81526004016120159493929190612fa6565b60206040518083038185885af1158015612031573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906120569190613006565b5050505050505050565b5f612069610bf2565b6001600160a01b0316336001600160a01b031614905090565b5f61208b610bf2565b6001600160a01b03166363012de56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120c6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ea919061302e565b905090565b5f6120f8610bf2565b6001600160a01b031663b859ce836040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120c6573d5f5f3e3d5ffd5b61213e8382846124c4565b826001600160a01b0316816001600160a01b03167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398846040516121819190612674565b60405180910390a3505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c156121e7576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118bb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b906124ea565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461225d576040519150601f19603f3d011682016040523d82523d5f602084013e612262565b606091505b50509050806122835760405162461bcd60e51b815260040161091490613118565b5f6001600160a01b0316836001600160a01b03167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398846040516121819190612674565b6118bb5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0061220e565b6122f861185f565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611b8c565b610b2b84856001600160a01b03166323b872dd86868660405160240161237393929190613128565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506124f1565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff166109e95780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401610914929190612e73565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff166118bb576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61248661256d565b6118bb576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118bb61247e565b610aaf83846001600160a01b031663a9059cbb8585604051602401612373929190612e73565b80825d5050565b5f5f60205f8451602086015f885af180612510576040513d5f823e3d81fd5b50505f513d91508115612527578060011415612534565b6001600160a01b0384163b155b15610b2b57836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016109149190612601565b5f612576611ba4565b5468010000000000000000900460ff16919050565b6001600160e01b031981165b8114610caf575f5ffd5b80356108c98161258b565b5f602082840312156125bf576125bf5f5ffd5b6125c983836125a1565b9392505050565b8015155b82525050565b602081016108c982846125d0565b5f6001600160a01b0382166108c9565b6125d4816125e8565b602081016108c982846125f8565b612597816125e8565b80356108c98161260f565b5f60208284031215612636576126365f5ffd5b6125c98383612618565b80612597565b80356108c981612640565b5f60208284031215612664576126645f5ffd5b6125c98383612646565b806125d4565b602081016108c9828461266e565b5f5f60408385031215612696576126965f5ffd5b6126a08484612646565b91506126af8460208501612618565b90509250929050565b5f6108c9826125e8565b5f6108c9826126b8565b6125d4816126c2565b602081016108c982846126cc565b5f5f604083850312156126f7576126f75f5ffd5b6126a08484612618565b5f5f83601f840112612714576127145f5ffd5b50813567ffffffffffffffff81111561272e5761272e5f5ffd5b602083019150836001820283011115612748576127485f5ffd5b9250929050565b5f5f5f5f5f60608688031215612766576127665f5ffd5b6127708787612618565b9450602086013567ffffffffffffffff81111561278e5761278e5f5ffd5b61279a88828901612701565b9450945050604086013567ffffffffffffffff8111156127bb576127bb5f5ffd5b6127c788828901612701565b92509250509295509295909350565b5f5f604083850312156127ea576127ea5f5ffd5b6127f48484612618565b91506126af8460208501612646565b5f5f5f60608486031215612818576128185f5ffd5b6128228585612618565b92506128318560208601612646565b91506128408560408601612618565b90509250925092565b60148152602081017f4272696467652063616e6e6f7420626520307830000000000000000000000000815290505b60200190565b602080825281016108c981612849565b60228152602081017f52656d6f746520627269646765206164647265737320616c726561647920736581527f742e000000000000000000000000000000000000000000000000000000000000602082015290505b60400190565b602080825281016108c98161288d565b600f8152602081017f456d707479207472616e736665722e000000000000000000000000000000000081529050612877565b602080825281016108c9816128f7565b8051612945838261266e565b506020810151610aaf60208401826125f8565b604081016108c98284612939565b60188152602081017f546f6b656e206973206e6f742077686974656c6973746564000000000000000081529050612877565b602080825281016108c981612966565b60178152602081017f4d657373656e6765722063616e6e6f742062652030783000000000000000000081529050612877565b602080825281016108c9816129a8565b60138152602081017f4f776e65722063616e6e6f74206265203078300000000000000000000000000081529050612877565b602080825281016108c9816129ea565b5f67ffffffffffffffff82166108c9565b6125d481612a2c565b602081016108c98284612a3d565b60138152602081017f41737365742063616e6e6f74206265203078300000000000000000000000000081529050612877565b602080825281016108c981612a54565b60198152602081017f546f6b656e20616c72656164792077686974656c69737465640000000000000081529050612877565b602080825281016108c981612a96565b82818337505f910152565b818352602083019250612af7828483612ad8565b50601f01601f19160190565b60608101612b1182886125f8565b8181036020830152612b24818688612ae3565b90508181036040830152612b39818486612ae3565b979650505050505050565b60308152602081017f436f6e74726163742063616c6c6572206973206e6f742074686520726567697381527f7465726564206d657373656e6765722100000000000000000000000000000000602082015290506128e1565b602080825281016108c981612b44565b60318152602081017f43726f737320636861696e206d65737361676520636f6d696e672066726f6d2081527f696e636f72726563742073656e64657221000000000000000000000000000000602082015290506128e1565b602080825281016108c981612bac565b60318152602081017f43726f737320636861696e206d65737361676520636f6d696e672066726f6d2081527f696e636f72726563742074617267657421000000000000000000000000000000602082015290506128e1565b602080825281016108c981612c14565b60188152602081017f496e76616c6964206d756c74697369672061646472657373000000000000000081529050612877565b602080825281016108c981612c7c565b60258152602081017f417474656d7074696e6720746f20776974686472617720756e6b6e6f776e206181527f737365742e000000000000000000000000000000000000000000000000000000602082015290506128e1565b602080825281016108c981612cbe565b60178152602081017f4e65772061646d696e2063616e6e6f742062652030783000000000000000000081529050612877565b602080825281016108c981612d26565b60108152602081017f546f6b656e206973207061757365642e0000000000000000000000000000000081529050612877565b602080825281016108c981612d68565b601a8152602081017f417474656d7074696e6720656d707479207472616e736665722e00000000000081529050612877565b602080825281016108c981612daa565b602080825281016108c981604e81527f54686973206164647265737320686173206e6f74206265656e20676976656e2060208201527f61207479706520616e64206973207468757320636f6e73696465726564206e6f60408201527f742077686974656c69737465642e000000000000000000000000000000000000606082015260800190565b60408101612e8182856125f8565b6125c9602083018461266e565b60608101612e9c82866125f8565b612ea9602083018561266e565b612eb660408301846125f8565b949350505050565b60128152602081017f574554482063616e6e6f7420626520307830000000000000000000000000000081529050612877565b602080825281016108c981612ebe565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f60018201612f3e57612f3e612f00565b5060010190565b67ffffffffffffffff81166125d4565b63ffffffff81166125d4565b8281835e505f910152565b5f612f75825190565b808452602084019350612f8c818560208601612f61565b601f01601f19169290920192915050565b60ff81166125d4565b60808101612fb48287612f45565b612fc16020830186612f55565b8181036040830152612fd38185612f6c565b9050612fe26060830184612f9d565b95945050505050565b67ffffffffffffffff8116612597565b80516108c981612feb565b5f60208284031215613019576130195f5ffd5b6125c98383612ffb565b80516108c98161260f565b5f60208284031215613041576130415f5ffd5b6125c98383613023565b60148152602081017f5461726765742063616e6e6f742062652030783000000000000000000000000081529050612877565b602080825281016108c98161304b565b80515f9060608401906130a085826125f8565b50602083015184820360208601526130b88282612f6c565b91505060408301516130cd604086018261266e565b509392505050565b602080825281016125c9818461308d565b60148152602081017f4661696c656420746f2073656e6420457468657200000000000000000000000081529050612877565b602080825281016108c9816130e6565b6060810161313682866125f8565b61314360208301856125f8565b612eb6604083018461266e56fea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a264697066735822122029635de475ef12b684011abd5e6387f1b38eac4669c91228427dd2c70b60c99164736f6c634300081c0033", } // TenBridgeABI is the input ABI used to generate the binding from. @@ -887,6 +887,27 @@ func (_TenBridge *TenBridgeTransactorSession) ReceiveNativeWrapped(receiver comm return _TenBridge.Contract.ReceiveNativeWrapped(&_TenBridge.TransactOpts, receiver, amount) } +// RemoveWhitelistedToken is a paid mutator transaction binding the contract method 0x1c88705d. +// +// Solidity: function removeWhitelistedToken(address asset) returns() +func (_TenBridge *TenBridgeTransactor) RemoveWhitelistedToken(opts *bind.TransactOpts, asset common.Address) (*types.Transaction, error) { + return _TenBridge.contract.Transact(opts, "removeWhitelistedToken", asset) +} + +// RemoveWhitelistedToken is a paid mutator transaction binding the contract method 0x1c88705d. +// +// Solidity: function removeWhitelistedToken(address asset) returns() +func (_TenBridge *TenBridgeSession) RemoveWhitelistedToken(asset common.Address) (*types.Transaction, error) { + return _TenBridge.Contract.RemoveWhitelistedToken(&_TenBridge.TransactOpts, asset) +} + +// RemoveWhitelistedToken is a paid mutator transaction binding the contract method 0x1c88705d. +// +// Solidity: function removeWhitelistedToken(address asset) returns() +func (_TenBridge *TenBridgeTransactorSession) RemoveWhitelistedToken(asset common.Address) (*types.Transaction, error) { + return _TenBridge.Contract.RemoveWhitelistedToken(&_TenBridge.TransactOpts, asset) +} + // RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. // // Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() diff --git a/contracts/generated/TenBridgeTestnet/TenBridgeTestnet.go b/contracts/generated/TenBridgeTestnet/TenBridgeTestnet.go index 2c4b98d222..27ef8830f0 100644 --- a/contracts/generated/TenBridgeTestnet/TenBridgeTestnet.go +++ b/contracts/generated/TenBridgeTestnet/TenBridgeTestnet.go @@ -31,8 +31,8 @@ var ( // TenBridgeTestnetMetaData contains all meta data concerning the TenBridgeTestnet contract. var TenBridgeTestnetMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC20_TOKEN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAUSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUSPENDED_ERC20_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UNPAUSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantPauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantUnpauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageBus\",\"outputs\":[{\"internalType\":\"contractIMessageBus\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"contractICrossChainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"pauseToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"promoteToAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"receiveAssets\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"receiveNativeWrapped\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"recoverTestnetFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"remoteBridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokePauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeUnpauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"sendERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"sendNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bridge\",\"type\":\"address\"}],\"name\":\"setRemoteBridge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_weth\",\"type\":\"address\"}],\"name\":\"setWeth\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"multisig\",\"type\":\"address\"}],\"name\":\"transferUnpauserRoleToMultisig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"unpauseToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"}],\"name\":\"whitelistToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x6080604052348015600e575f5ffd5b506133028061001c5f395ff3fe60806040526004361061027a575f3560e01c80637533087a1161014b578063a217fddf116100c6578063d547741f1161007c578063e63ab1e911610062578063e63ab1e9146107e2578063f865af0814610815578063fb1bb9de14610834575f5ffd5b8063d547741f14610790578063e4c3ebc7146107af575f5ffd5b8063affed0e0116100ac578063affed0e0146106c7578063b8d1452f14610752578063c091a58b14610771575f5ffd5b8063a217fddf146106a1578063a381c8e2146106b4575f5ffd5b806383bece4d1161011b57806391d148541161010157806391d148541461060b57806393b374421461066e578063a1a227fa1461068d575f5ffd5b806383bece4d146105d85780638456cb59146105f7575f5ffd5b80637533087a1461055b57806375b238fc1461057a5780637920c9861461059a5780637c41ad2c146105b9575f5ffd5b80633b3bff0f116101f5578063498d82ab116101ab5780635ccc9613116101915780635ccc9613146104d65780635d872970146105095780636c11c21c1461053c575f5ffd5b8063498d82ab146104815780635c975abb146104a0575f5ffd5b80633f4ba83a116101db5780633f4ba83a1461042f5780633fc8cef314610443578063485cc95514610462575f5ffd5b80633b3bff0f146103ef5780633cb747bf1461040e575f5ffd5b8063248a9ca31161024a5780632f2ff15d116102305780632f2ff15d1461039257806332968782146103b157806336568abe146103d0575f5ffd5b8063248a9ca3146103195780632540e2da14610373575f5ffd5b806301ffc9a7146102855780630f0a9a4b146102ba57806316ce8149146102e55780631888d71214610306575f5ffd5b3661028157005b5f5ffd5b348015610290575f5ffd5b506102a461029f36600461261c565b610867565b6040516102b1919061264a565b60405180910390f35b3480156102c5575f5ffd5b505f546102d8906001600160a01b031681565b6040516102b19190612671565b3480156102f0575f5ffd5b506103046102ff366004612693565b6108cf565b005b610304610314366004612693565b610974565b348015610324575f5ffd5b506103666103333660046126c1565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6040516102b191906126e4565b34801561037e575f5ffd5b5061030461038d366004612693565b6109ed565b34801561039d575f5ffd5b506103046103ac3660046126f2565b610a26565b3480156103bc575f5ffd5b506103046103cb366004612693565b610a6f565b3480156103db575f5ffd5b506103046103ea3660046126f2565b610aa3565b3480156103fa575f5ffd5b50610304610409366004612693565b610aef565b348015610419575f5ffd5b50610422610b30565b6040516102b19190612745565b34801561043a575f5ffd5b50610304610bbb565b34801561044e575f5ffd5b506001546102d8906001600160a01b031681565b34801561046d575f5ffd5b5061030461047c366004612753565b610bf0565b34801561048c575f5ffd5b5061030461049b3660046127bf565b610de1565b3480156104ab575f5ffd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff166102a4565b3480156104e1575f5ffd5b506103667fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e81565b348015610514575f5ffd5b506103667f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a81565b348015610547575f5ffd5b50610304610556366004612693565b610f1a565b348015610566575f5ffd5b50610304610575366004612846565b610f4e565b348015610585575f5ffd5b506103665f5160206132ad5f395f51905f5281565b3480156105a5575f5ffd5b506103046105b4366004612693565b611069565b3480156105c4575f5ffd5b506103046105d3366004612693565b6110ee565b3480156105e3575f5ffd5b506103046105f2366004612873565b611185565b348015610602575f5ffd5b506103046112e2565b348015610616575f5ffd5b506102a46106253660046126f2565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b348015610679575f5ffd5b50610304610688366004612693565b611314565b348015610698575f5ffd5b50610422611363565b3480156106ac575f5ffd5b506103665f81565b6103046106c2366004612873565b6113e3565b3480156106d2575f5ffd5b5060408051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e63650000000000006020909101527f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f527fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd0054610366565b34801561075d575f5ffd5b5061030461076c366004612693565b61164e565b34801561077c575f5ffd5b5061030461078b366004612693565b61171c565b34801561079b575f5ffd5b506103046107aa3660046126f2565b61184e565b3480156107ba575f5ffd5b506103667fd2fb17ceaa388942529b17e0006ffc4d559f040dd4f2157b8070f17ad211057881565b3480156107ed575f5ffd5b506103667f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b348015610820575f5ffd5b5061030461082f366004612693565b611891565b34801561083f575f5ffd5b506103667f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b5f6001600160e01b031982167f7965db0b0000000000000000000000000000000000000000000000000000000014806108c957507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b5f5160206132ad5f395f51905f526108e6816118c5565b6108ee6118cf565b6001600160a01b03821661091d5760405162461bcd60e51b8152600401610914906128ed565b60405180910390fd5b5f546001600160a01b0316156109455760405162461bcd60e51b815260040161091490612957565b505f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61097c6118cf565b5f341161099b5760405162461bcd60e51b815260040161091490612999565b5f6040518060400160405280348152602001836001600160a01b03168152506040516020016109ca91906129c8565b60408051601f1981840301815291905290506109e98160025f5f61192d565b5050565b5f6109f7816118c5565b610a217f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a83611a38565b505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610a5f816118c5565b610a698383611ae5565b50505050565b5f610a79816118c5565b610a217f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a83611ae5565b6001600160a01b0381163314610ae5576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a218282611a38565b5f5160206132ad5f395f51905f52610b06816118c5565b610a217fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e83611a38565b60408051808201909152601e81527f43726f7373436861696e456e61626c656454454e2e6d657373656e67657200006020909101527fa8b5aada5c72138bb5566a3940e8fe06f59ef8af1e490446ba6ea7fa80395d525f9081527f3b49b3a570909bb4d324cb0ca029c61a2f4f7251edd27af783a6ad02851382005b546001600160a01b0316919050565b7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a610be5816118c5565b610bed611ba8565b50565b5f610bf9611c14565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015610c255750825b90505f8267ffffffffffffffff166001148015610c415750303b155b905081158015610c4f575080155b15610c86576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cba57845468ff00000000000000001916680100000000000000001785555b6001600160a01b038716610ce05760405162461bcd60e51b815260040161091490612a08565b6001600160a01b038616610d065760405162461bcd60e51b815260040161091490612a4a565b610d0f87611c3c565b610d1886611e3d565b610d225f87611ae5565b50610d2d5f30611ae5565b50610d455f5160206132ad5f395f51905f525f611eb5565b610d5c5f5160206132ad5f395f51905f5287611ae5565b50610d877fd2fb17ceaa388942529b17e0006ffc4d559f040dd4f2157b8070f17ad21105785f611ae5565b508315610dd857845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290610dcf90600190612a74565b60405180910390a15b50505050505050565b5f5160206132ad5f395f51905f52610df8816118c5565b610e006118cf565b6001600160a01b038616610e265760405162461bcd60e51b815260040161091490612ab4565b6001600160a01b0386165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff1615610e7d5760405162461bcd60e51b815260040161091490612af6565b610ea77f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a87611ae5565b505f63458ffd6360e01b8787878787604051602401610eca959493929190612b31565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091525f54909150610dd8906001600160a01b03168260015b5f5f5f611f56565b5f610f24816118c5565b610a217f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a83611ae5565b5f546001600160a01b0316610f616120d0565b610f7d5760405162461bcd60e51b815260040161091490612bca565b806001600160a01b0316610f8f6120f2565b6001600160a01b031614610fb55760405162461bcd60e51b815260040161091490612c32565b30610fbe61215f565b6001600160a01b031614610fe45760405162461bcd60e51b815260040161091490612c9a565b610fec6118cf565b60015f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015611039575f5ffd5b505af115801561104b573d5f5f3e3d5ffd5b5050600154610a2193506001600160a01b03169150849050856121a3565b5f611073816118c5565b6001600160a01b0382166110995760405162461bcd60e51b815260040161091490612cdc565b6110c37f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a33611a38565b50610a217f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a83611ae5565b5f5160206132ad5f395f51905f52611105816118c5565b6001600160a01b0382165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff1661115b5760405162461bcd60e51b815260040161091490612d1e565b610a217fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e83611ae5565b5f546001600160a01b03166111986120d0565b6111b45760405162461bcd60e51b815260040161091490612bca565b806001600160a01b03166111c66120f2565b6001600160a01b0316146111ec5760405162461bcd60e51b815260040161091490612c32565b306111f561215f565b6001600160a01b03161461121b5760405162461bcd60e51b815260040161091490612c9a565b6112236121fe565b61122b6118cf565b6001600160a01b0384165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff161561127a576112758484846121a3565b6112da565b6001600160a01b0384165f9081527e5fd0bb0e17815069821c0eac859eb66a4da90a93d511d999ef71402d667e27602052604090205460ff16156112c2576112758284612284565b60405162461bcd60e51b815260040161091490612d86565b610a69612336565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61130c816118c5565b610bed612360565b5f61131e816118c5565b6113266118cf565b6001600160a01b03821661134c5760405162461bcd60e51b815260040161091490612dc8565b6109e95f5160206132ad5f395f51905f5283610a26565b60408051808201909152601f81527f43726f7373436861696e456e61626c656454454e2e6d657373616765427573006020909101527f3e1bb302f668bd876eab4a48b3759a1d614a1ecbcc67ee27a10c9a116878004e5f9081527f6c6664e79adefe2c614a8e3c94fc27135b7678c3722965a80d01e330dd948d00610bac565b6113eb6118cf565b6001600160a01b0383165f9081527ff8f9f0c07f8f13fae35355825022a620ece4ae820bcc59c97dd7358124668dc9602052604090205460ff16156114425760405162461bcd60e51b815260040161091490612e0a565b5f82116114615760405162461bcd60e51b815260040161091490612e4c565b6001600160a01b0383165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff166114b75760405162461bcd60e51b815260040161091490612e5c565b6114c3833330856123bb565b6001546001600160a01b0390811690841603611630576001546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690632e1a7d4d906115229085906004016126e4565b5f604051808303815f87803b158015611539575f5ffd5b505af115801561154b573d5f5f3e3d5ffd5b50505f546040517f1888d712000000000000000000000000000000000000000000000000000000008152309350631888d71292508591611599916001600160a01b0390911690600401612671565b5f604051808303818588803b1580156115b0575f5ffd5b505af11580156115c2573d5f5f3e3d5ffd5b50505050505f637533087a60e01b82846040516024016115e3929190612ee3565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091525f8054919250610a69916001600160a01b0316908390610f12565b5f6383bece4d60e01b8484846040516024016115e393929190612efe565b5f5160206132ad5f395f51905f52611665816118c5565b61166d6118cf565b6001600160a01b0382166116935760405162461bcd60e51b815260040161091490612f60565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091555f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff166109e957610a217f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a83611ae5565b5f5160206132ad5f395f51905f52611733816118c5565b6001600160a01b0382166117595760405162461bcd60e51b815260040161091490612fa2565b4662aa36a7148061176b575046610539145b6117875760405162461bcd60e51b81526004016109149061300a565b478015610a21575f836001600160a01b0316826040515f6040518083038185875af1925050503d805f81146117d7576040519150601f19603f3d011682016040523d82523d5f602084013e6117dc565b606091505b50509050806117fd5760405162461bcd60e51b81526004016109149061304c565b5f6001600160a01b0316846001600160a01b03167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b63988460405161184091906126e4565b60405180910390a350505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154611887816118c5565b610a698383611a38565b5f61189b816118c5565b610a217f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a83611a38565b610bed8133612415565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff161561192b576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611935611363565b60408051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e63650000000000006020909101527f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f526001600160a01b0316630d3fd67c837fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd008054905f6119ca83613089565b919050558688866040518663ffffffff1660e01b81526004016119f09493929190613102565b60206040518083038185885af1158015611a0c573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611a319190613162565b5050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611adc575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506108c9565b5f9150506108c9565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611adc575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055611b5e3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506108c9565b611bb0612493565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051611c099190612671565b60405180910390a150565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006108c9565b60408051808201909152601e81527f43726f7373436861696e456e61626c656454454e2e6d657373656e67657200006020909101527fa8b5aada5c72138bb5566a3940e8fe06f59ef8af1e490446ba6ea7fa80395d525f527f3b49b3a570909bb4d324cb0ca029c61a2f4f7251edd27af783a6ad0285138200805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316179055611ce3610b30565b6001600160a01b031663a1a227fa6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d1e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d42919061318a565b604080518082018252601f81527f43726f7373436861696e456e61626c656454454e2e6d657373616765427573006020918201527f6c6664e79adefe2c614a8e3c94fc27135b7678c3722965a80d01e330dd948d00805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0394909416939093179092558051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e6365000000000000910152507f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f9081527fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd0055565b611e456124ee565b611e4d61252c565b611e5561252c565b611e5f5f82611ae5565b50611e8a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82611ae5565b506109e97f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a82611ae5565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f611f0e845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b6001600160a01b038616611f7c5760405162461bcd60e51b8152600401610914906131d9565b5f6040518060600160405280886001600160a01b0316815260200187815260200185815250604051602001611fb19190613231565b6040516020818303038152906040529050611fca611363565b60408051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e63650000000000006020909101527f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f526001600160a01b0316630d3fd67c837fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd008054905f61205f83613089565b919050558885886040518663ffffffff1660e01b81526004016120859493929190613102565b60206040518083038185885af11580156120a1573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906120c69190613162565b5050505050505050565b5f6120d9610b30565b6001600160a01b0316336001600160a01b031614905090565b5f6120fb610b30565b6001600160a01b03166363012de56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612136573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215a919061318a565b905090565b5f612168610b30565b6001600160a01b031663b859ce836040518163ffffffff1660e01b8152600401602060405180830381865afa158015612136573d5f5f3e3d5ffd5b6121ae838284612534565b826001600160a01b0316816001600160a01b03167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398846040516121f191906126e4565b60405180910390a3505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c15612257576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61192b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b9061255a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146122cd576040519150601f19603f3d011682016040523d82523d5f602084013e6122d2565b606091505b50509050806122f35760405162461bcd60e51b815260040161091490613274565b5f6001600160a01b0316836001600160a01b03167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398846040516121f191906126e4565b61192b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0061227e565b6123686118cf565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611bfc565b610a6984856001600160a01b03166323b872dd8686866040516024016123e393929190613284565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612561565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff166109e95780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401610914929190612ee3565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1661192b576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124f66125dd565b61192b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61192b6124ee565b610a2183846001600160a01b031663a9059cbb85856040516024016123e3929190612ee3565b80825d5050565b5f5f60205f8451602086015f885af180612580576040513d5f823e3d81fd5b50505f513d915081156125975780600114156125a4565b6001600160a01b0384163b155b15610a6957836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016109149190612671565b5f6125e6611c14565b5468010000000000000000900460ff16919050565b6001600160e01b031981165b8114610bed575f5ffd5b80356108c9816125fb565b5f6020828403121561262f5761262f5f5ffd5b6126398383612611565b9392505050565b8015155b82525050565b602081016108c98284612640565b5f6001600160a01b0382166108c9565b61264481612658565b602081016108c98284612668565b61260781612658565b80356108c98161267f565b5f602082840312156126a6576126a65f5ffd5b6126398383612688565b80612607565b80356108c9816126b0565b5f602082840312156126d4576126d45f5ffd5b61263983836126b6565b80612644565b602081016108c982846126de565b5f5f60408385031215612706576127065f5ffd5b61271084846126b6565b915061271f8460208501612688565b90509250929050565b5f6108c982612658565b5f6108c982612728565b61264481612732565b602081016108c9828461273c565b5f5f60408385031215612767576127675f5ffd5b6127108484612688565b5f5f83601f840112612784576127845f5ffd5b50813567ffffffffffffffff81111561279e5761279e5f5ffd5b6020830191508360018202830111156127b8576127b85f5ffd5b9250929050565b5f5f5f5f5f606086880312156127d6576127d65f5ffd5b6127e08787612688565b9450602086013567ffffffffffffffff8111156127fe576127fe5f5ffd5b61280a88828901612771565b9450945050604086013567ffffffffffffffff81111561282b5761282b5f5ffd5b61283788828901612771565b92509250509295509295909350565b5f5f6040838503121561285a5761285a5f5ffd5b6128648484612688565b915061271f84602085016126b6565b5f5f5f60608486031215612888576128885f5ffd5b6128928585612688565b92506128a185602086016126b6565b91506128b08560408601612688565b90509250925092565b60148152602081017f4272696467652063616e6e6f7420626520307830000000000000000000000000815290505b60200190565b602080825281016108c9816128b9565b60228152602081017f52656d6f746520627269646765206164647265737320616c726561647920736581527f742e000000000000000000000000000000000000000000000000000000000000602082015290505b60400190565b602080825281016108c9816128fd565b600f8152602081017f456d707479207472616e736665722e0000000000000000000000000000000000815290506128e7565b602080825281016108c981612967565b80516129b583826126de565b506020810151610a216020840182612668565b604081016108c982846129a9565b60178152602081017f4d657373656e6765722063616e6e6f7420626520307830000000000000000000815290506128e7565b602080825281016108c9816129d6565b60138152602081017f4f776e65722063616e6e6f742062652030783000000000000000000000000000815290506128e7565b602080825281016108c981612a18565b5f67ffffffffffffffff82166108c9565b61264481612a5a565b602081016108c98284612a6b565b60138152602081017f41737365742063616e6e6f742062652030783000000000000000000000000000815290506128e7565b602080825281016108c981612a82565b60198152602081017f546f6b656e20616c72656164792077686974656c697374656400000000000000815290506128e7565b602080825281016108c981612ac4565b82818337505f910152565b818352602083019250612b25828483612b06565b50601f01601f19160190565b60608101612b3f8288612668565b8181036020830152612b52818688612b11565b90508181036040830152612b67818486612b11565b979650505050505050565b60308152602081017f436f6e74726163742063616c6c6572206973206e6f742074686520726567697381527f7465726564206d657373656e676572210000000000000000000000000000000060208201529050612951565b602080825281016108c981612b72565b60318152602081017f43726f737320636861696e206d65737361676520636f6d696e672066726f6d2081527f696e636f72726563742073656e6465722100000000000000000000000000000060208201529050612951565b602080825281016108c981612bda565b60318152602081017f43726f737320636861696e206d65737361676520636f6d696e672066726f6d2081527f696e636f7272656374207461726765742100000000000000000000000000000060208201529050612951565b602080825281016108c981612c42565b60188152602081017f496e76616c6964206d756c746973696720616464726573730000000000000000815290506128e7565b602080825281016108c981612caa565b60188152602081017f546f6b656e206973206e6f742077686974656c69737465640000000000000000815290506128e7565b602080825281016108c981612cec565b60258152602081017f417474656d7074696e6720746f20776974686472617720756e6b6e6f776e206181527f737365742e00000000000000000000000000000000000000000000000000000060208201529050612951565b602080825281016108c981612d2e565b60178152602081017f4e65772061646d696e2063616e6e6f7420626520307830000000000000000000815290506128e7565b602080825281016108c981612d96565b60108152602081017f546f6b656e206973207061757365642e00000000000000000000000000000000815290506128e7565b602080825281016108c981612dd8565b601a8152602081017f417474656d7074696e6720656d707479207472616e736665722e000000000000815290506128e7565b602080825281016108c981612e1a565b602080825281016108c981604e81527f54686973206164647265737320686173206e6f74206265656e20676976656e2060208201527f61207479706520616e64206973207468757320636f6e73696465726564206e6f60408201527f742077686974656c69737465642e000000000000000000000000000000000000606082015260800190565b60408101612ef18285612668565b61263960208301846126de565b60608101612f0c8286612668565b612f1960208301856126de565b612f266040830184612668565b949350505050565b60128152602081017f574554482063616e6e6f74206265203078300000000000000000000000000000815290506128e7565b602080825281016108c981612f2e565b60168152602081017f52656365697665722063616e6e6f742062652030783000000000000000000000815290506128e7565b602080825281016108c981612f70565b602a8152602081017f5265636f76657279206f6e6c7920616c6c6f776564206f6e20617070726f766581527f6420746573746e6574730000000000000000000000000000000000000000000060208201529050612951565b602080825281016108c981612fb2565b60178152602081017f4661696c656420746f207265636f766572204574686572000000000000000000815290506128e7565b602080825281016108c98161301a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6001820161309a5761309a61305c565b5060010190565b67ffffffffffffffff8116612644565b63ffffffff8116612644565b8281835e505f910152565b5f6130d1825190565b8084526020840193506130e88185602086016130bd565b601f01601f19169290920192915050565b60ff8116612644565b6080810161311082876130a1565b61311d60208301866130b1565b818103604083015261312f81856130c8565b905061313e60608301846130f9565b95945050505050565b67ffffffffffffffff8116612607565b80516108c981613147565b5f60208284031215613175576131755f5ffd5b6126398383613157565b80516108c98161267f565b5f6020828403121561319d5761319d5f5ffd5b612639838361317f565b60148152602081017f5461726765742063616e6e6f7420626520307830000000000000000000000000815290506128e7565b602080825281016108c9816131a7565b80515f9060608401906131fc8582612668565b506020830151848203602086015261321482826130c8565b915050604083015161322960408601826126de565b509392505050565b6020808252810161263981846131e9565b60148152602081017f4661696c656420746f2073656e64204574686572000000000000000000000000815290506128e7565b602080825281016108c981613242565b606081016132928286612668565b61329f6020830185612668565b612f2660408301846126de56fea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a26469706673582212203476db4f69b1b19850757a5e71e029669d99231aa7a2b44b68f9a4680853983964736f6c634300081c0033", + ABI: "[{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC20_TOKEN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAUSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUSPENDED_ERC20_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UNPAUSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantPauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantUnpauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageBus\",\"outputs\":[{\"internalType\":\"contractIMessageBus\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"contractICrossChainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"pauseToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"promoteToAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"receiveAssets\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"receiveNativeWrapped\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"recoverTestnetFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"remoteBridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"removeWhitelistedToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokePauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeUnpauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"sendERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"sendNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bridge\",\"type\":\"address\"}],\"name\":\"setRemoteBridge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_weth\",\"type\":\"address\"}],\"name\":\"setWeth\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"multisig\",\"type\":\"address\"}],\"name\":\"transferUnpauserRoleToMultisig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"unpauseToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"}],\"name\":\"whitelistToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x6080604052348015600e575f5ffd5b506133fd8061001c5f395ff3fe608060405260043610610294575f3560e01c80636c11c21c11610165578063a217fddf116100c6578063d547741f1161007c578063e63ab1e911610062578063e63ab1e91461081b578063f865af081461084e578063fb1bb9de1461086d575f5ffd5b8063d547741f146107c9578063e4c3ebc7146107e8575f5ffd5b8063affed0e0116100ac578063affed0e014610700578063b8d1452f1461078b578063c091a58b146107aa575f5ffd5b8063a217fddf146106da578063a381c8e2146106ed575f5ffd5b806383bece4d1161011b57806391d148541161010157806391d148541461064457806393b37442146106a7578063a1a227fa146106c6575f5ffd5b806383bece4d146106115780638456cb5914610630575f5ffd5b806375b238fc1161014b57806375b238fc146105b35780637920c986146105d35780637c41ad2c146105f2575f5ffd5b80636c11c21c146105755780637533087a14610594575f5ffd5b806336568abe1161020f578063485cc955116101c55780635c975abb116101ab5780635c975abb146104d95780635ccc96131461050f5780635d87297014610542575f5ffd5b8063485cc9551461049b578063498d82ab146104ba575f5ffd5b80633cb747bf116101f55780633cb747bf146104475780633f4ba83a146104685780633fc8cef31461047c575f5ffd5b806336568abe146104095780633b3bff0f14610428575f5ffd5b80631c88705d116102645780632540e2da1161024a5780632540e2da146103ac5780632f2ff15d146103cb57806332968782146103ea575f5ffd5b80631c88705d14610333578063248a9ca314610352575f5ffd5b806301ffc9a71461029f5780630f0a9a4b146102d457806316ce8149146102ff5780631888d71214610320575f5ffd5b3661029b57005b5f5ffd5b3480156102aa575f5ffd5b506102be6102b9366004612717565b6108a0565b6040516102cb9190612745565b60405180910390f35b3480156102df575f5ffd5b505f546102f2906001600160a01b031681565b6040516102cb919061276c565b34801561030a575f5ffd5b5061031e61031936600461278e565b610908565b005b61031e61032e36600461278e565b6109ad565b34801561033e575f5ffd5b5061031e61034d36600461278e565b610a26565b34801561035d575f5ffd5b5061039f61036c3660046127bc565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6040516102cb91906127df565b3480156103b7575f5ffd5b5061031e6103c636600461278e565b610aed565b3480156103d6575f5ffd5b5061031e6103e53660046127ed565b610b21565b3480156103f5575f5ffd5b5061031e61040436600461278e565b610b6a565b348015610414575f5ffd5b5061031e6104233660046127ed565b610b9e565b348015610433575f5ffd5b5061031e61044236600461278e565b610bea565b348015610452575f5ffd5b5061045b610c2b565b6040516102cb9190612840565b348015610473575f5ffd5b5061031e610cb6565b348015610487575f5ffd5b506001546102f2906001600160a01b031681565b3480156104a6575f5ffd5b5061031e6104b536600461284e565b610ceb565b3480156104c5575f5ffd5b5061031e6104d43660046128ba565b610edc565b3480156104e4575f5ffd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff166102be565b34801561051a575f5ffd5b5061039f7fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e81565b34801561054d575f5ffd5b5061039f7f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a81565b348015610580575f5ffd5b5061031e61058f36600461278e565b611015565b34801561059f575f5ffd5b5061031e6105ae366004612941565b611049565b3480156105be575f5ffd5b5061039f5f5160206133a85f395f51905f5281565b3480156105de575f5ffd5b5061031e6105ed36600461278e565b611164565b3480156105fd575f5ffd5b5061031e61060c36600461278e565b6111e9565b34801561061c575f5ffd5b5061031e61062b36600461296e565b611280565b34801561063b575f5ffd5b5061031e6113dd565b34801561064f575f5ffd5b506102be61065e3660046127ed565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156106b2575f5ffd5b5061031e6106c136600461278e565b61140f565b3480156106d1575f5ffd5b5061045b61145e565b3480156106e5575f5ffd5b5061039f5f81565b61031e6106fb36600461296e565b6114de565b34801561070b575f5ffd5b5060408051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e63650000000000006020909101527f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f527fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd005461039f565b348015610796575f5ffd5b5061031e6107a536600461278e565b611749565b3480156107b5575f5ffd5b5061031e6107c436600461278e565b611817565b3480156107d4575f5ffd5b5061031e6107e33660046127ed565b611949565b3480156107f3575f5ffd5b5061039f7fd2fb17ceaa388942529b17e0006ffc4d559f040dd4f2157b8070f17ad211057881565b348015610826575f5ffd5b5061039f7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b348015610859575f5ffd5b5061031e61086836600461278e565b61198c565b348015610878575f5ffd5b5061039f7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b5f6001600160e01b031982167f7965db0b00000000000000000000000000000000000000000000000000000000148061090257507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b5f5160206133a85f395f51905f5261091f816119c0565b6109276119ca565b6001600160a01b0382166109565760405162461bcd60e51b815260040161094d906129e8565b60405180910390fd5b5f546001600160a01b03161561097e5760405162461bcd60e51b815260040161094d90612a52565b505f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6109b56119ca565b5f34116109d45760405162461bcd60e51b815260040161094d90612a94565b5f6040518060400160405280348152602001836001600160a01b0316815250604051602001610a039190612ac3565b60408051601f198184030181529190529050610a228160025f5f611a28565b5050565b5f5160206133a85f395f51905f52610a3d816119c0565b6001600160a01b0382165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff16610a935760405162461bcd60e51b815260040161094d90612b03565b610abd7f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a83611b33565b50610ae87fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e83611b33565b505050565b5f610af7816119c0565b610ae87f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a83611b33565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610b5a816119c0565b610b648383611be0565b50505050565b5f610b74816119c0565b610ae87f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a83611be0565b6001600160a01b0381163314610be0576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ae88282611b33565b5f5160206133a85f395f51905f52610c01816119c0565b610ae87fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e83611b33565b60408051808201909152601e81527f43726f7373436861696e456e61626c656454454e2e6d657373656e67657200006020909101527fa8b5aada5c72138bb5566a3940e8fe06f59ef8af1e490446ba6ea7fa80395d525f9081527f3b49b3a570909bb4d324cb0ca029c61a2f4f7251edd27af783a6ad02851382005b546001600160a01b0316919050565b7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a610ce0816119c0565b610ce8611ca3565b50565b5f610cf4611d0f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015610d205750825b90505f8267ffffffffffffffff166001148015610d3c5750303b155b905081158015610d4a575080155b15610d81576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610db557845468ff00000000000000001916680100000000000000001785555b6001600160a01b038716610ddb5760405162461bcd60e51b815260040161094d90612b45565b6001600160a01b038616610e015760405162461bcd60e51b815260040161094d90612b87565b610e0a87611d37565b610e1386611f38565b610e1d5f87611be0565b50610e285f30611be0565b50610e405f5160206133a85f395f51905f525f611fb0565b610e575f5160206133a85f395f51905f5287611be0565b50610e827fd2fb17ceaa388942529b17e0006ffc4d559f040dd4f2157b8070f17ad21105785f611be0565b508315610ed357845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290610eca90600190612bb1565b60405180910390a15b50505050505050565b5f5160206133a85f395f51905f52610ef3816119c0565b610efb6119ca565b6001600160a01b038616610f215760405162461bcd60e51b815260040161094d90612bf1565b6001600160a01b0386165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff1615610f785760405162461bcd60e51b815260040161094d90612c33565b610fa27f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a87611be0565b505f63458ffd6360e01b8787878787604051602401610fc5959493929190612c6e565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091525f54909150610ed3906001600160a01b03168260015b5f5f5f612051565b5f61101f816119c0565b610ae87f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a83611be0565b5f546001600160a01b031661105c6121cb565b6110785760405162461bcd60e51b815260040161094d90612d07565b806001600160a01b031661108a6121ed565b6001600160a01b0316146110b05760405162461bcd60e51b815260040161094d90612d6f565b306110b961225a565b6001600160a01b0316146110df5760405162461bcd60e51b815260040161094d90612dd7565b6110e76119ca565b60015f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015611134575f5ffd5b505af1158015611146573d5f5f3e3d5ffd5b5050600154610ae893506001600160a01b031691508490508561229e565b5f61116e816119c0565b6001600160a01b0382166111945760405162461bcd60e51b815260040161094d90612e19565b6111be7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a33611b33565b50610ae87f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a83611be0565b5f5160206133a85f395f51905f52611200816119c0565b6001600160a01b0382165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff166112565760405162461bcd60e51b815260040161094d90612b03565b610ae87fe08e2b666d5448741eeecf0d9bbc95ce21b6e73cca0d67afab4279e53c07cd3e83611be0565b5f546001600160a01b03166112936121cb565b6112af5760405162461bcd60e51b815260040161094d90612d07565b806001600160a01b03166112c16121ed565b6001600160a01b0316146112e75760405162461bcd60e51b815260040161094d90612d6f565b306112f061225a565b6001600160a01b0316146113165760405162461bcd60e51b815260040161094d90612dd7565b61131e6122f9565b6113266119ca565b6001600160a01b0384165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff16156113755761137084848461229e565b6113d5565b6001600160a01b0384165f9081527e5fd0bb0e17815069821c0eac859eb66a4da90a93d511d999ef71402d667e27602052604090205460ff16156113bd57611370828461237f565b60405162461bcd60e51b815260040161094d90612e81565b610b64612431565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611407816119c0565b610ce861245b565b5f611419816119c0565b6114216119ca565b6001600160a01b0382166114475760405162461bcd60e51b815260040161094d90612ec3565b610a225f5160206133a85f395f51905f5283610b21565b60408051808201909152601f81527f43726f7373436861696e456e61626c656454454e2e6d657373616765427573006020909101527f3e1bb302f668bd876eab4a48b3759a1d614a1ecbcc67ee27a10c9a116878004e5f9081527f6c6664e79adefe2c614a8e3c94fc27135b7678c3722965a80d01e330dd948d00610ca7565b6114e66119ca565b6001600160a01b0383165f9081527ff8f9f0c07f8f13fae35355825022a620ece4ae820bcc59c97dd7358124668dc9602052604090205460ff161561153d5760405162461bcd60e51b815260040161094d90612f05565b5f821161155c5760405162461bcd60e51b815260040161094d90612f47565b6001600160a01b0383165f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff166115b25760405162461bcd60e51b815260040161094d90612f57565b6115be833330856124b6565b6001546001600160a01b039081169084160361172b576001546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690632e1a7d4d9061161d9085906004016127df565b5f604051808303815f87803b158015611634575f5ffd5b505af1158015611646573d5f5f3e3d5ffd5b50505f546040517f1888d712000000000000000000000000000000000000000000000000000000008152309350631888d71292508591611694916001600160a01b039091169060040161276c565b5f604051808303818588803b1580156116ab575f5ffd5b505af11580156116bd573d5f5f3e3d5ffd5b50505050505f637533087a60e01b82846040516024016116de929190612fde565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091525f8054919250610b64916001600160a01b031690839061100d565b5f6383bece4d60e01b8484846040516024016116de93929190612ff9565b5f5160206133a85f395f51905f52611760816119c0565b6117686119ca565b6001600160a01b03821661178e5760405162461bcd60e51b815260040161094d9061305b565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091555f9081527fe0305390dd8de2e924991bcde8c43652df4370e71f9558170e600f8cd2fe1d57602052604090205460ff16610a2257610ae87f9f225881f6e7ac8a885b63aa2269cbce78dd6a669864ccd2cd2517a8e709d73a83611be0565b5f5160206133a85f395f51905f5261182e816119c0565b6001600160a01b0382166118545760405162461bcd60e51b815260040161094d9061309d565b4662aa36a71480611866575046610539145b6118825760405162461bcd60e51b815260040161094d90613105565b478015610ae8575f836001600160a01b0316826040515f6040518083038185875af1925050503d805f81146118d2576040519150601f19603f3d011682016040523d82523d5f602084013e6118d7565b606091505b50509050806118f85760405162461bcd60e51b815260040161094d90613147565b5f6001600160a01b0316846001600160a01b03167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b63988460405161193b91906127df565b60405180910390a350505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154611982816119c0565b610b648383611b33565b5f611996816119c0565b610ae87f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a83611b33565b610ce88133612510565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611a26576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611a3061145e565b60408051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e63650000000000006020909101527f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f526001600160a01b0316630d3fd67c837fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd008054905f611ac583613184565b919050558688866040518663ffffffff1660e01b8152600401611aeb94939291906131fd565b60206040518083038185885af1158015611b07573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611b2c919061325d565b5050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611bd7575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610902565b5f915050610902565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611bd7575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055611c593390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610902565b611cab61258e565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051611d04919061276c565b60405180910390a150565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610902565b60408051808201909152601e81527f43726f7373436861696e456e61626c656454454e2e6d657373656e67657200006020909101527fa8b5aada5c72138bb5566a3940e8fe06f59ef8af1e490446ba6ea7fa80395d525f527f3b49b3a570909bb4d324cb0ca029c61a2f4f7251edd27af783a6ad0285138200805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316179055611dde610c2b565b6001600160a01b031663a1a227fa6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e19573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3d9190613285565b604080518082018252601f81527f43726f7373436861696e456e61626c656454454e2e6d657373616765427573006020918201527f6c6664e79adefe2c614a8e3c94fc27135b7678c3722965a80d01e330dd948d00805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0394909416939093179092558051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e6365000000000000910152507f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f9081527fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd0055565b611f406125e9565b611f48612627565b611f50612627565b611f5a5f82611be0565b50611f857f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82611be0565b50610a227f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a82611be0565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f612009845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b6001600160a01b0386166120775760405162461bcd60e51b815260040161094d906132d4565b5f6040518060600160405280886001600160a01b03168152602001878152602001858152506040516020016120ac919061332c565b60405160208183030381529060405290506120c561145e565b60408051808201909152601a81527f43726f7373436861696e456e61626c656454454e2e6e6f6e63650000000000006020909101527f896d106647b57d520a34062c7c0dde769b7551e327629f69d5e9844e20c864625f526001600160a01b0316630d3fd67c837fe7fbfe9855ab39eb2e984ddc0938c4134151cf94d8a54d4770b35b584ad4bd008054905f61215a83613184565b919050558885886040518663ffffffff1660e01b815260040161218094939291906131fd565b60206040518083038185885af115801561219c573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906121c1919061325d565b5050505050505050565b5f6121d4610c2b565b6001600160a01b0316336001600160a01b031614905090565b5f6121f6610c2b565b6001600160a01b03166363012de56040518163ffffffff1660e01b8152600401602060405180830381865afa158015612231573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122559190613285565b905090565b5f612263610c2b565b6001600160a01b031663b859ce836040518163ffffffff1660e01b8152600401602060405180830381865afa158015612231573d5f5f3e3d5ffd5b6122a983828461262f565b826001600160a01b0316816001600160a01b03167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398846040516122ec91906127df565b60405180910390a3505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c15612352576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a2660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b90612655565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146123c8576040519150601f19603f3d011682016040523d82523d5f602084013e6123cd565b606091505b50509050806123ee5760405162461bcd60e51b815260040161094d9061336f565b5f6001600160a01b0316836001600160a01b03167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398846040516122ec91906127df565b611a265f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00612379565b6124636119ca565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611cf7565b610b6484856001600160a01b03166323b872dd8686866040516024016124de9392919061337f565b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061265c565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610a225780826040517fe2517d3f00000000000000000000000000000000000000000000000000000000815260040161094d929190612fde565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611a26576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125f16126d8565b611a26576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a266125e9565b610ae883846001600160a01b031663a9059cbb85856040516024016124de929190612fde565b80825d5050565b5f5f60205f8451602086015f885af18061267b576040513d5f823e3d81fd5b50505f513d9150811561269257806001141561269f565b6001600160a01b0384163b155b15610b6457836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161094d919061276c565b5f6126e1611d0f565b5468010000000000000000900460ff16919050565b6001600160e01b031981165b8114610ce8575f5ffd5b8035610902816126f6565b5f6020828403121561272a5761272a5f5ffd5b612734838361270c565b9392505050565b8015155b82525050565b60208101610902828461273b565b5f6001600160a01b038216610902565b61273f81612753565b602081016109028284612763565b61270281612753565b80356109028161277a565b5f602082840312156127a1576127a15f5ffd5b6127348383612783565b80612702565b8035610902816127ab565b5f602082840312156127cf576127cf5f5ffd5b61273483836127b1565b8061273f565b6020810161090282846127d9565b5f5f60408385031215612801576128015f5ffd5b61280b84846127b1565b915061281a8460208501612783565b90509250929050565b5f61090282612753565b5f61090282612823565b61273f8161282d565b602081016109028284612837565b5f5f60408385031215612862576128625f5ffd5b61280b8484612783565b5f5f83601f84011261287f5761287f5f5ffd5b50813567ffffffffffffffff811115612899576128995f5ffd5b6020830191508360018202830111156128b3576128b35f5ffd5b9250929050565b5f5f5f5f5f606086880312156128d1576128d15f5ffd5b6128db8787612783565b9450602086013567ffffffffffffffff8111156128f9576128f95f5ffd5b6129058882890161286c565b9450945050604086013567ffffffffffffffff811115612926576129265f5ffd5b6129328882890161286c565b92509250509295509295909350565b5f5f60408385031215612955576129555f5ffd5b61295f8484612783565b915061281a84602085016127b1565b5f5f5f60608486031215612983576129835f5ffd5b61298d8585612783565b925061299c85602086016127b1565b91506129ab8560408601612783565b90509250925092565b60148152602081017f4272696467652063616e6e6f7420626520307830000000000000000000000000815290505b60200190565b60208082528101610902816129b4565b60228152602081017f52656d6f746520627269646765206164647265737320616c726561647920736581527f742e000000000000000000000000000000000000000000000000000000000000602082015290505b60400190565b60208082528101610902816129f8565b600f8152602081017f456d707479207472616e736665722e0000000000000000000000000000000000815290506129e2565b6020808252810161090281612a62565b8051612ab083826127d9565b506020810151610ae86020840182612763565b604081016109028284612aa4565b60188152602081017f546f6b656e206973206e6f742077686974656c69737465640000000000000000815290506129e2565b6020808252810161090281612ad1565b60178152602081017f4d657373656e6765722063616e6e6f7420626520307830000000000000000000815290506129e2565b6020808252810161090281612b13565b60138152602081017f4f776e65722063616e6e6f742062652030783000000000000000000000000000815290506129e2565b6020808252810161090281612b55565b5f67ffffffffffffffff8216610902565b61273f81612b97565b602081016109028284612ba8565b60138152602081017f41737365742063616e6e6f742062652030783000000000000000000000000000815290506129e2565b6020808252810161090281612bbf565b60198152602081017f546f6b656e20616c72656164792077686974656c697374656400000000000000815290506129e2565b6020808252810161090281612c01565b82818337505f910152565b818352602083019250612c62828483612c43565b50601f01601f19160190565b60608101612c7c8288612763565b8181036020830152612c8f818688612c4e565b90508181036040830152612ca4818486612c4e565b979650505050505050565b60308152602081017f436f6e74726163742063616c6c6572206973206e6f742074686520726567697381527f7465726564206d657373656e676572210000000000000000000000000000000060208201529050612a4c565b6020808252810161090281612caf565b60318152602081017f43726f737320636861696e206d65737361676520636f6d696e672066726f6d2081527f696e636f72726563742073656e6465722100000000000000000000000000000060208201529050612a4c565b6020808252810161090281612d17565b60318152602081017f43726f737320636861696e206d65737361676520636f6d696e672066726f6d2081527f696e636f7272656374207461726765742100000000000000000000000000000060208201529050612a4c565b6020808252810161090281612d7f565b60188152602081017f496e76616c6964206d756c746973696720616464726573730000000000000000815290506129e2565b6020808252810161090281612de7565b60258152602081017f417474656d7074696e6720746f20776974686472617720756e6b6e6f776e206181527f737365742e00000000000000000000000000000000000000000000000000000060208201529050612a4c565b6020808252810161090281612e29565b60178152602081017f4e65772061646d696e2063616e6e6f7420626520307830000000000000000000815290506129e2565b6020808252810161090281612e91565b60108152602081017f546f6b656e206973207061757365642e00000000000000000000000000000000815290506129e2565b6020808252810161090281612ed3565b601a8152602081017f417474656d7074696e6720656d707479207472616e736665722e000000000000815290506129e2565b6020808252810161090281612f15565b6020808252810161090281604e81527f54686973206164647265737320686173206e6f74206265656e20676976656e2060208201527f61207479706520616e64206973207468757320636f6e73696465726564206e6f60408201527f742077686974656c69737465642e000000000000000000000000000000000000606082015260800190565b60408101612fec8285612763565b61273460208301846127d9565b606081016130078286612763565b61301460208301856127d9565b6130216040830184612763565b949350505050565b60128152602081017f574554482063616e6e6f74206265203078300000000000000000000000000000815290506129e2565b6020808252810161090281613029565b60168152602081017f52656365697665722063616e6e6f742062652030783000000000000000000000815290506129e2565b602080825281016109028161306b565b602a8152602081017f5265636f76657279206f6e6c7920616c6c6f776564206f6e20617070726f766581527f6420746573746e6574730000000000000000000000000000000000000000000060208201529050612a4c565b60208082528101610902816130ad565b60178152602081017f4661696c656420746f207265636f766572204574686572000000000000000000815290506129e2565b6020808252810161090281613115565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6001820161319557613195613157565b5060010190565b67ffffffffffffffff811661273f565b63ffffffff811661273f565b8281835e505f910152565b5f6131cc825190565b8084526020840193506131e38185602086016131b8565b601f01601f19169290920192915050565b60ff811661273f565b6080810161320b828761319c565b61321860208301866131ac565b818103604083015261322a81856131c3565b905061323960608301846131f4565b95945050505050565b67ffffffffffffffff8116612702565b805161090281613242565b5f60208284031215613270576132705f5ffd5b6127348383613252565b80516109028161277a565b5f60208284031215613298576132985f5ffd5b612734838361327a565b60148152602081017f5461726765742063616e6e6f7420626520307830000000000000000000000000815290506129e2565b60208082528101610902816132a2565b80515f9060608401906132f78582612763565b506020830151848203602086015261330f82826131c3565b915050604083015161332460408601826127d9565b509392505050565b6020808252810161273481846132e4565b60148152602081017f4661696c656420746f2073656e64204574686572000000000000000000000000815290506129e2565b602080825281016109028161333d565b6060810161338d8286612763565b61339a6020830185612763565b61302160408301846127d956fea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220bce4891ff01abb0ae26c6c0c26aa63d73c5870c860f6a4d5002cb8889c7070e164736f6c634300081c0033", } // TenBridgeTestnetABI is the input ABI used to generate the binding from. @@ -908,6 +908,27 @@ func (_TenBridgeTestnet *TenBridgeTestnetTransactorSession) RecoverTestnetFunds( return _TenBridgeTestnet.Contract.RecoverTestnetFunds(&_TenBridgeTestnet.TransactOpts, receiver) } +// RemoveWhitelistedToken is a paid mutator transaction binding the contract method 0x1c88705d. +// +// Solidity: function removeWhitelistedToken(address asset) returns() +func (_TenBridgeTestnet *TenBridgeTestnetTransactor) RemoveWhitelistedToken(opts *bind.TransactOpts, asset common.Address) (*types.Transaction, error) { + return _TenBridgeTestnet.contract.Transact(opts, "removeWhitelistedToken", asset) +} + +// RemoveWhitelistedToken is a paid mutator transaction binding the contract method 0x1c88705d. +// +// Solidity: function removeWhitelistedToken(address asset) returns() +func (_TenBridgeTestnet *TenBridgeTestnetSession) RemoveWhitelistedToken(asset common.Address) (*types.Transaction, error) { + return _TenBridgeTestnet.Contract.RemoveWhitelistedToken(&_TenBridgeTestnet.TransactOpts, asset) +} + +// RemoveWhitelistedToken is a paid mutator transaction binding the contract method 0x1c88705d. +// +// Solidity: function removeWhitelistedToken(address asset) returns() +func (_TenBridgeTestnet *TenBridgeTestnetTransactorSession) RemoveWhitelistedToken(asset common.Address) (*types.Transaction, error) { + return _TenBridgeTestnet.Contract.RemoveWhitelistedToken(&_TenBridgeTestnet.TransactOpts, asset) +} + // RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. // // Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() diff --git a/contracts/scripts/bridge/whitelist_and_register_tokens.ts b/contracts/scripts/bridge/whitelist_and_register_tokens.ts index f31c1ee1a2..c6b5d896dd 100644 --- a/contracts/scripts/bridge/whitelist_and_register_tokens.ts +++ b/contracts/scripts/bridge/whitelist_and_register_tokens.ts @@ -130,7 +130,7 @@ async function ensureGatewayAccountRegistered(gatewayBaseUrl: string, privateKey const baseUrl = gatewayBaseUrl.replace(/\/+$/, ''); const wallet = new ethers.Wallet(privateKey); - const joinResponse = await fetch(`${baseUrl}/join`, { method: 'GET' }); + const joinResponse = await fetch(`${baseUrl}/v1/join/`, { method: 'GET' }); if (!joinResponse.ok) { throw new Error(`Gateway join failed with status ${joinResponse.status}`); } @@ -139,7 +139,7 @@ async function ensureGatewayAccountRegistered(gatewayBaseUrl: string, privateKey throw new Error('Gateway join returned an empty token'); } - const queryUrl = new URL(`${baseUrl}/query/address`); + const queryUrl = new URL(`${baseUrl}/v1/query/`); queryUrl.searchParams.set('token', token); queryUrl.searchParams.set('a', wallet.address); const queryResponse = await fetch(queryUrl.toString(), { method: 'GET' }); @@ -166,7 +166,7 @@ async function ensureGatewayAccountRegistered(gatewayBaseUrl: string, privateKey }; const signature = await wallet.signTypedData(domain, types, message); - const authenticateUrl = new URL(`${baseUrl}/authenticate/`); + const authenticateUrl = new URL(`${baseUrl}/v1/authenticate/`); authenticateUrl.searchParams.set('token', token); const authResponse = await fetch(authenticateUrl.toString(), { method: 'POST', @@ -397,11 +397,27 @@ async function step2WhitelistToken( l1MessageBusAddress: string, tokenAddress: string, tokenName: string, - tokenSymbol: string + tokenSymbol: string, + forceRewhitelist = false ): Promise<{ whitelistReceipt: any; l1MessageBus: MessageBus }> { const l1Bridge = await ethers.getContractAt('TenBridge', l1BridgeAddress); const l1MessageBus = await ethers.getContractAt('MessageBus', l1MessageBusAddress); + const ERC20_TOKEN_ROLE = ethers.keccak256(ethers.toUtf8Bytes('ERC20_TOKEN')); + const alreadyWhitelisted = await l1Bridge.hasRole(ERC20_TOKEN_ROLE, tokenAddress); + if (alreadyWhitelisted) { + if (!forceRewhitelist) { + throw new Error( + `Token ${tokenAddress} is already whitelisted on L1 TenBridge. ` + + `Set FORCE_REWHITELIST=true to remove it and re-whitelist (issues a fresh cross-chain message).` + ); + } + console.log(`Token already whitelisted — removing before re-whitelisting (FORCE_REWHITELIST=true)...`); + const removeTx = await l1Bridge.revokeRole(ERC20_TOKEN_ROLE, tokenAddress); + await removeTx.wait(); + console.log(`Removed. Re-whitelisting...`); + } + const whitelistTx = await l1Bridge.whitelistToken(tokenAddress, tokenName, tokenSymbol); console.log(`Transaction hash: ${whitelistTx.hash}`); @@ -542,13 +558,15 @@ const whitelistAndRegisterToken = async function (): Promise { console.log('[1/7] Querying network addresses...'); const { networkConfig, addresses } = await step1QueryNetworkAddresses(config.networkConfigAddr); + const forceRewhitelist = process.env.FORCE_REWHITELIST === 'false'; console.log('[2/7] Whitelisting token on L1 bridge...'); const { whitelistReceipt, l1MessageBus } = await step2WhitelistToken( addresses.l1BridgeAddress, addresses.l1MessageBusAddress, config.tokenAddress, config.tokenName, - config.tokenSymbol + config.tokenSymbol, + forceRewhitelist ); console.log('[3/7] Extracting cross-chain message...'); diff --git a/contracts/src/reference_bridge/L1/contracts/TenBridge.sol b/contracts/src/reference_bridge/L1/contracts/TenBridge.sol index e4b5abf494..62cd0258cf 100644 --- a/contracts/src/reference_bridge/L1/contracts/TenBridge.sol +++ b/contracts/src/reference_bridge/L1/contracts/TenBridge.sol @@ -87,6 +87,12 @@ contract TenBridge is ); } + function removeWhitelistedToken(address asset) external onlyRole(ADMIN_ROLE) { + require(hasRole(ERC20_TOKEN_ROLE, asset), "Token is not whitelisted"); + _revokeRole(ERC20_TOKEN_ROLE, asset); + _revokeRole(SUSPENDED_ERC20_ROLE, asset); + } + function pauseToken(address asset) external onlyRole(ADMIN_ROLE) { require(hasRole(ERC20_TOKEN_ROLE, asset), "Token is not whitelisted"); _grantRole(SUSPENDED_ERC20_ROLE, asset); diff --git a/contracts/src/reference_bridge/L1/interfaces/ITenBridge.sol b/contracts/src/reference_bridge/L1/interfaces/ITenBridge.sol index fa48f188fa..dd0da9baee 100644 --- a/contracts/src/reference_bridge/L1/interfaces/ITenBridge.sol +++ b/contracts/src/reference_bridge/L1/interfaces/ITenBridge.sol @@ -13,6 +13,10 @@ interface ITenBridge { string calldata symbol ) external; + // Removes a token from the whitelist entirely. Used to recover from a failed whitelistToken flow + // so the token can be re-whitelisted via a fresh cross-chain message. + function removeWhitelistedToken(address asset) external; + // This will pause deposits for this token on the L1 bridge. Withdrawals are still fine. function pauseToken(address asset) external; diff --git a/testnet/launcher/bridgetokenwhitelist/cmd/cli_flags.go b/testnet/launcher/bridgetokenwhitelist/cmd/cli_flags.go index 112d8f0131..53ed419b30 100644 --- a/testnet/launcher/bridgetokenwhitelist/cmd/cli_flags.go +++ b/testnet/launcher/bridgetokenwhitelist/cmd/cli_flags.go @@ -1,6 +1,9 @@ package main -import "flag" +import ( + "flag" + "strings" +) type CLIConfig struct { tokenAddress string @@ -12,10 +15,12 @@ type CLIConfig struct { privateKey string dockerImage string networkConfigAddr string + forceRewhitelist bool } func ParseConfigCLI() *CLIConfig { cfg := &CLIConfig{} + var forceRewhitelistStr string flag.StringVar(&cfg.tokenAddress, "token_address", "", "Token contract address (e.g., 0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238)") flag.StringVar(&cfg.tokenName, "token_name", "", "Token name (e.g., 'USD Coin')") flag.StringVar(&cfg.tokenSymbol, "token_symbol", "", "Token symbol (e.g., 'USDC')") @@ -25,6 +30,8 @@ func ParseConfigCLI() *CLIConfig { flag.StringVar(&cfg.privateKey, "private_key", "", "Private key for deployment") flag.StringVar(&cfg.dockerImage, "docker_image", "", "Docker image for hardhat deployer") flag.StringVar(&cfg.networkConfigAddr, "network_config_addr", "", "NetworkConfig contract address") + flag.StringVar(&forceRewhitelistStr, "force_rewhitelist", "false", "If \"true\", removes an existing ERC20_TOKEN_ROLE from the token before re-whitelisting (use to recover from a failed run)") flag.Parse() + cfg.forceRewhitelist = strings.EqualFold(forceRewhitelistStr, "true") return cfg } diff --git a/testnet/launcher/bridgetokenwhitelist/cmd/main.go b/testnet/launcher/bridgetokenwhitelist/cmd/main.go index ac13086eb2..cfbb73642c 100644 --- a/testnet/launcher/bridgetokenwhitelist/cmd/main.go +++ b/testnet/launcher/bridgetokenwhitelist/cmd/main.go @@ -21,6 +21,7 @@ func main() { bridgetokenwhitelist.WithPrivateKey(cliConfig.privateKey), bridgetokenwhitelist.WithDockerImage(cliConfig.dockerImage), bridgetokenwhitelist.WithNetworkConfigAddress(cliConfig.networkConfigAddr), + bridgetokenwhitelist.WithForceRewhitelist(cliConfig.forceRewhitelist), ), ) if err != nil { diff --git a/testnet/launcher/bridgetokenwhitelist/config.go b/testnet/launcher/bridgetokenwhitelist/config.go index 26d86883a4..b9399f4e31 100644 --- a/testnet/launcher/bridgetokenwhitelist/config.go +++ b/testnet/launcher/bridgetokenwhitelist/config.go @@ -12,6 +12,7 @@ type Config struct { privateKey string dockerImage string networkConfigAddr string + forceRewhitelist bool } func NewConfig(opts ...ConfigOption) *Config { @@ -78,6 +79,12 @@ func WithNetworkConfigAddress(addr string) ConfigOption { } } +func WithForceRewhitelist(force bool) ConfigOption { + return func(c *Config) { + c.forceRewhitelist = force + } +} + func (c *Config) Validate() error { if c.tokenAddress == "" { return fmt.Errorf("token address is required") @@ -110,6 +117,6 @@ func (c *Config) Validate() error { } func (c *Config) String() string { - return fmt.Sprintf("Bridge Token Whitelist Config: tokenAddress=%s, tokenName=%s, tokenSymbol=%s, networkEnv=%s, l1HTTPURL=%s, l2GatewayURL=%s, dockerImage=%s, networkConfigAddr=%s", - c.tokenAddress, c.tokenName, c.tokenSymbol, c.networkEnv, c.l1HTTPURL, c.l2GatewayURL, c.dockerImage, c.networkConfigAddr) + return fmt.Sprintf("Bridge Token Whitelist Config: tokenAddress=%s, tokenName=%s, tokenSymbol=%s, networkEnv=%s, l1HTTPURL=%s, l2GatewayURL=%s, dockerImage=%s, networkConfigAddr=%s, forceRewhitelist=%v", + c.tokenAddress, c.tokenName, c.tokenSymbol, c.networkEnv, c.l1HTTPURL, c.l2GatewayURL, c.dockerImage, c.networkConfigAddr, c.forceRewhitelist) } diff --git a/testnet/launcher/bridgetokenwhitelist/docker.go b/testnet/launcher/bridgetokenwhitelist/docker.go index 93a1a39cfa..cedccd75b9 100644 --- a/testnet/launcher/bridgetokenwhitelist/docker.go +++ b/testnet/launcher/bridgetokenwhitelist/docker.go @@ -69,6 +69,7 @@ func (w *BridgeTokenWhitelister) Start() error { "TOKEN_NAME": w.cfg.tokenName, "TOKEN_SYMBOL": w.cfg.tokenSymbol, "NETWORK_CONFIG_ADDR": w.cfg.networkConfigAddr, + "FORCE_REWHITELIST": fmt.Sprintf("%v", w.cfg.forceRewhitelist), } // Mount scripts and src directories so contracts can be compiled if needed