@axelar-network/interchain-token-service
Version:
Interchain token service for EVM chains to faciliate interchain token transfers and contract calls
829 lines • 63.7 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "InterchainTokenFactory",
"sourceName": "contracts/InterchainTokenFactory.sol",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "interchainTokenService_",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "InvalidChainName",
"type": "error"
},
{
"inputs": [],
"name": "InvalidCodeHash",
"type": "error"
},
{
"inputs": [],
"name": "InvalidImplementation",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "minter",
"type": "address"
}
],
"name": "InvalidMinter",
"type": "error"
},
{
"inputs": [],
"name": "InvalidOwner",
"type": "error"
},
{
"inputs": [],
"name": "InvalidOwnerAddress",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "tokenId",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "expectedTokenId",
"type": "bytes32"
}
],
"name": "InvalidTokenId",
"type": "error"
},
{
"inputs": [],
"name": "MulticallFailed",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "minter",
"type": "address"
}
],
"name": "NotMinter",
"type": "error"
},
{
"inputs": [],
"name": "NotOwner",
"type": "error"
},
{
"inputs": [],
"name": "NotProxy",
"type": "error"
},
{
"inputs": [],
"name": "NotSupported",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
}
],
"name": "NotToken",
"type": "error"
},
{
"inputs": [],
"name": "RemoteDeploymentNotApproved",
"type": "error"
},
{
"inputs": [],
"name": "SetupFailed",
"type": "error"
},
{
"inputs": [],
"name": "ZeroAddress",
"type": "error"
},
{
"inputs": [],
"name": "ZeroSupplyToken",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "minter",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "deployer",
"type": "address"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "tokenId",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "string",
"name": "destinationChain",
"type": "string"
},
{
"indexed": false,
"internalType": "bytes",
"name": "destinationMinter",
"type": "bytes"
}
],
"name": "DeployRemoteInterchainTokenApproval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferStarted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "minter",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "deployer",
"type": "address"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "tokenId",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "string",
"name": "destinationChain",
"type": "string"
}
],
"name": "RevokedDeployRemoteInterchainTokenApproval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "newImplementation",
"type": "address"
}
],
"name": "Upgraded",
"type": "event"
},
{
"inputs": [],
"name": "acceptOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "deployer",
"type": "address"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "string",
"name": "destinationChain",
"type": "string"
},
{
"internalType": "bytes",
"name": "destinationMinter",
"type": "bytes"
}
],
"name": "approveDeployRemoteInterchainToken",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
}
],
"name": "canonicalInterchainTokenDeploySalt",
"outputs": [
{
"internalType": "bytes32",
"name": "deploySalt",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
}
],
"name": "canonicalInterchainTokenId",
"outputs": [
{
"internalType": "bytes32",
"name": "tokenId",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "chainNameHash",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "contractId",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"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": "address",
"name": "minter",
"type": "address"
}
],
"name": "deployInterchainToken",
"outputs": [
{
"internalType": "bytes32",
"name": "tokenId",
"type": "bytes32"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "originalTokenAddress",
"type": "address"
},
{
"internalType": "string",
"name": "destinationChain",
"type": "string"
},
{
"internalType": "uint256",
"name": "gasValue",
"type": "uint256"
}
],
"name": "deployRemoteCanonicalInterchainToken",
"outputs": [
{
"internalType": "bytes32",
"name": "tokenId",
"type": "bytes32"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "string",
"name": "destinationChain",
"type": "string"
},
{
"internalType": "uint256",
"name": "gasValue",
"type": "uint256"
}
],
"name": "deployRemoteInterchainToken",
"outputs": [
{
"internalType": "bytes32",
"name": "tokenId",
"type": "bytes32"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "address",
"name": "minter",
"type": "address"
},
{
"internalType": "string",
"name": "destinationChain",
"type": "string"
},
{
"internalType": "bytes",
"name": "destinationMinter",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "gasValue",
"type": "uint256"
}
],
"name": "deployRemoteInterchainTokenWithMinter",
"outputs": [
{
"internalType": "bytes32",
"name": "tokenId",
"type": "bytes32"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "implementation",
"outputs": [
{
"internalType": "address",
"name": "implementation_",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "deployer",
"type": "address"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "interchainTokenDeploySalt",
"outputs": [
{
"internalType": "bytes32",
"name": "deploySalt",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "deployer",
"type": "address"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "interchainTokenId",
"outputs": [
{
"internalType": "bytes32",
"name": "tokenId",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "interchainTokenService",
"outputs": [
{
"internalType": "contract IInterchainTokenService",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "string",
"name": "destinationChain",
"type": "string"
},
{
"internalType": "bytes",
"name": "destinationTokenAddress",
"type": "bytes"
},
{
"internalType": "enum ITokenManagerType.TokenManagerType",
"name": "tokenManagerType",
"type": "uint8"
},
{
"internalType": "bytes",
"name": "linkParams",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "gasValue",
"type": "uint256"
}
],
"name": "linkToken",
"outputs": [
{
"internalType": "bytes32",
"name": "tokenId",
"type": "bytes32"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "deployer",
"type": "address"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "linkedTokenDeploySalt",
"outputs": [
{
"internalType": "bytes32",
"name": "deploySalt",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "deployer",
"type": "address"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "linkedTokenId",
"outputs": [
{
"internalType": "bytes32",
"name": "tokenId",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes[]",
"name": "data",
"type": "bytes[]"
}
],
"name": "multicall",
"outputs": [
{
"internalType": "bytes[]",
"name": "results",
"type": "bytes[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "owner_",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pendingOwner",
"outputs": [
{
"internalType": "address",
"name": "owner_",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "proposeOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
}
],
"name": "registerCanonicalInterchainToken",
"outputs": [
{
"internalType": "bytes32",
"name": "tokenId",
"type": "bytes32"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "enum ITokenManagerType.TokenManagerType",
"name": "tokenManagerType",
"type": "uint8"
},
{
"internalType": "address",
"name": "operator",
"type": "address"
}
],
"name": "registerCustomToken",
"outputs": [
{
"internalType": "bytes32",
"name": "tokenId",
"type": "bytes32"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "deployer",
"type": "address"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "string",
"name": "destinationChain",
"type": "string"
}
],
"name": "revokeDeployRemoteInterchainToken",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "setup",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newImplementation",
"type": "address"
},
{
"internalType": "bytes32",
"name": "newImplementationCodeHash",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "params",
"type": "bytes"
}
],
"name": "upgrade",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x60e060405234801561001057600080fd5b50604051612e10380380612e1083398101604081905261002f91610180565b600161003a816100dd565b50306080526001600160a01b0381166100665760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03811660a08190526040805163864a0dcf60e01b8152905163864a0dcf916004808201926020929091908290030181865afa1580156100b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100d491906101b0565b60c052506101c9565b6001600160a01b03811661010457604051633649397d60e21b815260040160405180910390fd5b6040516001600160a01b038216907f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616390600090a27f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05560007f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d155565b60006020828403121561019257600080fd5b81516001600160a01b03811681146101a957600080fd5b9392505050565b6000602082840312156101c257600080fd5b5051919050565b60805160a05160c051612baf6102616000396000818161038c01528181610b8001528181610c050152610ff80152600081816101e90152818161059901528181610696015281816107f1015281816108880152818161144901528181611691015281816117580152818161199e01528181611aeb01528181611bca01528181611c5c0152611db0015260006110420152612baf6000f3fe6080604052600436106101ac5760003560e01c8063864a0dcf116100ec578063a75483d11161008a578063d8c0326811610064578063d8c03268146104c8578063e30c3978146104db578063e8a1d6f61461050f578063f2fde38b1461052f57600080fd5b8063a75483d114610475578063ac9650d814610488578063b2292888146104a857600080fd5b80639ded06df116100c65780639ded06df14610402578063a3499c7314610422578063a37fcf4e14610442578063a5269ef11461045557600080fd5b8063864a0dcf1461037a5780638da5cb5b146103ae5780639d6d57b3146103e257600080fd5b80634987e2c21161015957806379ba50971161013357806379ba5097146102f25780637c2def17146103075780638291286c14610327578063848f7b631461035a57600080fd5b80634987e2c2146102895780635c60da1b1461029c578063710bf322146102d057600080fd5b80633e12f8c51161018a5780633e12f8c514610236578063415621061461024957806343b0f3d31461026957600080fd5b8063010987dc146101b157806309c6bed9146101d75780630f4433d314610223575b600080fd5b6101c46101bf3660046121b7565b61054f565b6040519081526020015b60405180910390f35b3480156101e357600080fd5b5061020b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101ce565b6101c461023136600461221e565b610588565b6101c461024436600461230b565b610646565b34801561025557600080fd5b506101c46102643660046123b9565b610b54565b34801561027557600080fd5b506101c46102843660046123d6565b610bd9565b6101c4610297366004612471565b610c66565b3480156102a857600080fd5b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5461020b565b3480156102dc57600080fd5b506102f06102eb3660046123b9565b610d60565b005b3480156102fe57600080fd5b506102f0610e2f565b34801561031357600080fd5b506101c46103223660046123d6565b610ea9565b34801561033357600080fd5b507f80547d63ed663962b99f8ed432bff3879a35b5418af92258aa171feef14cc3cc6101c4565b34801561036657600080fd5b506102f061037536600461254a565b610ec9565b34801561038657600080fd5b506101c47f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ba57600080fd5b507f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05461020b565b3480156103ee57600080fd5b506101c46103fd3660046123d6565b610fcc565b34801561040e57600080fd5b506102f061041d3660046125a6565b61103f565b34801561042e57600080fd5b506102f061043d36600461254a565b6110a5565b6101c46104503660046125e8565b6113c7565b34801561046157600080fd5b506101c46104703660046123d6565b6113fc565b6101c46104833660046123b9565b611409565b61049b610496366004612625565b6114c9565b6040516101ce91906126ec565b3480156104b457600080fd5b506101c46104c33660046123b9565b611619565b6101c46104d6366004612751565b611637565b3480156104e757600080fd5b507f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d15461020b565b34801561051b57600080fd5b506102f061052a3660046127a2565b61170f565b34801561053b57600080fd5b506102f061054a3660046123b9565b61191e565b60008061055c3387610bd9565b60408051600081526020810190915290915061057e908290879087908761196e565b9695505050505050565b600080610595338c610fcc565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630f4433d384838d8d8d8d8d8d8d8d6040518b63ffffffff1660e01b81526004016105f49998979695949392919061287e565b60206040518083038185885af1158015610612573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061063791906128e4565b9b9a5050505050505050505050565b60003381610654828c610bd9565b60408051600080825281830190925260208101828152929350919087156106855761067e30611ab9565b9250610739565b6001600160a01b03871615610707577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316036106f55760405162f78d2360e81b81526001600160a01b03881660048201526024015b60405180910390fd5b61067e876001600160a01b0316611ab9565b6040517fdb80c5f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107d084838f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508d8887611ae7565b95508715610b435760405163b90d6afd60e01b8152600481018790526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b90d6afd90602401602060405180830381865afa158015610840573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086491906128fd565b604051637e10eb1560e01b8152600481018990529091506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637e10eb1590602401602060405180830381865afa1580156108cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f391906128fd565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152602482018d9052919250908316906340c10f1990604401600060405180830381600087803b15801561095a57600080fd5b505af115801561096e573d6000803e3d6000fd5b50506040517fcf86a95a0000000000000000000000000000000000000000000000000000000081526001600160a01b038c811660048301528516925063cf86a95a9150602401600060405180830381600087803b1580156109ce57600080fd5b505af11580156109e2573d6000803e3d6000fd5b50506040517fe915cfd10000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038416925063e915cfd19150602401600060405180830381600087803b158015610a4057600080fd5b505af1158015610a54573d6000803e3d6000fd5b50506040517f120a63b50000000000000000000000000000000000000000000000000000000081526001600160a01b038c811660048301528416925063120a63b59150602401600060405180830381600087803b158015610ab457600080fd5b505af1158015610ac8573d6000803e3d6000fd5b50506040517f4a6a42d80000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015284169250634a6a42d89150602401600060405180830381600087803b158015610b2857600080fd5b505af1158015610b3c573d6000803e3d6000fd5b5050505050505b505050505098975050505050505050565b604080517f9ca52083bb00ac0f5bed7edcaabb0534d03efb0719807b54a8029c4d1313630960208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091526001600160a01b03821660608201526000906080015b604051602081830303815290604052805190602001209050919050565b604080517ff84d43c32bc607f1bdb175c63a0cf1939bf0cc8cc3565450be225afbb5a1098560208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091526001600160a01b03831660608201526080810182905260009060a0015b60405160208183030381529060405280519060200120905092915050565b60006001600160a01b038616610c995760405162f78d2360e81b81526001600160a01b03871660048201526024016106ec565b6000610ca53389610bd9565b90506000610cb282611b91565b9050610cbe8189611c43565b845115610d3157600060405180606001604052808a6001600160a01b0316815260200183815260200189898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152509050610d2b8187611e61565b50610d46565b610d43886001600160a01b0316611ab9565b94505b610d53828888888861196e565b9998505050505050505050565b33610d897f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b031614610db0576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b038116610dd757604051633649397d60e21b815260040160405180910390fd5b6040516001600160a01b038216907fd9be0e8e07417e00f2521db636cb53e316fd288f5051f16d2aa2bf0c3938a87690600090a27f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d155565b6000610e597f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d15490565b90506001600160a01b0381163314610e9d576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ea681611ef3565b50565b600080610eb68484610fcc565b9050610ec181611b91565b949350505050565b336000610ed686866113fc565b90506000610f3a6040518060600160405280856001600160a01b0316815260200184815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050915250611f96565b90507fd4f5c43117c663161acfe6af3208a49856d85e586baf0f60749de2055e00146560000160008281526020019081526020016000206000905581876001600160a01b0316846001600160a01b03167f45aa4b37a2bdfa1ab8962f148a8e9cdf22eda891c46dbdea19295cd85c10b1128888604051610fbb92919061291a565b60405180910390a450505050505050565b604080517f5498bf1696259c19f826e687122ca9404f85fe476a9e186af31eb6a53bf123dc60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091526001600160a01b03831660608201526080810182905260009060a001610c48565b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316036110a1576040517fbf10dd3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b336110ce7f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b0316146110f5576040516330cd747160e01b815260040160405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b0316638291286c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611154573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117891906128e4565b846001600160a01b0316638291286c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111da91906128e4565b14611211576040517f68155f9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b03163f8314611254576040517f8f84fb2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8490556040516001600160a01b038516907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280156113c1576000846001600160a01b0316639ded06df60e01b84846040516024016112d992919061291a565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611344919061292e565b600060405180830381855af49150503d806000811461137f576040519150601f19603f3d011682016040523d82523d6000602084013e611384565b606091505b50509050806113bf576040517f97905dfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50505050565b6040805160208101909152600080825290816113e287610b54565b90506113f1818787858861196e565b979650505050505050565b600080610eb68484610bd9565b60008061141583610b54565b60408051602081019091526000815290915061143084611fcb565b5050604051637a4e022560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063f49c044a906114869085908890600290879060040161294a565b6020604051808303816000875af11580156114a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec191906128e4565b60608167ffffffffffffffff8111156114e4576114e4612402565b60405190808252806020026020018201604052801561151757816020015b60608152602001906001900390816115025790505b5090506000606060005b84811015611610573086868381811061153c5761153c61297f565b905060200281019061154e9190612995565b60405161155c9291906129dc565b600060405180830381855af49150503d8060008114611597576040519150601f19603f3d011682016040523d82523d6000602084013e61159c565b606091505b509093509150826115ea5781516000036115e2576040517f4d6a232800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815182602001fd5b818482815181106115fd576115fd61297f565b6020908102919091010152600101611521565b50505092915050565b60008061162583610b54565b905061163081611b91565b9392505050565b6000806116443387610fcc565b6040805160208101909152600081529091506001600160a01b0384161561167a57611677846001600160a01b0316611ab9565b90505b604051637a4e022560e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f49c044a906116cc9085908a908a90879060040161294a565b6020604051808303816000875af11580156116eb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f191906128e4565b33600061171c88886113fc565b90506117288183611c43565b6040517fcaca8dbe0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063caca8dbe9061178f908990899060040161291a565b602060405180830381865afa1580156117ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d091906129ec565b611806576040517f08e1064e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118686040518060600160405280856001600160a01b0316815260200184815260200189898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050915250611f96565b9050848460405161187a9291906129dc565b60405180910390206118a97fd4f5c43117c663161acfe6af3208a49856d85e586baf0f60749de2055e00146590565b60000160008381526020019081526020016000208190555081896001600160a01b0316846001600160a01b03167fa8c6a99761ac63f2758a4683a64d2be54964d5d74b9d296b6563a5b4c0d23fce8a8a8a8a60405161190b9493929190612a0e565b60405180910390a4505050505050505050565b336119477f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b031614610e9d576040516330cd747160e01b815260040160405180910390fd5b60008061197a87611b91565b60405163b90d6afd60e01b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b90d6afd90602401602060405180830381865afa1580156119e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0991906128fd565b90506000806000611a1984611fcb565b925092509250611a668b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791508690508d8d611ae7565b9550848614611aab576040517f7502854200000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016106ec565b505050505095945050505050565b6040805160148082528183019092526060916020820181803683375050506014808201939093529182525090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e1d40c77838a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401611b429796959493929190612a35565b60206040518083038185885af1158015611b60573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b8591906128e4565b98975050505050505050565b6040517fa5269ef100000000000000000000000000000000000000000000000000000000815260006004820181905260248201839052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a5269ef190604401602060405180830381865afa158015611c19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3d91906128e4565b92915050565b60405163b90d6afd60e01b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b90d6afd90602401602060405180830381865afa158015611cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccf91906128fd565b6040517faa271e1a0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529192509082169063aa271e1a90602401602060405180830381865afa158015611d32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5691906129ec565b611d97576040517f361c31f20000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016106ec565b604051637e10eb1560e01b8152600481018490526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637e10eb1590602401602060405180830381865afa158015611dff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2391906128fd565b9050806001600160a01b0316836001600160a01b0316036113c15760405162f78d2360e81b81526001600160a01b03841660048201526024016106ec565b6000611e6c83611f96565b825160208085019190912060008381527fd4f5c43117c663161acfe6af3208a49856d85e586baf0f60749de2055e001465928390526040902054929350909114611ee2576040517f4e9f6b5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600091825260205260408120555050565b6001600160a01b038116611f1a57604051633649397d60e21b815260040160405180910390fd5b6040516001600160a01b038216907f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616390600090a27f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05560007f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d155565b60007ff1302cc23b373b441b50010257156be4e920e78f3dc60bf8cd05c64367827f6082604051602001610bbc929190612aa6565b606080600080849050806001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa92505050801561203357506040513d6000823e601f3d908101601f191682016040526120309190810190612aee565b60015b61205a57604051629fd8a560e11b81526001600160a01b03861660048201526024016106ec565b9350806001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa9250505080156120bb57506040513d6000823e601f3d908101601f191682016040526120b89190810190612aee565b60015b6120e257604051629fd8a560e11b81526001600160a01b03861660048201526024016106ec565b9250806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561213e575060408051601f3d908101601f1916820190925261213b91810190612b5c565b60015b61216557604051629fd8a560e11b81526001600160a01b03861660048201526024016106ec565b93959294505050565b60008083601f84011261218057600080fd5b50813567ffffffffffffffff81111561219857600080fd5b6020830191508360208285010111156121b057600080fd5b9250929050565b600080600080606085870312156121cd57600080fd5b84359350602085013567ffffffffffffffff8111156121eb57600080fd5b6121f78782880161216e565b9598909750949560400135949350505050565b80356005811061221957600080fd5b919050565b600080600080600080600080600060c08a8c03121561223c57600080fd5b8935985060208a013567ffffffffffffffff81111561225a57600080fd5b6122668c828d0161216e565b90995097505060408a013567ffffffffffffffff81111561228657600080fd5b6122928c828d0161216e565b90975095506122a5905060608b0161220a565b935060808a013567ffffffffffffffff8111156122c157600080fd5b6122cd8c828d0161216e565b9a9d999c50979a9699959894979660a00135949350505050565b60ff81168114610ea657600080fd5b6001600160a01b0381168114610ea657600080fd5b60008060008060008060008060c0898b03121561232757600080fd5b88359750602089013567ffffffffffffffff81111561234557600080fd5b6123518b828c0161216e565b909850965050604089013567ffffffffffffffff81111561237157600080fd5b61237d8b828c0161216e565b9096509450506060890135612391816122e7565b92506080890135915060a08901356123a8816122f6565b809150509295985092959890939650565b6000602082840312156123cb57600080fd5b8135611630816122f6565b600080604083850312156123e957600080fd5b82356123f4816122f6565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561244157612441612402565b604052919050565b600067ffffffffffffffff82111561246357612463612402565b50601f01601f191660200190565b60008060008060008060a0878903121561248a57600080fd5b86359550602087013561249c816122f6565b9450604087013567ffffffffffffffff8111156124b857600080fd5b6124c489828a0161216e565b909550935050606087013567ffffffffffffffff8111156124e457600080fd5b8701601f810189136124f557600080fd5b803561250861250382612449565b612418565b8181528a602083850101111561251d57600080fd5b81602084016020830137600091810160200191909152969995985093969295946080939093013593505050565b6000806000806060858703121561256057600080fd5b843561256b816122f6565b935060208501359250604085013567ffffffffffffffff81111561258e57600080fd5b61259a8782880161216e565b95989497509550505050565b600080602083850312156125b957600080fd5b823567ffffffffffffffff8111156125d057600080fd5b6125dc8582860161216e565b90969095509350505050565b600080600080606085870312156125fe57600080fd5b8435612609816122f6565b9350602085013567ffffffffffffffff8111156121eb57600080fd5b6000806020838503121561263857600080fd5b823567ffffffffffffffff81111561264f57600080fd5b8301601f8101851361266057600080fd5b803567ffffffffffffffff81111561267757600080fd5b8560208260051b840101111561268c57600080fd5b6020919091019590945092505050565b60005b838110156126b757818101518382015260200161269f565b50506000910152565b600081518084526126d881602086016020860161269c565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561274557603f198786030184526127308583516126c0565b94506020938401939190910190600101612714565b50929695505050505050565b6000806000806080858703121561276757600080fd5b843593506020850135612779816122f6565b92506127876040860161220a565b91506060850135612797816122f6565b939692955090935050565b600080600080600080608087890312156127bb57600080fd5b86356127c6816122f6565b955060208701359450604087013567ffffffffffffffff8111156127e957600080fd5b6127f589828a0161216e565b909550935050606087013567ffffffffffffffff81111561281557600080fd5b61282189828a0161216e565b979a9699509497509295939492505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6005811061287a57634e487b7160e01b600052602160045260246000fd5b9052565b89815260c06020820152600061289860c083018a8c612833565b82810360408401526128ab81898b612833565b90506128ba606084018861285c565b82810360808401526128cd818688612833565b9150508260a08301529a9950505050505050505050565b6000602082840312156128f657600080fd5b5051919050565b60006020828403121561290f57600080fd5b8151611630816122f6565b602081526000610ec1602083018486612833565b6000825161294081846020870161269c565b9190910192915050565b8481526001600160a01b0384166020820152612969604082018461285c565b60806060820152600061057e60808301846126c0565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126129ac57600080fd5b83018035915067ffffffffffffffff8211156129c757600080fd5b6020019150368190038213156121b057600080fd5b8183823760009101908152919050565b6000602082840312156129fe57600080fd5b8151801515811461163057600080fd5b604081526000612a22604083018688612833565b82810360208401526113f1818587612833565b87815260e060208201526000612a4e60e08301896126c0565b8281036040840152612a6081896126c0565b90508281036060840152612a7481886126c0565b905060ff8616608084015282810360a0840152612a9181866126c0565b9150508260c083015298975050505050505050565b828152604060208201526001600160a01b038251166040820152602082015160608201526000604083015160606080840152612ae560a08401826126c0565b95945050505050565b600060208284031215612b0057600080fd5b815167ffffffffffffffff811115612b1757600080fd5b8201601f81018413612b2857600080fd5b8051612b3661250382612449565b818152856020838501011115612b4b57600080fd5b612ae582602083016020860161269c565b600060208284031215612b6e57600080fd5b8151611630816122e756fea26469706673582212200e82a8f555844c713006278cabaa550f872c1a2f3cf0f2f56c8c126b99e77f2e64736f6c634300081b0033",
"deployedBytecode": "0x6080604052600436106101ac5760003560e01c8063864a0dcf116100ec578063a75483d11161008a578063d8c0326811610064578063d8c03268146104c8578063e30c3978146104db578063e8a1d6f61461050f578063f2fde38b1461052f57600080fd5b8063a75483d114610475578063ac9650d814610488578063b2292888146104a857600080fd5b80639ded06df116100c65780639ded06df14610402578063a3499c7314610422578063a37fcf4e14610442578063a5269ef11461045557600080fd5b8063864a0dcf1461037a5780638da5cb5b146103ae5780639d6d57b3146103e257600080fd5b80634987e2c21161015957806379ba50971161013357806379ba5097146102f25780637c2def17146103075780638291286c14610327578063848f7b631461035a57600080fd5b80634987e2c2146102895780635c60da1b1461029c578063710bf322146102d057600080fd5b80633e12f8c51161018a5780633e12f8c514610236578063415621061461024957806343b0f3d31461026957600080fd5b8063010987dc146101b157806309c6bed9146101d75780630f4433d314610223575b600080fd5b6101c46101bf3660046121b7565b61054f565b6040519081526020015b60405180910390f35b3480156101e357600080fd5b5061020b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101ce565b6101c461023136600461221e565b610588565b6101c461024436600461230b565b610646565b34801561025557600080fd5b506101c46102643660046123b9565b610b54565b34801561027557600080fd5b506101c46102843660046123d6565b610bd9565b6101c4610297366004612471565b610c66565b3480156102a857600080fd5b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5461020b565b3480156102dc57600080fd5b506102f06102eb3660046123b9565b610d60565b005b3480156102fe57600080fd5b506102f0610e2f565b34801561031357600080fd5b506101c46103223660046123d6565b610ea9565b34801561033357600080fd5b507f80547d63ed663962b99f8ed432bff3879a35b5418af92258aa171feef14cc3cc6101c4565b34801561036657600080fd5b506102f061037536600461254a565b610ec9565b34801561038657600080fd5b506101c47f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ba57600080fd5b507f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05461020b565b3480156103ee57600080fd5b506101c46103fd3660046123d6565b610fcc565b34801561040e57600080fd5b506102f061041d3660046125a6565b61103f565b34801561042e57600080fd5b506102f061043d36600461254a565b6110a5565b6101c46104503660046125e8565b6113c7565b34801561046157600080fd5b506101c46104703660046123d6565b6113fc565b6101c46104833660046123b9565b611409565b61049b610496366004612625565b6114c9565b6040516101ce91906126ec565b3480156104b457600080fd5b506101c46104c33660046123b9565b611619565b6101c46104d6366004612751565b611637565b3480156104e757600080fd5b507f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d15461020b565b34801561051b57600080fd5b506102f061052a3660046127a2565b61170f565b34801561053b57600080fd5b506102f061054a3660046123b9565b61191e565b60008061055c3387610bd9565b60408051600081526020810190915290915061057e908290879087908761196e565b9695505050505050565b600080610595338c610fcc565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630f4433d384838d8d8d8d8d8d8d8d6040518b63ffffffff1660e01b81526004016105f49998979695949392919061287e565b60206040518083038185885af1158015610612573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061063791906128e4565b9b9a5050505050505050505050565b60003381610654828c610bd9565b60408051600080825281830190925260208101828152929350919087156106855761067e30611ab9565b9250610739565b6001600160a01b03871615610707577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316036106f55760405162f78d2360e81b81526001600160a01b03881660048201526024015b60405180910390fd5b61067e876001600160a01b0316611ab9565b6040517fdb80c5f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107d084838f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508d8887611ae7565b95508715610b435760405163b90d6afd60e01b8152600481018790526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b90d6afd90602401602060405180830381865afa158015610840573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086491906128fd565b604051637e10eb1560e01b8152600481018990529091506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637e10eb1590602401602060405180830381865afa1580156108cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f391906128fd565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152602482018d9052919250908316906340c10f1990604401600060405180830381600087803b15801561095a57600080fd5b505af115801561096e573d6000803e3d6000fd5b50506040517fcf86a95a0000000000000000000000000000000000000000000000000000000081526001600160a01b038c811660048301528516925063cf86a95a9150602401600060405180830381600087803b1580156109ce57600080fd5b505af11580156109e2573d6000803e3d6000fd5b50506040517fe915cfd10000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038416925063e915cfd19150602401600060405180830381600087803b158015610a4057600080fd5b505af1158015610a54573d6000803e3d6000fd5b50506040517f120a63b50000000000000000000000000000000000000000000000000000000081526001600160a01b038c811660048301528416925063120a63b59150602401600060405180830381600087803b158015610ab457600080fd5b505af1158015610ac8573d6000803e3d6000fd5b50506040517f4a6a42d80000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015284169250634a6a42d89150602401600060405180830381600087803b158015610b2857600080fd5b505af1158015610b3c573d6000803e3d6000fd5b5050505050505b505050505098975050505050505050565b604080517f9ca52083bb00ac0f5bed7edcaabb0534d03efb0719807b54a8029c4d1313630960208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091526001600160a01b03821660608201526000906080015b604051602081830303815290604052805190602001209050919050565b604080517ff84d43c32bc607f1bdb175c63a0cf1939bf0cc8cc3565450be225afbb5a1098560208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091526001600160a01b03831660608201526080810182905260009060a0015b60405160208183030381529060405280519060200120905092915050565b60006001600160a01b038616610c995760405162f78d2360e81b81526001600160a01b03871660048201526024016106ec565b6000610ca53389610bd9565b90506000610cb282611b91565b9050610cbe8189611c43565b845115610d3157600060405180606001604052808a6001600160a01b0316815260200183815260200189898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152509050610d2b8187611e61565b50610d46565b610d43886001600160a01b0316611ab9565b94505b610d53828888888861196e565b9998505050505050505050565b33610d897f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b031614610db0576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b038116610dd757604051633649397d60e21b815260040160405180910390fd5b6040516001600160a01b038216907fd9be0e8e07417e00f2521db636cb53e316fd288f5051f16d2aa2bf0c3938a87690600090a27f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d155565b6000610e597f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d15490565b90506001600160a01b0381163314610e9d576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ea681611ef3565b50565b600080610eb68484610fcc565b9050610ec181611b91565b949350505050565b336000610ed686866113fc565b90506000610f3a6040518060600160405280856001600160a01b0316815260200184815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050915250611f96565b90507fd4f5c43117c663161acfe6af3208a49856d85e586baf0f60749de2055e00146560000160008281526020019081526020016000206000905581876001600160a01b0316846001600160a01b03167f45aa4b37a2bdfa1ab8962f148a8e9cdf22eda891c46dbdea19295cd85c10b1128888604051610fbb92919061291a565b60405180910390a450505050505050565b604080517f5498bf1696259c19f826e687122ca9404f85fe476a9e186af31eb6a53bf123dc60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091526001600160a01b03831660608201526080810182905260009060a001610c48565b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316036110a1576040517fbf10dd3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b336110ce7f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b0316146110f5576040516330cd747160e01b815260040160405180910390fd5b7f360894a13ba1a