@functionx_io/contracts
Version:
Smart Contract library for Solidity
895 lines • 65.1 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "BridgeFeeQuote",
"sourceName": "contracts/bridge/BridgeFeeQuote.sol",
"abi": [
{
"inputs": [],
"name": "ChainNameAlreadyExists",
"type": "error"
},
{
"inputs": [],
"name": "ChainNameInvalid",
"type": "error"
},
{
"inputs": [],
"name": "OracleInvalid",
"type": "error"
},
{
"inputs": [],
"name": "QuoteCapInvalid",
"type": "error"
},
{
"inputs": [],
"name": "QuoteIdInvalid",
"type": "error"
},
{
"inputs": [],
"name": "TokenNameAlreadyExists",
"type": "error"
},
{
"inputs": [],
"name": "TokenNameInvalid",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "previousAdmin",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "newAdmin",
"type": "address"
}
],
"name": "AdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "beacon",
"type": "address"
}
],
"name": "BeaconUpgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "chainName",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "tokenName",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "address",
"name": "oracle",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "gasLimit",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "expiry",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint8",
"name": "cap",
"type": "uint8"
}
],
"name": "NewQuote",
"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": "implementation",
"type": "address"
}
],
"name": "Upgraded",
"type": "event"
},
{
"inputs": [],
"name": "DEFAULT_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "OWNER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "UPGRADE_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "_chainName",
"type": "bytes32"
},
{
"internalType": "bytes32[]",
"name": "_tokens",
"type": "bytes32[]"
}
],
"name": "addToken",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "getChainNames",
"outputs": [
{
"internalType": "bytes32[]",
"name": "",
"type": "bytes32[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "_chainName",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "_token",
"type": "bytes32"
}
],
"name": "getDefaultOracleQuote",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "chainName",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "tokenName",
"type": "bytes32"
},
{
"internalType": "address",
"name": "oracle",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint64",
"name": "gasLimit",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "expiry",
"type": "uint64"
}
],
"internalType": "struct IBridgeFeeQuote.QuoteInfo[]",
"name": "",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_id",
"type": "uint256"
}
],
"name": "getQuoteById",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "chainName",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "tokenName",
"type": "bytes32"
},
{
"internalType": "address",
"name": "oracle",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint64",
"name": "gasLimit",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "expiry",
"type": "uint64"
}
],
"internalType": "struct IBridgeFeeQuote.QuoteInfo",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "_chainName",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "_token",
"type": "bytes32"
},
{
"internalType": "address",
"name": "_oracle",
"type": "address"
},
{
"internalType": "uint8",
"name": "_cap",
"type": "uint8"
}
],
"name": "getQuoteByIndex",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "chainName",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "tokenName",
"type": "bytes32"
},
{
"internalType": "address",
"name": "oracle",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint64",
"name": "gasLimit",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "expiry",
"type": "uint64"
}
],
"internalType": "struct IBridgeFeeQuote.QuoteInfo",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "_chainName",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "_token",
"type": "bytes32"
}
],
"name": "getQuotesByToken",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "chainName",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "tokenName",
"type": "bytes32"
},
{
"internalType": "address",
"name": "oracle",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint64",
"name": "gasLimit",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "expiry",
"type": "uint64"
}
],
"internalType": "struct IBridgeFeeQuote.QuoteInfo[]",
"name": "",
"type": "tuple[]"
}
],
"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": "bytes32",
"name": "_chainName",
"type": "bytes32"
}
],
"name": "getTokens",
"outputs": [
{
"internalType": "bytes32[]",
"name": "",
"type": "bytes32[]"
}
],
"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": "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": "_oracle",
"type": "address"
},
{
"internalType": "uint8",
"name": "_maxQuoteCap",
"type": "uint8"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "maxQuoteCap",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "oracleContract",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "proxiableUUID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "uint8",
"name": "cap",
"type": "uint8"
},
{
"internalType": "uint64",
"name": "gasLimit",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "expiry",
"type": "uint64"
},
{
"internalType": "bytes32",
"name": "chainName",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "tokenName",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"internalType": "struct IBridgeFeeQuote.QuoteInput[]",
"name": "_inputs",
"type": "tuple[]"
}
],
"name": "quote",
"outputs": [
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "quoteNonce",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "_chainName",
"type": "bytes32"
},
{
"internalType": "bytes32[]",
"name": "_tokens",
"type": "bytes32[]"
}
],
"name": "registerChain",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "_chainName",
"type": "bytes32"
},
{
"internalType": "bytes32[]",
"name": "_tokens",
"type": "bytes32[]"
}
],
"name": "removeToken",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"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": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newImplementation",
"type": "address"
}
],
"name": "upgradeTo",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newImplementation",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "upgradeToAndCall",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
}
],
"bytecode": "0x60a06040523060805234801561001457600080fd5b50608051612c3461004c60003960008181610ba801528181610be801528181610ddc01528181610e1c0152610eab0152612c346000f3fe6080604052600436106101855760003560e01c8063943b24b2116100d1578063d547741f1161008a578063e58378bb11610064578063e58378bb146104bf578063ecbbc033146104e1578063f808443514610501578063fdb336f71461052157600080fd5b8063d547741f14610452578063e14f186414610472578063e47a543f1461049f57600080fd5b8063943b24b214610370578063a217fddf14610390578063a8541c17146103a5578063b908afa8146103c5578063bece7532146103f9578063cd87db921461043257600080fd5b80633659cfe61161013e5780634f1ef286116101185780634f1ef286146102fb57806352d1902d1461030e5780637b81dad71461032357806391d148541461035057600080fd5b80633659cfe61461028e57806336cbd832146102ae57806341fa04a8146102db57600080fd5b8063013fcc3d1461019157806301ffc9a7146101c7578063248a9ca3146101f75780632c189169146102355780632f2ff15d1461024c57806336568abe1461026e57600080fd5b3661018c57005b600080fd5b34801561019d57600080fd5b506101b16101ac36600461237b565b610536565b6040516101be91906123ef565b60405180910390f35b3480156101d357600080fd5b506101e76101e2366004612433565b610abb565b60405190151581526020016101be565b34801561020357600080fd5b5061022761021236600461245d565b600090815260c9602052604090206001015490565b6040519081526020016101be565b34801561024157600080fd5b5061022761012e5481565b34801561025857600080fd5b5061026c61026736600461248b565b610af0565b005b34801561027a57600080fd5b5061026c61028936600461248b565b610b1a565b34801561029a57600080fd5b5061026c6102a93660046124bb565b610b9d565b3480156102ba57600080fd5b506102ce6102c93660046124ee565b610c7d565b6040516101be919061258f565b3480156102e757600080fd5b506101e76102f636600461259d565b610d0a565b61026c610309366004612661565b610dd1565b34801561031a57600080fd5b50610227610e9e565b34801561032f57600080fd5b5061012d5461033e9060ff1681565b60405160ff90911681526020016101be565b34801561035c57600080fd5b506101e761036b36600461248b565b610f51565b34801561037c57600080fd5b5061026c61038b366004612708565b610f7c565b34801561039c57600080fd5b50610227600081565b3480156103b157600080fd5b506102ce6103c036600461245d565b61111d565b3480156103d157600080fd5b506102277f88aa719609f728b0c5e7fb8dd3608d5c25d497efbb3b9dd64e9251ebba10150881565b34801561040557600080fd5b5061012f5461041a906001600160a01b031681565b6040516001600160a01b0390911681526020016101be565b34801561043e57600080fd5b506101e761044d36600461259d565b611251565b34801561045e57600080fd5b5061026c61046d36600461248b565b611326565b34801561047e57600080fd5b5061049261048d36600461273d565b61134b565b6040516101be919061275f565b3480156104ab57600080fd5b506104926104ba36600461273d565b611537565b3480156104cb57600080fd5b50610227600080516020612b9883398151915281565b3480156104ed57600080fd5b506101b16104fc36600461245d565b6116d5565b34801561050d57600080fd5b506101e761051c36600461259d565b6116f0565b34801561052d57600080fd5b506101b1611798565b60606105406117aa565b6000826001600160401b0381111561055a5761055a61261b565b604051908082528060200260200182016040528015610583578160200160208202803683370190505b50905060005b83811015610aa8576105b18585838181106105a6576105a66127a1565b905060c00201611804565b5061012f546001600160a01b031663b338123c8686848181106105d6576105d66127a1565b6040516001600160e01b031960e086901b168152606060c09092029390930101356004830152503360248201526044016020604051808303816000875af1158015610625573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064991906127b7565b61066657604051635a10f29160e11b815260040160405180910390fd5b60006106d186868481811061067d5761067d6127a1565b905060c0020160600135878785818110610699576106996127a1565b905060c0020160800135338989878181106106b6576106b66127a1565b6106cc92602060c09092020190810191506127d9565b6118ad565b60008181526101346020526040902054909150801561072d5760008181526101336020908152604080832080546001600160801b03191681556001810184905560020183905561012e5485845261013490925290912055610825565b6040518060a0016040528061012e548152602001888886818110610753576107536127a1565b905060c00201606001358152602001888886818110610774576107746127a1565b905060c00201608001358152602001336001600160a01b031681526020018888868181106107a4576107a46127a1565b6107ba92602060c09092020190810191506127d9565b60ff9081169091526000848152610134602090815260409182902084518155908401516001820155908301516002820155606083015160039091018054608090940151909216600160a01b026001600160a81b03199093166001600160a01b03909116179190911790555b6040518060800160405280888886818110610842576108426127a1565b905060c00201604001602081019061085a91906127f4565b6001600160401b0316815260200188888681811061087a5761087a6127a1565b905060c00201602001602081019061089291906127f4565b6001600160401b031681526020018888868181106108b2576108b26127a1565b60a060c0909102929092019190910135825250602090810184905261012e80546000908152610133835260409081902084518154948601516001600160401b03908116600160401b026001600160801b03199096169116179390931783558301516001830155606090920151600290910155548451859085908110610939576109396127a1565b602002602001018181525050868684818110610957576109576127a1565b905060c0020160800135878785818110610973576109736127a1565b905060c002016060013561012e547faaa59a21a73d2d9728095280eca494951b3d50f06502210d9ab16a1ff3a7bc58338b8b898181106109b5576109b56127a1565b905060c0020160a001358c8c8a8181106109d1576109d16127a1565b905060c0020160200160208101906109e991906127f4565b8d8d8b8181106109fb576109fb6127a1565b905060c002016040016020810190610a1391906127f4565b8e8e8c818110610a2557610a256127a1565b610a3b92602060c09092020190810191506127d9565b604080516001600160a01b0396909616865260208601949094526001600160401b03928316858501529116606084015260ff166080830152519081900360a00190a461012e8054906000610a8e83612833565b919050555050508080610aa090612833565b915050610589565b509050610ab5600160fb55565b92915050565b60006001600160e01b03198216637965db0b60e01b1480610ab557506301ffc9a760e01b6001600160e01b0319831614610ab5565b600082815260c96020526040902060010154610b0b81611918565b610b158383611922565b505050565b6001600160a01b0381163314610b8f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610b9982826119a8565b5050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610be65760405162461bcd60e51b8152600401610b869061284e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c2f600080516020612bb8833981519152546001600160a01b031690565b6001600160a01b031614610c555760405162461bcd60e51b8152600401610b869061289a565b610c5e81611a0f565b60408051600080825260208201909252610c7a91839190611a39565b50565b610c8561233f565b8484610c9361013083611ba4565b610caf5760405162b9a46560e61b815260040160405180910390fd5b600082815261013260205260409020610cc89082611ba4565b610ce557604051637557bb2f60e11b815260040160405180910390fd5b6000610cf3888888886118ad565b9050610cfe81611bbf565b98975050505050505050565b6000600080516020612b98833981519152610d2481611918565b60005b83811015610dc557610d62858583818110610d4457610d446127a1565b60008a81526101326020908152604090912093910201359050611ba4565b610d7f57604051637557bb2f60e11b815260040160405180910390fd5b610db2858583818110610d9457610d946127a1565b60008a81526101326020908152604090912093910201359050611cbd565b5080610dbd81612833565b915050610d27565b50600195945050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610e1a5760405162461bcd60e51b8152600401610b869061284e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e63600080516020612bb8833981519152546001600160a01b031690565b6001600160a01b031614610e895760405162461bcd60e51b8152600401610b869061289a565b610e9282611a0f565b610b9982826001611a39565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f3e5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610b86565b50600080516020612bb883398151915290565b600091825260c9602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600054610100900460ff1615808015610f9c5750600054600160ff909116105b80610fb65750303b158015610fb6575060005460ff166001145b6110195760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b86565b6000805460ff19166001179055801561103c576000805461ff0019166101001790555b61012f80546001600160a01b0319166001600160a01b03851617905561012d805460ff191660ff8416179055600161012e55611076611cc9565b61107e611cc9565b611086611cf2565b611091600033611922565b6110bb7f88aa719609f728b0c5e7fb8dd3608d5c25d497efbb3b9dd64e9251ebba10150833611922565b6110d3600080516020612b9883398151915233611922565b8015610b15576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b61112561233f565b60008281526101336020908152604080832081516080808201845282546001600160401b038082168452600160401b9091041682860152600180840154838601526002938401546060808501829052908852610134875296859020855160a08101875281548152918101549682019690965292850154938301939093526003909301546001600160a01b03811694820194909452600160a01b90930460ff1690830152908315806111d7575080518414155b156111f557604051631ddc470760e31b815260040160405180910390fd5b6040805160e0810182529485526020828101518187015282820151868301526060928301516001600160a01b03169286019290925282015160808501528101516001600160401b0390811660a085015290511660c08301525090565b6000600080516020612b9883398151915261126b81611918565b61127761013086611ba4565b1561129557604051630bb9107160e11b815260040160405180910390fd5b6112a161013086611d21565b5060005b83811015610dc5576112c2858583818110610d4457610d446127a1565b156112e057604051634234cba560e01b815260040160405180910390fd5b6113138585838181106112f5576112f56127a1565b60008a81526101326020908152604090912093910201359050611d21565b508061131e81612833565b9150506112a5565b600082815260c9602052604090206001015461134181611918565b610b1583836119a8565b6060828261135b61013083611ba4565b6113775760405162b9a46560e61b815260040160405180910390fd5b6000828152610132602052604090206113909082611ba4565b6113ad57604051637557bb2f60e11b815260040160405180910390fd5b61012f54604051636116658160e01b8152600481018790526000916001600160a01b031690636116658190602401600060405180830381865afa1580156113f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261142091908101906128e6565b61012d5481519192506000916114399160ff169061298b565b90506000816001600160401b038111156114555761145561261b565b60405190808252806020026020018201604052801561148e57816020015b61147b61233f565b8152602001906001900390816114735790505b5090506000805b84518110156115295760005b61012d5460ff9081169082161015611516576114d88b8b8885815181106114ca576114ca6127a1565b602002602001015184610c7d565b8484815181106114ea576114ea6127a1565b6020026020010181905250828061150090612833565b935050808061150e906129aa565b9150506114a1565b508061152181612833565b915050611495565b509098975050505050505050565b6060828261154761013083611ba4565b6115635760405162b9a46560e61b815260040160405180910390fd5b60008281526101326020526040902061157c9082611ba4565b61159957604051637557bb2f60e11b815260040160405180910390fd5b61012f54604080516380dce16960e01b815290516000926001600160a01b0316916380dce1699160048083019260209291908290030181865afa1580156115e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160891906129ca565b61012d5490915060009060ff166001600160401b0381111561162c5761162c61261b565b60405190808252806020026020018201604052801561166557816020015b61165261233f565b81526020019060019003908161164a5790505b50905060005b61012d5460ff90811690821610156116ca57600061168b898986856118ad565b905061169681611bbf565b838360ff16815181106116ab576116ab6127a1565b60200260200101819052505080806116c2906129aa565b91505061166b565b509695505050505050565b600081815261013260205260409020606090610ab590611d2d565b6000600080516020612b9883398151915261170a81611918565b61171661013086611ba4565b6117325760405162b9a46560e61b815260040160405180910390fd5b60005b83811015610dc557611752858583818110610d4457610d446127a1565b1561177057604051634234cba560e01b815260040160405180910390fd5b6117858585838181106112f5576112f56127a1565b508061179081612833565b915050611735565b60606117a5610130611d2d565b905090565b600260fb5414156117fd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b86565b600260fb55565b60006060820135608083013561181c61013083611ba4565b6118385760405162b9a46560e61b815260040160405180910390fd5b6000828152610132602052604090206118519082611ba4565b61186e57604051637557bb2f60e11b815260040160405180910390fd5b61012d5460ff1661188260208601866127d9565b60ff16106118a35760405163c54fa96960e01b815260040160405180910390fd5b5060019392505050565b6040805160208101869052908101849052606083811b6bffffffffffffffffffffffff19169082015260f882901b6001600160f81b03191660748201526000906075016040516020818303038152906040528051906020012090505b949350505050565b600160fb55565b610c7a8133611d3a565b61192c8282610f51565b610b9957600082815260c9602090815260408083206001600160a01b03851684529091529020805460ff191660011790556119643390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6119b28282610f51565b15610b9957600082815260c9602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f88aa719609f728b0c5e7fb8dd3608d5c25d497efbb3b9dd64e9251ebba101508610b9981611918565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611a6c57610b1583611d93565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ac6575060408051601f3d908101601f19168201909252611ac3918101906129e7565b60015b611b295760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610b86565b600080516020612bb88339815191528114611b985760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610b86565b50610b15838383611e2f565b600081815260018301602052604081205415155b9392505050565b611bc761233f565b50600090815261013460209081526040808320815160a0808201845282548083526001808501548488019081526002808701548689019081526003909701546001600160a01b038082166060808a01918252600160a01b90930460ff166080808b0191909152968d526101338c529b8a90208a518088018c5281546001600160401b038082168352600160401b9091048116828f0190815297830154828e019081529290950154818501528b5160e081018d5299518a5294519b89019b909b529751988701989098529851909516958401959095529451948201949094529151841692820192909252905190911660c082015290565b6000611bb88383611e5a565b600054610100900460ff16611cf05760405162461bcd60e51b8152600401610b8690612a00565b565b600054610100900460ff16611d195760405162461bcd60e51b8152600401610b8690612a00565b611cf0611f4d565b6000611bb88383611f74565b60606000611bb883611fc3565b611d448282610f51565b610b9957611d518161201f565b611d5c836020612031565b604051602001611d6d929190612a77565b60408051601f198184030181529082905262461bcd60e51b8252610b8691600401612aec565b6001600160a01b0381163b611e005760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610b86565b600080516020612bb883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b611e38836121cc565b600082511180611e455750805b15610b1557611e54838361220c565b50505050565b60008181526001830160205260408120548015611f43576000611e7e600183612b1f565b8554909150600090611e9290600190612b1f565b9050818114611ef7576000866000018281548110611eb257611eb26127a1565b9060005260206000200154905080876000018481548110611ed557611ed56127a1565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611f0857611f08612b36565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610ab5565b6000915050610ab5565b600054610100900460ff166119115760405162461bcd60e51b8152600401610b8690612a00565b6000818152600183016020526040812054611fbb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ab5565b506000610ab5565b60608160000180548060200260200160405190810160405280929190818152602001828054801561201357602002820191906000526020600020905b815481526020019060010190808311611fff575b50505050509050919050565b6060610ab56001600160a01b03831660145b6060600061204083600261298b565b61204b906002612b4c565b6001600160401b038111156120625761206261261b565b6040519080825280601f01601f19166020018201604052801561208c576020820181803683370190505b509050600360fc1b816000815181106120a7576120a76127a1565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106120d6576120d66127a1565b60200101906001600160f81b031916908160001a90535060006120fa84600261298b565b612105906001612b4c565b90505b600181111561217d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612139576121396127a1565b1a60f81b82828151811061214f5761214f6127a1565b60200101906001600160f81b031916908160001a90535060049490941c9361217681612b64565b9050612108565b508315611bb85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b86565b6121d581611d93565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060611bb88383604051806060016040528060278152602001612bd8602791396060600080856001600160a01b0316856040516122499190612b7b565b600060405180830381855af49150503d8060008114612284576040519150601f19603f3d011682016040523d82523d6000602084013e612289565b606091505b509150915061229a868383876122a4565b9695505050505050565b60608315612310578251612309576001600160a01b0385163b6123095760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b86565b5081611909565b61190983838151156123255781518083602001fd5b8060405162461bcd60e51b8152600401610b869190612aec565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6000806020838503121561238e57600080fd5b82356001600160401b03808211156123a557600080fd5b818501915085601f8301126123b957600080fd5b8135818111156123c857600080fd5b86602060c0830285010111156123dd57600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b818110156124275783518352928401929184019160010161240b565b50909695505050505050565b60006020828403121561244557600080fd5b81356001600160e01b031981168114611bb857600080fd5b60006020828403121561246f57600080fd5b5035919050565b6001600160a01b0381168114610c7a57600080fd5b6000806040838503121561249e57600080fd5b8235915060208301356124b081612476565b809150509250929050565b6000602082840312156124cd57600080fd5b8135611bb881612476565b803560ff811681146124e957600080fd5b919050565b6000806000806080858703121561250457600080fd5b8435935060208501359250604085013561251d81612476565b915061252b606086016124d8565b905092959194509250565b8051825260208082015190830152604080820151908301526060808201516001600160a01b0316908301526080808201519083015260a0808201516001600160401b039081169184019190915260c09182015116910152565b60e08101610ab58284612536565b6000806000604084860312156125b257600080fd5b8335925060208401356001600160401b03808211156125d057600080fd5b818601915086601f8301126125e457600080fd5b8135818111156125f357600080fd5b8760208260051b850101111561260857600080fd5b6020830194508093505050509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156126595761265961261b565b604052919050565b6000806040838503121561267457600080fd5b823561267f81612476565b91506020838101356001600160401b038082111561269c57600080fd5b818601915086601f8301126126b057600080fd5b8135818111156126c2576126c261261b565b6126d4601f8201601f19168501612631565b915080825287848285010111156126ea57600080fd5b80848401858401376000848284010152508093505050509250929050565b6000806040838503121561271b57600080fd5b823561272681612476565b9150612734602084016124d8565b90509250929050565b6000806040838503121561275057600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156124275761278e838551612536565b9284019260e0929092019160010161277b565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156127c957600080fd5b81518015158114611bb857600080fd5b6000602082840312156127eb57600080fd5b611bb8826124d8565b60006020828403121561280657600080fd5b81356001600160401b0381168114611bb857600080fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156128475761284761281d565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208083850312156128f957600080fd5b82516001600160401b038082111561291057600080fd5b818501915085601f83011261292457600080fd5b8151818111156129365761293661261b565b8060051b9150612947848301612631565b818152918301840191848101908884111561296157600080fd5b938501935b83851015610cfe578451925061297b83612476565b8282529385019390850190612966565b60008160001904831182151516156129a5576129a561281d565b500290565b600060ff821660ff8114156129c1576129c161281d565b60010192915050565b6000602082840312156129dc57600080fd5b8151611bb881612476565b6000602082840312156129f957600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015612a66578181015183820152602001612a4e565b83811115611e545750506000910152565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612aaf816017850160208801612a4b565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612ae0816028840160208801612a4b565b01602801949350505050565b6020815260008251806020840152612b0b816040850160208701612a4b565b601f01601f19169190910160400192915050565b600082821015612b3157612b3161281d565b500390565b634e487b7160e01b600052603160045260246000fd5b60008219821115612b5f57612b5f61281d565b500190565b600081612b7357612b7361281d565b506000190190565b60008251612b8d818460208701612a4b565b919091019291505056feb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e2c3192e7ecdb1c0a8ef9aad634cf7b097a13b46296972ed60288332591b19cf64736f6c634300080a0033",
"deployedBytecode": "0x6080604052600436106101855760003560e01c8063943b24b2116100d1578063d547741f1161008a578063e58378bb11610064578063e58378bb146104bf578063ecbbc033146104e1578063f808443514610501578063fdb336f71461052157600080fd5b8063d547741f14610452578063e14f186414610472578063e47a543f1461049f57600080fd5b8063943b24b214610370578063a217fddf14610390578063a8541c17146103a5578063b908afa8146103c5578063bece7532146103f9578063cd87db921461043257600080fd5b80633659cfe61161013e5780634f1ef286116101185780634f1ef286146102fb57806352d1902d1461030e5780637b81dad71461032357806391d148541461035057600080fd5b80633659cfe61461028e57806336cbd832146102ae57806341fa04a8146102db57600080fd5b8063013fcc3d1461019157806301ffc9a7146101c7578063248a9ca3146101f75780632c189169146102355780632f2ff15d1461024c57806336568abe1461026e57600080fd5b3661018c57005b600080fd5b34801561019d57600080fd5b506101b16101ac36600461237b565b610536565b6040516101be91906123ef565b60405180910390f35b3480156101d357600080fd5b506101e76101e2366004612433565b610abb565b60405190151581526020016101be565b34801561020357600080fd5b5061022761021236600461245d565b600090815260c9602052604090206001015490565b6040519081526020016101be565b34801561024157600080fd5b5061022761012e5481565b34801561025857600080fd5b5061026c61026736600461248b565b610af0565b005b34801561027a57600080fd5b5061026c61028936600461248b565b610b1a565b34801561029a57600080fd5b5061026c6102a93660046124bb565b610b9d565b3480156102ba57600080fd5b506102ce6102c93660046124ee565b610c7d565b6040516101be919061258f565b3480156102e757600080fd5b506101e76102f636600461259d565b610d0a565b61026c610309366004612661565b610dd1565b34801561031a57600080fd5b50610227610e9e565b34801561032f57600080fd5b5061012d5461033e9060ff1681565b60405160ff90911681526020016101be565b34801561035c57600080fd5b506101e761036b36600461248b565b610f51565b34801561037c57600080fd5b5061026c61038b366004612708565b610f7c565b34801561039c57600080fd5b50610227600081565b3480156103b157600080fd5b506102ce6103c036600461245d565b61111d565b3480156103d157600080fd5b506102277f88aa719609f728b0c5e7fb8dd3608d5c25d497efbb3b9dd64e9251ebba10150881565b34801561040557600080fd5b5061012f5461041a906001600160a01b031681565b6040516001600160a01b0390911681526020016101be565b34801561043e57600080fd5b506101e761044d36600461259d565b611251565b34801561045e57600080fd5b5061026c61046d36600461248b565b611326565b34801561047e57600080fd5b5061049261048d36600461273d565b61134b565b6040516101be919061275f565b3480156104ab57600080fd5b506104926104ba36600461273d565b611537565b3480156104cb57600080fd5b50610227600080516020612b9883398151915281565b3480156104ed57600080fd5b506101b16104fc36600461245d565b6116d5565b34801561050d57600080fd5b506101e761051c36600461259d565b6116f0565b34801561052d57600080fd5b506101b1611798565b60606105406117aa565b6000826001600160401b0381111561055a5761055a61261b565b604051908082528060200260200182016040528015610583578160200160208202803683370190505b50905060005b83811015610aa8576105b18585838181106105a6576105a66127a1565b905060c00201611804565b5061012f546001600160a01b031663b338123c8686848181106105d6576105d66127a1565b6040516001600160e01b031960e086901b168152606060c09092029390930101356004830152503360248201526044016020604051808303816000875af1158015610625573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064991906127b7565b61066657604051635a10f29160e11b815260040160405180910390fd5b60006106d186868481811061067d5761067d6127a1565b905060c0020160600135878785818110610699576106996127a1565b905060c0020160800135338989878181106106b6576106b66127a1565b6106cc92602060c09092020190810191506127d9565b6118ad565b60008181526101346020526040902054909150801561072d5760008181526101336020908152604080832080546001600160801b03191681556001810184905560020183905561012e5485845261013490925290912055610825565b6040518060a0016040528061012e548152602001888886818110610753576107536127a1565b905060c00201606001358152602001888886818110610774576107746127a1565b905060c00201608001358152602001336001600160a01b031681526020018888868181106107a4576107a46127a1565b6107ba92602060c09092020190810191506127d9565b60ff9081169091526000848152610134602090815260409182902084518155908401516001820155908301516002820155606083015160039091018054608090940151909216600160a01b026001600160a81b03199093166001600160a01b03909116179190911790555b6040518060800160405280888886818110610842576108426127a1565b905060c00201604001602081019061085a91906127f4565b6001600160401b0316815260200188888681811061087a5761087a6127a1565b905060c00201602001602081019061089291906127f4565b6001600160401b031681526020018888868181106108b2576108b26127a1565b60a060c0909102929092019190910135825250602090810184905261012e80546000908152610133835260409081902084518154948601516001600160401b03908116600160401b026001600160801b03199096169116179390931783558301516001830155606090920151600290910155548451859085908110610939576109396127a1565b602002602001018181525050868684818110610957576109576127a1565b905060c0020160800135878785818110610973576109736127a1565b905060c002016060013561012e547faaa59a21a73d2d9728095280eca494951b3d50f06502210d9ab16a1ff3a7bc58338b8b898181106109b5576109b56127a1565b905060c0020160a001358c8c8a8181106109d1576109d16127a1565b905060c0020160200160208101906109e991906127f4565b8d8d8b8181106109fb576109fb6127a1565b905060c002016040016020810190610a1391906127f4565b8e8e8c818110610a2557610a256127a1565b610a3b92602060c09092020190810191506127d9565b604080516001600160a01b0396909616865260208601949094526001600160401b03928316858501529116606084015260ff166080830152519081900360a00190a461012e8054906000610a8e83612833565b919050555050508080610aa090612833565b915050610589565b509050610ab5600160fb55565b92915050565b60006001600160e01b03198216637965db0b60e01b1480610ab557506301ffc9a760e01b6001600160e01b0319831614610ab5565b600082815260c96020526040902060010154610b0b81611918565b610b158383611922565b505050565b6001600160a01b0381163314610b8f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610b9982826119a8565b5050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610be65760405162461bcd60e51b8152600401610b869061284e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c2f600080516020612bb8833981519152546001600160a01b031690565b6001600160a01b031614610c555760405162461bcd60e51b8152600401610b869061289a565b610c5e81611a0f565b60408051600080825260208201909252610c7a91839190611a39565b50565b610c8561233f565b8484610c9361013083611ba4565b610caf5760405162b9a46560e61b815260040160405180910390fd5b600082815261013260205260409020610cc89082611ba4565b610ce557604051637557bb2f60e11b815260040160405180910390fd5b6000610cf3888888886118ad565b9050610cfe81611bbf565b98975050505050505050565b6000600080516020612b98833981519152610d2481611918565b60005b83811015610dc557610d62858583818110610d4457610d446127a1565b60008a81526101326020908152604090912093910201359050611ba4565b610d7f57604051637557bb2f60e11b815260040160405180910390fd5b610db2858583818110610d9457610d946127a1565b60008a81526101326020908152604090912093910201359050611cbd565b5080610dbd81612833565b915050610d27565b50600195945050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610e1a5760405162461bcd60e51b8152600401610b869061284e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e63600080516020612bb8833981519152546001600160a01b031690565b6001600160a01b031614610e895760405162461bcd60e51b8152600401610b869061289a565b610e9282611a0f565b610b9982826001611a39565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614