@axelar-network/interchain-token-service
Version:
Interchain token service for EVM chains to faciliate interchain token transfers and contract calls
902 lines • 66.9 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": "string",
"name": "originalChain",
"type": "string"
},
{
"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": "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": "string",
"name": "originalChainName",
"type": "string"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "address",
"name": "minter",
"type": "address"
},
{
"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": "0x60e060405234801561001057600080fd5b50604051612f97380380612f9783398101604081905261002f91610180565b600161003a816100dd565b50306080526001600160a01b0381166100665760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03811660a08190526040805163864a0dcf60e01b8152905163864a0dcf916004808201926020929091908290030181865afa1580156100b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100d491906101b0565b60c052506101c9565b6001600160a01b03811661010457604051633649397d60e21b815260040160405180910390fd5b6040516001600160a01b038216907f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616390600090a27f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05560007f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d155565b60006020828403121561019257600080fd5b81516001600160a01b03811681146101a957600080fd5b9392505050565b6000602082840312156101c257600080fd5b5051919050565b60805160a05160c051612d36610261600039600081816103b501528181610be101528181610c6601526110cc0152600081816101ff015281816105e1015281816106de01528181610839015281816108e9015281816115120152818161175a0152818161182101528181611a7101528181611b4401528181611bd601528181611d130152611e34015260006111160152612d366000f3fe6080604052600436106101c25760003560e01c8063864a0dcf116100f7578063a5269ef111610095578063d8c0326811610064578063d8c0326814610504578063e30c397814610517578063e8a1d6f61461054b578063f2fde38b1461056b57600080fd5b8063a5269ef114610491578063a75483d1146104b1578063ac9650d8146104c4578063b2292888146104e457600080fd5b80639d6d57b3116100d15780639d6d57b31461041e5780639ded06df1461043e578063a3499c731461045e578063a37fcf4e1461047e57600080fd5b8063864a0dcf146103a35780638da5cb5b146103d7578063993a5b9e1461040b57600080fd5b80635c60da1b1161016457806379ba50971161013e57806379ba50971461031b5780637c2def17146103305780638291286c14610350578063848f7b631461038357600080fd5b80635c60da1b146102b25780635d79c00e146102e6578063710bf322146102f957600080fd5b80633e12f8c5116101a05780633e12f8c51461024c578063415621061461025f57806343b0f3d31461027f5780634987e2c21461029f57600080fd5b8063010987dc146101c757806309c6bed9146101ed5780630f4433d314610239575b600080fd5b6101da6101d5366004612213565b61058b565b6040519081526020015b60405180910390f35b3480156101f957600080fd5b506102217f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e4565b6101da61024736600461227a565b6105d0565b6101da61025a366004612367565b61068e565b34801561026b57600080fd5b506101da61027a366004612415565b610bb5565b34801561028b57600080fd5b506101da61029a366004612432565b610c3a565b6101da6102ad3660046124cd565b610cc7565b3480156102be57600080fd5b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54610221565b6101da6102f43660046125a6565b610dcd565b34801561030557600080fd5b50610319610314366004612415565b610dfc565b005b34801561032757600080fd5b50610319610ecb565b34801561033c57600080fd5b506101da61034b366004612432565b610f45565b34801561035c57600080fd5b507f80547d63ed663962b99f8ed432bff3879a35b5418af92258aa171feef14cc3cc6101da565b34801561038f57600080fd5b5061031961039e366004612640565b610f65565b3480156103af57600080fd5b506101da7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103e357600080fd5b507f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c054610221565b6101da61041936600461269c565b611068565b34801561042a57600080fd5b506101da610439366004612432565b6110a0565b34801561044a57600080fd5b5061031961045936600461272c565b611113565b34801561046a57600080fd5b50610319610479366004612640565b611179565b6101da61048c36600461276e565b61149b565b34801561049d57600080fd5b506101da6104ac366004612432565b6114c5565b6101da6104bf366004612415565b6114d2565b6104d76104d23660046127ab565b611592565b6040516101e49190612872565b3480156104f057600080fd5b506101da6104ff366004612415565b6116e2565b6101da6105123660046128d7565b611700565b34801561052357600080fd5b507f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d154610221565b34801561055757600080fd5b50610319610566366004612928565b6117d8565b34801561057757600080fd5b50610319610586366004612415565b6119ef565b60006105c785828686825b6040519080825280601f01601f1916602001820160405280156105c0576020820181803683370190505b5087610cc7565b95945050505050565b6000806105dd338c6110a0565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630f4433d384838d8d8d8d8d8d8d8d6040518b63ffffffff1660e01b815260040161063c99989796959493929190612a04565b60206040518083038185885af115801561065a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061067f9190612a6a565b9b9a5050505050505050505050565b6000338161069c828c610c3a565b60408051600080825281830190925260208101828152929350919087156106cd576106c630611a3f565b9250610781565b6001600160a01b0387161561074f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b03160361073d5760405162f78d2360e81b81526001600160a01b03881660048201526024015b60405180910390fd5b6106c6876001600160a01b0316611a3f565b6040517fdb80c5f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61081884838f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508d8887611a6d565b95508715610ba45760405163b90d6afd60e01b8152600481018790526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b90d6afd90602401602060405180830381865afa158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190612a83565b6040517f7e10eb15000000000000000000000000000000000000000000000000000000008152600481018990529091506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637e10eb1590602401602060405180830381865afa158015610930573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109549190612a83565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152602482018d9052919250908316906340c10f1990604401600060405180830381600087803b1580156109bb57600080fd5b505af11580156109cf573d6000803e3d6000fd5b50506040517fcf86a95a0000000000000000000000000000000000000000000000000000000081526001600160a01b038c811660048301528516925063cf86a95a9150602401600060405180830381600087803b158015610a2f57600080fd5b505af1158015610a43573d6000803e3d6000fd5b50506040517fe915cfd10000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038416925063e915cfd19150602401600060405180830381600087803b158015610aa157600080fd5b505af1158015610ab5573d6000803e3d6000fd5b50506040517f120a63b50000000000000000000000000000000000000000000000000000000081526001600160a01b038c811660048301528416925063120a63b59150602401600060405180830381600087803b158015610b1557600080fd5b505af1158015610b29573d6000803e3d6000fd5b50506040517f4a6a42d80000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015284169250634a6a42d89150602401600060405180830381600087803b158015610b8957600080fd5b505af1158015610b9d573d6000803e3d6000fd5b5050505050505b505050505098975050505050505050565b604080517f9ca52083bb00ac0f5bed7edcaabb0534d03efb0719807b54a8029c4d1313630960208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091526001600160a01b03821660608201526000906080015b604051602081830303815290604052805190602001209050919050565b604080517ff84d43c32bc607f1bdb175c63a0cf1939bf0cc8cc3565450be225afbb5a1098560208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091526001600160a01b03831660608201526080810182905260009060a0015b60405160208183030381529060405280519060200120905092915050565b600080610cd43389610c3a565b90506001600160a01b03871615610d8a576000610cf082611b0b565b9050610cfc8189611bbd565b845115610d6f57600060405180606001604052808a6001600160a01b0316815260200183815260200189898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152509050610d698187611d72565b50610d84565b610d81886001600160a01b0316611a3f565b94505b50610db4565b835115610db45760405162f78d2360e81b81526001600160a01b0388166004820152602401610734565b610dc18187878787611e04565b98975050505050505050565b60008615610dee57604051630280e1e560e61b815260040160405180910390fd5b610dc1868686866000610596565b33610e257f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b031614610e4c576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b038116610e7357604051633649397d60e21b815260040160405180910390fd5b6040516001600160a01b038216907fd9be0e8e07417e00f2521db636cb53e316fd288f5051f16d2aa2bf0c3938a87690600090a27f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d155565b6000610ef57f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d15490565b90506001600160a01b0381163314610f39576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f4281611f4f565b50565b600080610f5284846110a0565b9050610f5d81611b0b565b949350505050565b336000610f7286866114c5565b90506000610fd66040518060600160405280856001600160a01b0316815260200184815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050915250611ff2565b90507fd4f5c43117c663161acfe6af3208a49856d85e586baf0f60749de2055e00146560000160008281526020019081526020016000206000905581876001600160a01b0316846001600160a01b03167f45aa4b37a2bdfa1ab8962f148a8e9cdf22eda891c46dbdea19295cd85c10b1128888604051611057929190612aa0565b60405180910390a450505050505050565b6000851561108957604051630280e1e560e61b815260040160405180910390fd5b6110958585858561149b565b979650505050505050565b604080517f5498bf1696259c19f826e687122ca9404f85fe476a9e186af31eb6a53bf123dc60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091526001600160a01b03831660608201526080810182905260009060a001610ca9565b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031603611175576040517fbf10dd3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b336111a27f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b0316146111c9576040516330cd747160e01b815260040160405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b0316638291286c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190612a6a565b846001600160a01b0316638291286c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561128a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ae9190612a6a565b146112e5576040517f68155f9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b03163f8314611328576040517f8f84fb2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8490556040516001600160a01b038516907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28015611495576000846001600160a01b0316639ded06df60e01b84846040516024016113ad929190612aa0565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516114189190612ab4565b600060405180830381855af49150503d8060008114611453576040519150601f19603f3d011682016040523d82523d6000602084013e611458565b606091505b5050905080611493576040517f97905dfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50505050565b6040805160208101909152600080825290816114b687610bb5565b90506110958187878588611e04565b600080610f528484610c3a565b6000806114de83610bb5565b6040805160208101909152600081529091506114f984612027565b5050604051637a4e022560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063f49c044a9061154f90859088906002908790600401612ad0565b6020604051808303816000875af115801561156e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5d9190612a6a565b60608167ffffffffffffffff8111156115ad576115ad61245e565b6040519080825280602002602001820160405280156115e057816020015b60608152602001906001900390816115cb5790505b5090506000606060005b848110156116d9573086868381811061160557611605612b0f565b90506020028101906116179190612b25565b604051611625929190612b6c565b600060405180830381855af49150503d8060008114611660576040519150601f19603f3d011682016040523d82523d6000602084013e611665565b606091505b509093509150826116b35781516000036116ab576040517f4d6a232800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815182602001fd5b818482815181106116c6576116c6612b0f565b60209081029190910101526001016115ea565b50505092915050565b6000806116ee83610bb5565b90506116f981611b0b565b9392505050565b60008061170d33876110a0565b6040805160208101909152600081529091506001600160a01b0384161561174357611740846001600160a01b0316611a3f565b90505b604051637a4e022560e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f49c044a906117959085908a908a908790600401612ad0565b6020604051808303816000875af11580156117b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110959190612a6a565b3360006117e588886114c5565b90506117f18183611bbd565b6040517f477aedc70000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063477aedc7906118589089908990600401612aa0565b600060405180830381865afa158015611875573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261189d9190810190612b7c565b516000036118d7576040517f08e1064e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119396040518060600160405280856001600160a01b0316815260200184815260200189898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050915250611ff2565b9050848460405161194b929190612b6c565b604051809103902061197a7fd4f5c43117c663161acfe6af3208a49856d85e586baf0f60749de2055e00146590565b60000160008381526020019081526020016000208190555081896001600160a01b0316846001600160a01b03167fa8c6a99761ac63f2758a4683a64d2be54964d5d74b9d296b6563a5b4c0d23fce8a8a8a8a6040516119dc9493929190612bea565b60405180910390a4505050505050505050565b33611a187f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b031614610f39576040516330cd747160e01b815260040160405180910390fd5b6040805160148082528183019092526060916020820181803683375050506014808201939093529182525090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e1d40c77838a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401611ac89796959493929190612c11565b60206040518083038185885af1158015611ae6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610dc19190612a6a565b6040517fa5269ef100000000000000000000000000000000000000000000000000000000815260006004820181905260248201839052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a5269ef190604401602060405180830381865afa158015611b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb79190612a6a565b92915050565b60405163b90d6afd60e01b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b90d6afd90602401602060405180830381865afa158015611c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c499190612a83565b6040517faa271e1a0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529192509082169063aa271e1a90602401602060405180830381865afa158015611cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd09190612c82565b611d11576040517f361c31f20000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610734565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611d6d5760405162f78d2360e81b81526001600160a01b0383166004820152602401610734565b505050565b6000611d7d83611ff2565b825160208085019190912060008381527fd4f5c43117c663161acfe6af3208a49856d85e586baf0f60749de2055e001465928390526040902054929350909114611df3576040517f4e9f6b5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600091825260205260408120555050565b600080611e1087611b0b565b60405163b90d6afd60e01b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b90d6afd90602401602060405180830381865afa158015611e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9f9190612a83565b90506000806000611eaf84612027565b925092509250611efc8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791508690508d8d611a6d565b9550848614611f41576040517f750285420000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610734565b505050505095945050505050565b6001600160a01b038116611f7657604051633649397d60e21b815260040160405180910390fd5b6040516001600160a01b038216907f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616390600090a27f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05560007f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d155565b60007ff1302cc23b373b441b50010257156be4e920e78f3dc60bf8cd05c64367827f6082604051602001610c1d929190612ca4565b606080600080849050806001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa92505050801561208f57506040513d6000823e601f3d908101601f1916820160405261208c9190810190612b7c565b60015b6120b657604051629fd8a560e11b81526001600160a01b0386166004820152602401610734565b9350806001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa92505050801561211757506040513d6000823e601f3d908101601f191682016040526121149190810190612b7c565b60015b61213e57604051629fd8a560e11b81526001600160a01b0386166004820152602401610734565b9250806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561219a575060408051601f3d908101601f1916820190925261219791810190612ce3565b60015b6121c157604051629fd8a560e11b81526001600160a01b0386166004820152602401610734565b93959294505050565b60008083601f8401126121dc57600080fd5b50813567ffffffffffffffff8111156121f457600080fd5b60208301915083602082850101111561220c57600080fd5b9250929050565b6000806000806060858703121561222957600080fd5b84359350602085013567ffffffffffffffff81111561224757600080fd5b612253878288016121ca565b9598909750949560400135949350505050565b80356005811061227557600080fd5b919050565b600080600080600080600080600060c08a8c03121561229857600080fd5b8935985060208a013567ffffffffffffffff8111156122b657600080fd5b6122c28c828d016121ca565b90995097505060408a013567ffffffffffffffff8111156122e257600080fd5b6122ee8c828d016121ca565b9097509550612301905060608b01612266565b935060808a013567ffffffffffffffff81111561231d57600080fd5b6123298c828d016121ca565b9a9d999c50979a9699959894979660a00135949350505050565b60ff81168114610f4257600080fd5b6001600160a01b0381168114610f4257600080fd5b60008060008060008060008060c0898b03121561238357600080fd5b88359750602089013567ffffffffffffffff8111156123a157600080fd5b6123ad8b828c016121ca565b909850965050604089013567ffffffffffffffff8111156123cd57600080fd5b6123d98b828c016121ca565b90965094505060608901356123ed81612343565b92506080890135915060a089013561240481612352565b809150509295985092959890939650565b60006020828403121561242757600080fd5b81356116f981612352565b6000806040838503121561244557600080fd5b823561245081612352565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561249d5761249d61245e565b604052919050565b600067ffffffffffffffff8211156124bf576124bf61245e565b50601f01601f191660200190565b60008060008060008060a087890312156124e657600080fd5b8635955060208701356124f881612352565b9450604087013567ffffffffffffffff81111561251457600080fd5b61252089828a016121ca565b909550935050606087013567ffffffffffffffff81111561254057600080fd5b8701601f8101891361255157600080fd5b803561256461255f826124a5565b612474565b8181528a602083850101111561257957600080fd5b81602084016020830137600091810160200191909152969995985093969295946080939093013593505050565b600080600080600080600060a0888a0312156125c157600080fd5b873567ffffffffffffffff8111156125d857600080fd5b6125e48a828b016121ca565b9098509650506020880135945060408801356125ff81612352565b9350606088013567ffffffffffffffff81111561261b57600080fd5b6126278a828b016121ca565b989b979a50959894979596608090950135949350505050565b6000806000806060858703121561265657600080fd5b843561266181612352565b935060208501359250604085013567ffffffffffffffff81111561268457600080fd5b612690878288016121ca565b95989497509550505050565b600080600080600080608087890312156126b557600080fd5b863567ffffffffffffffff8111156126cc57600080fd5b6126d889828a016121ca565b90975095505060208701356126ec81612352565b9350604087013567ffffffffffffffff81111561270857600080fd5b61271489828a016121ca565b979a9699509497949695606090950135949350505050565b6000806020838503121561273f57600080fd5b823567ffffffffffffffff81111561275657600080fd5b612762858286016121ca565b90969095509350505050565b6000806000806060858703121561278457600080fd5b843561278f81612352565b9350602085013567ffffffffffffffff81111561224757600080fd5b600080602083850312156127be57600080fd5b823567ffffffffffffffff8111156127d557600080fd5b8301601f810185136127e657600080fd5b803567ffffffffffffffff8111156127fd57600080fd5b8560208260051b840101111561281257600080fd5b6020919091019590945092505050565b60005b8381101561283d578181015183820152602001612825565b50506000910152565b6000815180845261285e816020860160208601612822565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156128cb57603f198786030184526128b6858351612846565b9450602093840193919091019060010161289a565b50929695505050505050565b600080600080608085870312156128ed57600080fd5b8435935060208501356128ff81612352565b925061290d60408601612266565b9150606085013561291d81612352565b939692955090935050565b6000806000806000806080878903121561294157600080fd5b863561294c81612352565b955060208701359450604087013567ffffffffffffffff81111561296f57600080fd5b61297b89828a016121ca565b909550935050606087013567ffffffffffffffff81111561299b57600080fd5b6129a789828a016121ca565b979a9699509497509295939492505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60058110612a0057634e487b7160e01b600052602160045260246000fd5b9052565b89815260c060208201526000612a1e60c083018a8c6129b9565b8281036040840152612a3181898b6129b9565b9050612a4060608401886129e2565b8281036080840152612a538186886129b9565b9150508260a08301529a9950505050505050505050565b600060208284031215612a7c57600080fd5b5051919050565b600060208284031215612a9557600080fd5b81516116f981612352565b602081526000610f5d6020830184866129b9565b60008251612ac6818460208701612822565b9190910192915050565b8481526001600160a01b0384166020820152612aef60408201846129e2565b608060608201526000612b056080830184612846565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612b3c57600080fd5b83018035915067ffffffffffffffff821115612b5757600080fd5b60200191503681900382131561220c57600080fd5b8183823760009101908152919050565b600060208284031215612b8e57600080fd5b815167ffffffffffffffff811115612ba557600080fd5b8201601f81018413612bb657600080fd5b8051612bc461255f826124a5565b818152856020838501011115612bd957600080fd5b6105c7826020830160208601612822565b604081526000612bfe6040830186886129b9565b82810360208401526110958185876129b9565b87815260e060208201526000612c2a60e0830189612846565b8281036040840152612c3c8189612846565b90508281036060840152612c508188612846565b905060ff8616608084015282810360a0840152612c6d8186612846565b9150508260c083015298975050505050505050565b600060208284031215612c9457600080fd5b815180151581146116f957600080fd5b828152604060208201526001600160a01b0382511660408201526020820151606082015260006040830151606060808401526105c760a0840182612846565b600060208284031215612cf557600080fd5b81516116f98161234356fea2646970667358221220cacd0b832a9965a402d4ae25f46cea9101570fa545d1329e9171ce8a8171860364736f6c634300081b0033",
"deployedBytecode": "0x6080604052600436106101c25760003560e01c8063864a0dcf116100f7578063a5269ef111610095578063d8c0326811610064578063d8c0326814610504578063e30c397814610517578063e8a1d6f61461054b578063f2fde38b1461056b57600080fd5b8063a5269ef114610491578063a75483d1146104b1578063ac9650d8146104c4578063b2292888146104e457600080fd5b80639d6d57b3116100d15780639d6d57b31461041e5780639ded06df1461043e578063a3499c731461045e578063a37fcf4e1461047e57600080fd5b8063864a0dcf146103a35780638da5cb5b146103d7578063993a5b9e1461040b57600080fd5b80635c60da1b1161016457806379ba50971161013e57806379ba50971461031b5780637c2def17146103305780638291286c14610350578063848f7b631461038357600080fd5b80635c60da1b146102b25780635d79c00e146102e6578063710bf322146102f957600080fd5b80633e12f8c5116101a05780633e12f8c51461024c578063415621061461025f57806343b0f3d31461027f5780634987e2c21461029f57600080fd5b8063010987dc146101c757806309c6bed9146101ed5780630f4433d314610239575b600080fd5b6101da6101d5366004612213565b61058b565b6040519081526020015b60405180910390f35b3480156101f957600080fd5b506102217f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e4565b6101da61024736600461227a565b6105d0565b6101da61025a366004612367565b61068e565b34801561026b57600080fd5b506101da61027a366004612415565b610bb5565b34801561028b57600080fd5b506101da61029a366004612432565b610c3a565b6101da6102ad3660046124cd565b610cc7565b3480156102be57600080fd5b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54610221565b6101da6102f43660046125a6565b610dcd565b34801561030557600080fd5b50610319610314366004612415565b610dfc565b005b34801561032757600080fd5b50610319610ecb565b34801561033c57600080fd5b506101da61034b366004612432565b610f45565b34801561035c57600080fd5b507f80547d63ed663962b99f8ed432bff3879a35b5418af92258aa171feef14cc3cc6101da565b34801561038f57600080fd5b5061031961039e366004612640565b610f65565b3480156103af57600080fd5b506101da7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103e357600080fd5b507f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c054610221565b6101da61041936600461269c565b611068565b34801561042a57600080fd5b506101da610439366004612432565b6110a0565b34801561044a57600080fd5b5061031961045936600461272c565b611113565b34801561046a57600080fd5b50610319610479366004612640565b611179565b6101da61048c36600461276e565b61149b565b34801561049d57600080fd5b506101da6104ac366004612432565b6114c5565b6101da6104bf366004612415565b6114d2565b6104d76104d23660046127ab565b611592565b6040516101e49190612872565b3480156104f057600080fd5b506101da6104ff366004612415565b6116e2565b6101da6105123660046128d7565b611700565b34801561052357600080fd5b507f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d154610221565b34801561055757600080fd5b50610319610566366004612928565b6117d8565b34801561057757600080fd5b50610319610586366004612415565b6119ef565b60006105c785828686825b6040519080825280601f01601f1916602001820160405280156105c0576020820181803683370190505b5087610cc7565b95945050505050565b6000806105dd338c6110a0565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630f4433d384838d8d8d8d8d8d8d8d6040518b63ffffffff1660e01b815260040161063c99989796959493929190612a04565b60206040518083038185885af115801561065a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061067f9190612a6a565b9b9a5050505050505050505050565b6000338161069c828c610c3a565b60408051600080825281830190925260208101828152929350919087156106cd576106c630611a3f565b9250610781565b6001600160a01b0387161561074f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b03160361073d5760405162f78d2360e81b81526001600160a01b03881660048201526024015b60405180910390fd5b6106c6876001600160a01b0316611a3f565b6040517fdb80c5f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61081884838f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508d8887611a6d565b95508715610ba45760405163b90d6afd60e01b8152600481018790526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b90d6afd90602401602060405180830381865afa158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190612a83565b6040517f7e10eb15000000000000000000000000000000000000000000000000000000008152600481018990529091506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637e10eb1590602401602060405180830381865afa158015610930573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109549190612a83565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152602482018d9052919250908316906340c10f1990604401600060405180830381600087803b1580156109bb57600080fd5b505af11580156109cf573d6000803e3d6000fd5b50506040517fcf86a95a0000000000000000000000000000000000000000000000000000000081526001600160a01b038c811660048301528516925063cf86a95a9150602401600060405180830381600087803b158015610a2f57600080fd5b505af1158015610a43573d6000803e3d6000fd5b50506040517fe915cfd10000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038416925063e915cfd19150602401600060405180830381600087803b158015610aa157600080fd5b505af1158015610ab5573d6000803e3d6000fd5b50506040517f120a63b50000000000000000000000000000000000000000000000000000000081526001600160a01b038c811660048301528416925063120a63b59150602401600060405180830381600087803b158015610b1557600080fd5b505af1158015610b29573d6000803e3d6000fd5b50506040517f4a6a42d80000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015284169250634a6a42d89150602401600060405180830381600087803b158015610b8957600080fd5b505af1158015610b9d573d6000803e3d6000fd5b5050505050505b505050505098975050505050505050565b604080517f9ca52083bb00ac0f5bed7edcaabb0534d03efb0719807b54a8029c4d1313630960208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091526001600160a01b03821660608201526000906080015b604051602081830303815290604052805190602001209050919050565b