@ethsub/sol
Version:
ethsub contracts
213 lines • 423 kB
JSON
{
"contractName": "ERC721Handler",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "bridgeAddress",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "_bridgeAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_burnList",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_contractWhitelist",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "_resourceIDToTokenContractAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "_tokenContractAddressToResourceID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setBurnable",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
}
],
"name": "setResource",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "address",
"name": "depositer",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "deposit",
"outputs": [
{
"internalType": "bytes",
"name": "metaData",
"type": "bytes"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "resourceID",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "executeProposal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bridgeAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"_bridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_burnList\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_contractWhitelist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"_resourceIDToTokenContractAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_tokenContractAddressToResourceID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"resourceID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"depositer\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"deposit\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"metaData\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"resourceID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"executeProposal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"setBurnable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"resourceID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"setResource\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"ChainSafe Systems.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"bridgeAddress\":\"Contract address of previously deployed Bridge.\"}},\"deposit(bytes32,address,bytes)\":{\"details\":\"Depending if the corresponding {tokenAddress} for the parsed {resourceID} is marked true in {_burnList}, deposited tokens will be burned, if not, they will be locked.\",\"params\":{\"data\":\"Consists of {tokenID} padded to 32 bytes.\",\"depositer\":\"Address of account making the deposit in the Bridge contract.\",\"resourceID\":\"ResourceID used to find address of token to be used for deposit.\"},\"returns\":{\"metaData\":\": the deposited token metadata acquired by calling a {tokenURI} method in the token contract.\"}},\"executeProposal(bytes32,bytes)\":{\"params\":{\"data\":\"Consists of {tokenID}, {resourceID}, {lenDestinationRecipientAddress}, {destinationRecipientAddress}, {lenMeta}, and {metaData} all padded to 32 bytes.\"}},\"setBurnable(address)\":{\"params\":{\"contractAddress\":\"Address of contract to be used when making or executing deposits.\"}},\"setResource(bytes32,address)\":{\"params\":{\"contractAddress\":\"Address of contract to be called when a deposit is made and a deposited is executed.\",\"resourceID\":\"ResourceID to be used when making deposits.\"}},\"withdraw(bytes)\":{\"params\":{\"data\":\"Consists of {tokenAddress}, {recipient}, and {tokenID} all padded to 32 bytes.\"}}},\"title\":\"Handles ERC721 deposits and deposit executions.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deposit(bytes32,address,bytes)\":{\"notice\":\"A deposit is initiatied by making a deposit in the Bridge contract.Data passed into the function should be constructed as follows: tokenID uint256 bytes 0 - 32If the corresponding {tokenAddress} for the parsed {resourceID} supports {_INTERFACE_ERC721_METADATA}, then {metaData} will be set according to the {tokenURI} method in the token contract.\"},\"executeProposal(bytes32,bytes)\":{\"notice\":\"Proposal execution should be initiated when a proposal is finalized in the Bridge contract. by a relayer on the deposit's destination chain.Data passed into the function should be constructed as follows: tokenID uint256 bytes 0 - 32 destinationRecipientAddress length uint256 bytes 32 - 64 destinationRecipientAddress bytes bytes 64 - (64 + len(destinationRecipientAddress)) metadata length uint256 bytes (64 + len(destinationRecipientAddress)) - (64 + len(destinationRecipientAddress) + 32) metadata bytes bytes (64 + len(destinationRecipientAddress) + 32) - END\"},\"setBurnable(address)\":{\"notice\":\"First verifies {contractAddress} is whitelisted, then sets {_burnList}[{contractAddress}] to true.\"},\"setResource(bytes32,address)\":{\"notice\":\"First verifies {_resourceIDToContractAddress}[{resourceID}] and {_contractAddressToResourceID}[{contractAddress}] are not already set, then sets {_resourceIDToContractAddress} with {contractAddress}, {_contractAddressToResourceID} with {resourceID}, and {_contractWhitelist} to true for {contractAddress}.\"},\"withdraw(bytes)\":{\"notice\":\"Used to manually release ERC721 tokens from ERC721Safe.Data passed into the function should be constructed as follows: tokenAddress address bytes 0 - 32 recipient address bytes 32 - 64 tokenID uint bytes 64 - 96\"}},\"notice\":\"This contract is intended to be used with the Bridge contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"project:/contracts/handlers/ERC721Handler.sol\":\"ERC721Handler\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/GSN/Context.sol\":{\"keccak256\":\"0x9486045e189facd2e868ece35249872598ef03f1087fb6fa4d1161842daa2287\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77c3a04ef8453788b14b1ebbc24dd3f0a18ceb2615cd156aac949a611e552af8\",\"dweb:/ipfs/QmcmqWGguRM3iLuF57tcyrN3F6EA63kzeNkDfQuteBnurr\"]},\"@openzeppelin/contracts/introspection/ERC165.sol\":{\"keccak256\":\"0x24141d2f6b98d4cb77a8936eae8cbaad2e261d9062bdc08036096f4550092501\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b710eb003944777135f027500a5a57b479fe857849f5f467c1ef9687401e3c95\",\"dweb:/ipfs/QmcELzi6KRzAs3DXwxdsoKWRJ13KSeipKQsJgD3unctdZM\"]},\"@openzeppelin/contracts/introspection/ERC165Checker.sol\":{\"keccak256\":\"0x1bdefceaba99e08a6c30400bc686e6380c1e914887bf5780db14f965c09aa9d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fa31e8df5c7a5f3434977d3a881ee322c4e81f8486aec4bb859bebd20f23d805\",\"dweb:/ipfs/QmShFfnjPytP2ooLtDj7f2XULXgbsRj4xjrFc9qm9kRe79\"]},\"@openzeppelin/contracts/introspection/IERC165.sol\":{\"keccak256\":\"0xf70bc25d981e4ec9673a995ad2995d5d493ea188d3d8f388bba9c227ce09fb82\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd970f51e3a77790c2f02b5b1759827c3b897c3d98c407b3631e8af32e3dc93c\",\"dweb:/ipfs/QmPF85Amgbqjk3SNZKsPCsqCw8JfwYEPMnnhvMJUyX58je\"]},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0xcc78a17dd88fa5a2edc60c8489e2f405c0913b377216a5b26b35656b2d0dab52\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://526dc85e1f9b9b45830e202568d267d93dde7a4fcccf4ad7798dadcd92304d3c\",\"dweb:/ipfs/QmaoXMB972J3cSDLtBq3xBo4jLwqD2uzXTwujtSPqkYVhR\"]},\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"keccak256\":\"0x118ed7540f56b21ff92e21ebaa73584048e98d2ac04ca67571329bb8dbd9032f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da2918b7aff73dd51d41bfcfa548f81eb50531b8353500fdbdacf297076db070\",\"dweb:/ipfs/Qmb8ixAs1vBjZRowQNuNg6bRf2NZmgZ1JTBxmQS14PHpcL\"]},\"@openzeppelin/contracts/token/ERC721/ERC721Burnable.sol\":{\"keccak256\":\"0x060925a04766df64ac29f56aaa3a38aafd71424ba4d996ca0f14363828b97056\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8593f0fcac22c97956ab3e779e8a55a6c33dd01059fa01f15992518e708f4e6f\",\"dweb:/ipfs/QmWYQcAy7R6v5prSfmigmrhr7nGxwzkbZkmdeMcLNLUG66\"]},\"@openzeppelin/contracts/token/ERC721/ERC721Pausable.sol\":{\"keccak256\":\"0x1c31a4c2ad1af9e25cd8f4ea941ebd6a6a932426183ab39c160cb8e51cfc704f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77dd2448bbeb4a8f6f3273042d02326fa6ba191827e5b37f6f68492b17d022c9\",\"dweb:/ipfs/QmRiAmuxtRcVRhXUymziiTD3r8SGcjxKN95ZLVKd2jtWjN\"]},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x2d99a0deb6648c34fbc66d6ac4a2d64798d7a5321b45624f6736fadc63da1962\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2dcdce5ede1e5e650d174ec0b35be7d47b6a50f30bc895ef0d9e59fb75052e45\",\"dweb:/ipfs/QmQ2XFsDLTYqfEdw7pYzHiGtFRY11yQm4b6ynYgKqDxeB8\"]},\"@openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol\":{\"keccak256\":\"0xe6bd1b1218338b6f9fe17776f48623b4ac3d8a40405f74a44bc23c00abe2ca13\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0c354c3f6e9c487759aa7869be4fba68e0b2efc777b514d289c4cbd3ff8f7e1a\",\"dweb:/ipfs/QmdF9LcSYVmiUCL7JxLEYmSLrjga6zJsujfi6sgEJD4M1z\"]},\"@openzeppelin/contracts/token/ERC721/IERC721Metadata.sol\":{\"keccak256\":\"0xccb917776f826ac6b68bd5a15a5f711e3967848a52ba11e6104d9a4f593314a7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://430255ad2229ced6d880e61a67bdc6e48dbbaed8354a7c1fe918cd8b8714a886\",\"dweb:/ipfs/QmTHY56odzqEpEC6v6tafaWMYY7vmULw25q5XHJLCCAeox\"]},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"keccak256\":\"0x52146049d6709c870e8ddcd988b5155cb6c5d640cfcd8978aee52bc1ba2ec4eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada84513617b7c1b2f890b44503735abaec73a1acd030112a17aac7e6c66a4a1\",\"dweb:/ipfs/QmaiFwdio67iJrfjAdkMac24eJ5sS1qD7CZW6PhUU6KjiK\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x28911e614500ae7c607a432a709d35da25f3bc5ddc8bd12b278b66358070c0ea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://256c8c8af5eb072bc473226ab2b2187149b8fc04f5f4a4820db22527f5ce8e3c\",\"dweb:/ipfs/QmRvi5BhnL7Rxf85KrJhwM6RRhukm4tzoctRdgQEheNyiN\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ded47ec7c96750f9bd04bbbc84f659992d4ba901cb7b532a52cd468272cf378f\",\"dweb:/ipfs/QmfBrGtQP7rZEqEg6Wz6jh2N2Kukpj1z5v3CGWmAqrzm96\"]},\"@openzeppelin/contracts/utils/Counters.sol\":{\"keccak256\":\"0x21662e4254ce4ac8570b30cc7ab31435966b3cb778a56ba4d09276881cfb2437\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://acce8fe6adc670f9987a8b6aedc4cc0abcd0dcd2e152d649a12099d735bd7bad\",\"dweb:/ipfs/QmXAk17oK3daBmA8CGyVcU56L496jW3U6Ef1WkfHyB1JAV\"]},\"@openzeppelin/contracts/utils/EnumerableMap.sol\":{\"keccak256\":\"0x4b087f06b6670a131a5a14e53b1d2a5ef19c034cc5ec42eeebcf9554325744ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f6a6af5d848334e40db419773f6360601e311ffc21c2e274f730b8c542da99fd\",\"dweb:/ipfs/QmfA24cxQ2g41ZWUuDF295dxDJ4xF1bSDYtC3EaLd7CzW8\"]},\"@openzeppelin/contracts/utils/EnumerableSet.sol\":{\"keccak256\":\"0x1562cd9922fbf739edfb979f506809e2743789cbde3177515542161c3d04b164\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4580d57781513d98870d9738c7d39094336e0a70cdb90d68dad549c6ced466ec\",\"dweb:/ipfs/Qmf9YZzzRFuvMnav9dgmeRUpdYMMECiZX8w25sHWVbA18V\"]},\"@openzeppelin/contracts/utils/Pausable.sol\":{\"keccak256\":\"0x212fb1b1d4beaf74354dad9bc329f44ee3c5375ef1c32acff76b4ecefc10f1d8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d21c68cb321d1c8d0fa39fd9ecb6bbe3b2f26623b0f38af280a010c916c85f23\",\"dweb:/ipfs/Qmf2P51HRC4ekDHLYfbXu5SXR33gXrWtq6oKSmfyWqVRuC\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa1e12f97981f1d0964b1c048978606a57127c56c438bab61cdfe269cad859a74\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5eefac1760f524971e14aa3f3d79515a3d54fd28c1d3bdca0b36127da349b830\",\"dweb:/ipfs/QmUMzkyH3ytJX5gVPizQruNLhkKmuJb3nFqBDad4LPdg5U\"]},\"project:/contracts/ERC721MinterBurnerPauser.sol\":{\"keccak256\":\"0xb0f727d542bf3f517bcc07abab1efb86ef6d37a216b4d41d8a3194c5bcd20a73\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://02dc95a492b39f9ecf35f607479c0320b917aeba7730407734d1aaa02cb3b040\",\"dweb:/ipfs/QmTekLFSqQaJwdJUHQ814cHPrL8DzuWhFEgLzteJE2hmLv\"]},\"project:/contracts/ERC721Safe.sol\":{\"keccak256\":\"0x834bedd29226386aaf241ba2f369c8c3109ef087bf355c0da19cb84b5d3e0846\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://6e38c3ba911aa06dfccf46cd8fec3e562d3766b7e0ae351d931f78d8834c380a\",\"dweb:/ipfs/QmeEutLyHU9mv23PrGGQUTQpSWXcrGxkQF7TbwTtFdET3M\"]},\"project:/contracts/handlers/ERC721Handler.sol\":{\"keccak256\":\"0xb4ea78f1b0d86bda8355a38402c46b8a879337d76dd4e996e038f24f93a14222\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://433f4c32c6a4622188e69b50bd34fe7f4203227be1f896367b221b7cf91d6ed7\",\"dweb:/ipfs/QmPigSncvD6PRv6UPzdQ4skFWXMsC4rfd9ef3Eb9FWDN7d\"]},\"project:/contracts/handlers/HandlerHelpers.sol\":{\"keccak256\":\"0x9418d0646c373e028595a4a3abf5ac93948ea64efa031f1531c70a0500882d09\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://43e30989056cc8c5f0d2a26cb3a7e8a5d0d51dd2c832fb8d751c353226254871\",\"dweb:/ipfs/QmRpXPeLz7Qjh5qxMW4PyC8qkjrpEJCeCiqfobZyg28y6S\"]},\"project:/contracts/interfaces/IDepositExecute.sol\":{\"keccak256\":\"0x3623f906ae6f354cbf27ffd4eeccbfc2c3baa94783c5dd854b2e0f50db2a7c8d\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://26f8ddafd8655375eeb861a033fe390b3235c4f8de9a54e0524b91d2d1992674\",\"dweb:/ipfs/QmUAsxc8j4UdaDZ5HVp73kAwLpgTqqrgZG1sX86iRKZTqv\"]},\"project:/contracts/interfaces/IERCHandler.sol\":{\"keccak256\":\"0x4384276611a789db6481e1158d92c280fe5990ec0c375df30dd5e8f8a97cbb4c\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://3af488536c6d8f6b3090ca9b5fa54718941604a30f58bd66db641a6599a9f296\",\"dweb:/ipfs/QmSm988tQV4XtkCQpTbf2SbdCHp8AcjYZhQLhftPFXrUf2\"]},\"project:/contracts/utils/AccessControl.sol\":{\"keccak256\":\"0x0188570bd646df63dd236b997edf12d2e5a566d9fd54b9405c67c6d7eeca353e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://eaa8a02b8fda3d9a50019cb96fec11cfb80b90250e37e91e0ec6cd945efa9810\",\"dweb:/ipfs/QmZ2nuod9fjYvsCjRr4Bhk6FTES4zsofxsQSDFS24JFaGq\"]}},\"version\":1}",
"bytecode": "0x60a060405234801561001057600080fd5b50604051610e71380380610e7183398101604081905261002f91610044565b60601b6001600160601b031916608052610072565b600060208284031215610055578081fd5b81516001600160a01b038116811461006b578182fd5b9392505050565b60805160601c610ddd6100946000398061020052806105445250610ddd6000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80637f79bea8116100665780637f79bea81461011c578063b07e54bb1461012f578063b8fa37361461014f578063c8ba6c8714610162578063e248cff2146101825761009e565b806307b7ed99146100a35780630968f264146100b85780630a6d55d8146100cb578063318c136e146100f45780636a70d081146100fc575b600080fd5b6100b66100b13660046108e0565b610195565b005b6100b66100c6366004610a49565b6101a9565b6100de6100d936600461095e565b6101e3565b6040516100eb9190610b95565b60405180910390f35b6100de6101fe565b61010f61010a3660046108e0565b610222565b6040516100eb9190610bf4565b61010f61012a3660046108e0565b610237565b61014261013d3660046109a5565b61024c565b6040516100eb9190610c1d565b6100b661015d366004610976565b6103a0565b6101756101703660046108e0565b6103b6565b6040516100eb9190610bff565b6100b66101903660046109ff565b6103c8565b61019d610539565b6101a681610583565b50565b6101b1610539565b6000806000838060200190518101906101ca91906108fc565b919450925090506101dd833084846105df565b50505050565b6000602081905290815260409020546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6060610256610539565b60006102648385018561095e565b600087815260208181526040808320546001600160a01b03168084526002909252909120549192509060ff166102b55760405162461bcd60e51b81526004016102ac90610cab565b60405180910390fd5b6102cf6001600160a01b038216635b5e139f60e01b61064a565b1561035a5760405163c87b56dd60e01b815281906001600160a01b0382169063c87b56dd90610302908690600401610bff565b60006040518083038186803b15801561031a57600080fd5b505afa15801561032e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103569190810190610ac2565b9350505b6001600160a01b03811660009081526003602052604090205460ff161561038a57610385818361066d565b610396565b610396818730856105df565b5050949350505050565b6103a8610539565b6103b282826106d2565b5050565b60016020526000908152604090205481565b6103d0610539565b60008060608180826103e487890189610b2c565b9096509450604080860193506103fd908490898b610d3e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509296506104439250899150859050818b610d3e565b810190610450919061095e565b915061046660208484018101908501898b610d3e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506020898101518f83528282526040808420546001600160a01b0316808552600290935290922054959650909490935060ff1691506104e890505760405162461bcd60e51b81526004016102ac90610cab565b6001600160a01b03811660009081526003602052604090205460ff161561051d57610518818360601c8a8661071f565b61052c565b61052c81308460601c8b6105df565b5050505050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105815760405162461bcd60e51b81526004016102ac90610c30565b565b6001600160a01b03811660009081526002602052604090205460ff166105bb5760405162461bcd60e51b81526004016102ac90610c67565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6040516323b872dd60e01b815284906001600160a01b038216906323b872dd9061061190879087908790600401610ba9565b600060405180830381600087803b15801561062b57600080fd5b505af115801561063f573d6000803e3d6000fd5b505050505050505050565b600061065583610751565b801561066657506106668383610785565b9392505050565b604051630852cd8d60e31b815282906001600160a01b038216906342966c689061069b908590600401610bff565b600060405180830381600087803b1580156106b557600080fd5b505af11580156106c9573d6000803e3d6000fd5b50505050505050565b60008281526020818152604080832080546001600160a01b039095166001600160a01b0319909516851790559282526001808252838320949094556002905220805460ff19169091179055565b6040516334ff261960e21b815284906001600160a01b0382169063d3fc98649061061190879087908790600401610bcd565b6000610764826301ffc9a760e01b610785565b801561077f575061077d826001600160e01b0319610785565b155b92915050565b600080600061079485856107ab565b915091508180156107a25750805b95945050505050565b60008060606301ffc9a760e01b846040516024016107c99190610c08565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060866001600160a01b03166175308460405161081d9190610b79565b6000604051808303818686fa925050503d8060008114610859576040519150601f19603f3d011682016040523d82523d6000602084013e61085e565b606091505b509150915060208151101561087c5760008094509450505050610899565b8181806020019051810190610891919061093e565b945094505050505b9250929050565b60008083601f8401126108b1578182fd5b50813567ffffffffffffffff8111156108c8578182fd5b60208301915083602082850101111561089957600080fd5b6000602082840312156108f1578081fd5b813561066681610d92565b600080600060608486031215610910578182fd5b835161091b81610d92565b602085015190935061092c81610d92565b80925050604084015190509250925092565b60006020828403121561094f578081fd5b81518015158114610666578182fd5b60006020828403121561096f578081fd5b5035919050565b60008060408385031215610988578182fd5b82359150602083013561099a81610d92565b809150509250929050565b600080600080606085870312156109ba578081fd5b8435935060208501356109cc81610d92565b9250604085013567ffffffffffffffff8111156109e7578182fd5b6109f3878288016108a0565b95989497509550505050565b600080600060408486031215610a13578283fd5b83359250602084013567ffffffffffffffff811115610a30578283fd5b610a3c868287016108a0565b9497909650939450505050565b600060208284031215610a5a578081fd5b813567ffffffffffffffff811115610a70578182fd5b8201601f81018413610a80578182fd5b8035610a93610a8e82610d1a565b610cf3565b818152856020838501011115610aa7578384fd5b81602084016020830137908101602001929092525092915050565b600060208284031215610ad3578081fd5b815167ffffffffffffffff811115610ae9578182fd5b8201601f81018413610af9578182fd5b8051610b07610a8e82610d1a565b818152856020838501011115610b1b578384fd5b6107a2826020830160208601610d66565b60008060408385031215610b3e578182fd5b50508035926020909101359150565b60008151808452610b65816020860160208601610d66565b601f01601f19169290920160200192915050565b60008251610b8b818460208701610d66565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060018060a01b0385168252836020830152606060408301526107a26060830184610b4d565b901515815260200190565b90815260200190565b6001600160e01b031991909116815260200190565b6000602082526106666020830184610b4d565b6020808252601e908201527f73656e646572206d7573742062652062726964676520636f6e74726163740000604082015260600190565b60208082526024908201527f70726f766964656420636f6e7472616374206973206e6f742077686974656c696040820152631cdd195960e21b606082015260800190565b60208082526028908201527f70726f766964656420746f6b656e41646472657373206973206e6f74207768696040820152671d195b1a5cdd195960c21b606082015260800190565b60405181810167ffffffffffffffff81118282101715610d1257600080fd5b604052919050565b600067ffffffffffffffff821115610d30578081fd5b50601f01601f191660200190565b60008085851115610d4d578182fd5b83861115610d59578182fd5b5050820193919092039150565b60005b83811015610d81578181015183820152602001610d69565b838111156101dd5750506000910152565b6001600160a01b03811681146101a657600080fdfea2646970667358221220c259b19f4e3d5dd38a63e4ece7212eddbb4aa75067017ab1b11d428ce9d4c10f64736f6c634300060c0033",
"deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80637f79bea8116100665780637f79bea81461011c578063b07e54bb1461012f578063b8fa37361461014f578063c8ba6c8714610162578063e248cff2146101825761009e565b806307b7ed99146100a35780630968f264146100b85780630a6d55d8146100cb578063318c136e146100f45780636a70d081146100fc575b600080fd5b6100b66100b13660046108e0565b610195565b005b6100b66100c6366004610a49565b6101a9565b6100de6100d936600461095e565b6101e3565b6040516100eb9190610b95565b60405180910390f35b6100de6101fe565b61010f61010a3660046108e0565b610222565b6040516100eb9190610bf4565b61010f61012a3660046108e0565b610237565b61014261013d3660046109a5565b61024c565b6040516100eb9190610c1d565b6100b661015d366004610976565b6103a0565b6101756101703660046108e0565b6103b6565b6040516100eb9190610bff565b6100b66101903660046109ff565b6103c8565b61019d610539565b6101a681610583565b50565b6101b1610539565b6000806000838060200190518101906101ca91906108fc565b919450925090506101dd833084846105df565b50505050565b6000602081905290815260409020546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6060610256610539565b60006102648385018561095e565b600087815260208181526040808320546001600160a01b03168084526002909252909120549192509060ff166102b55760405162461bcd60e51b81526004016102ac90610cab565b60405180910390fd5b6102cf6001600160a01b038216635b5e139f60e01b61064a565b1561035a5760405163c87b56dd60e01b815281906001600160a01b0382169063c87b56dd90610302908690600401610bff565b60006040518083038186803b15801561031a57600080fd5b505afa15801561032e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103569190810190610ac2565b9350505b6001600160a01b03811660009081526003602052604090205460ff161561038a57610385818361066d565b610396565b610396818730856105df565b5050949350505050565b6103a8610539565b6103b282826106d2565b5050565b60016020526000908152604090205481565b6103d0610539565b60008060608180826103e487890189610b2c565b9096509450604080860193506103fd908490898b610d3e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509296506104439250899150859050818b610d3e565b810190610450919061095e565b915061046660208484018101908501898b610d3e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506020898101518f83528282526040808420546001600160a01b0316808552600290935290922054959650909490935060ff1691506104e890505760405162461bcd60e51b81526004016102ac90610cab565b6001600160a01b03811660009081526003602052604090205460ff161561051d57610518818360601c8a8661071f565b61052c565b61052c81308460601c8b6105df565b5050505050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105815760405162461bcd60e51b81526004016102ac90610c30565b565b6001600160a01b03811660009081526002602052604090205460ff166105bb5760405162461bcd60e51b81526004016102ac90610c67565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6040516323b872dd60e01b815284906001600160a01b038216906323b872dd9061061190879087908790600401610ba9565b600060405180830381600087803b15801561062b57600080fd5b505af115801561063f573d6000803e3d6000fd5b505050505050505050565b600061065583610751565b801561066657506106668383610785565b9392505050565b604051630852cd8d60e31b815282906001600160a01b038216906342966c689061069b908590600401610bff565b600060405180830381600087803b1580156106b557600080fd5b505af11580156106c9573d6000803e3d6000fd5b50505050505050565b60008281526020818152604080832080546001600160a01b039095166001600160a01b0319909516851790559282526001808252838320949094556002905220805460ff19169091179055565b6040516334ff261960e21b815284906001600160a01b0382169063d3fc98649061061190879087908790600401610bcd565b6000610764826301ffc9a760e01b610785565b801561077f575061077d826001600160e01b0319610785565b155b92915050565b600080600061079485856107ab565b915091508180156107a25750805b95945050505050565b60008060606301ffc9a760e01b846040516024016107c99190610c08565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060866001600160a01b03166175308460405161081d9190610b79565b6000604051808303818686fa925050503d8060008114610859576040519150601f19603f3d011682016040523d82523d6000602084013e61085e565b606091505b509150915060208151101561087c5760008094509450505050610899565b8181806020019051810190610891919061093e565b945094505050505b9250929050565b60008083601f8401126108b1578182fd5b50813567ffffffffffffffff8111156108c8578182fd5b60208301915083602082850101111561089957600080fd5b6000602082840312156108f1578081fd5b813561066681610d92565b600080600060608486031215610910578182fd5b835161091b81610d92565b602085015190935061092c81610d92565b80925050604084015190509250925092565b60006020828403121561094f578081fd5b81518015158114610666578182fd5b60006020828403121561096f578081fd5b5035919050565b60008060408385031215610988578182fd5b82359150602083013561099a81610d92565b809150509250929050565b600080600080606085870312156109ba578081fd5b8435935060208501356109cc81610d92565b9250604085013567ffffffffffffffff8111156109e7578182fd5b6109f3878288016108a0565b95989497509550505050565b600080600060408486031215610a13578283fd5b83359250602084013567ffffffffffffffff811115610a30578283fd5b610a3c868287016108a0565b9497909650939450505050565b600060208284031215610a5a578081fd5b813567ffffffffffffffff811115610a70578182fd5b8201601f81018413610a80578182fd5b8035610a93610a8e82610d1a565b610cf3565b818152856020838501011115610aa7578384fd5b81602084016020830137908101602001929092525092915050565b600060208284031215610ad3578081fd5b815167ffffffffffffffff811115610ae9578182fd5b8201601f81018413610af9578182fd5b8051610b07610a8e82610d1a565b818152856020838501011115610b1b578384fd5b6107a2826020830160208601610d66565b60008060408385031215610b3e578182fd5b50508035926020909101359150565b60008151808452610b65816020860160208601610d66565b601f01601f19169290920160200192915050565b60008251610b8b818460208701610d66565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060018060a01b0385168252836020830152606060408301526107a26060830184610b4d565b901515815260200190565b90815260200190565b6001600160e01b031991909116815260200190565b6000602082526106666020830184610b4d565b6020808252601e908201527f73656e646572206d7573742062652062726964676520636f6e74726163740000604082015260600190565b60208082526024908201527f70726f766964656420636f6e7472616374206973206e6f742077686974656c696040820152631cdd195960e21b606082015260800190565b60208082526028908201527f70726f766964656420746f6b656e41646472657373206973206e6f74207768696040820152671d195b1a5cdd195960c21b606082015260800190565b60405181810167ffffffffffffffff81118282101715610d1257600080fd5b604052919050565b600067ffffffffffffffff821115610d30578081fd5b50601f01601f191660200190565b60008085851115610d4d578182fd5b83861115610d59578182fd5b5050820193919092039150565b60005b83811015610d81578181015183820152602001610d69565b838111156101dd5750506000910152565b6001600160a01b03811681146101a657600080fdfea2646970667358221220c259b19f4e3d5dd38a63e4ece7212eddbb4aa75067017ab1b11d428ce9d4c10f64736f6c634300060c0033",
"immutableReferences": {
"9652": [
{
"length": 32,
"start": 512
},
{
"length": 32,
"start": 1348
}
]
},
"sourceMap": "512:5426:46:-:0;;;789:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1045:30:48;;-1:-1:-1;;;;;;1045:30:48;;;512:5426:46;;146:263:-1;;261:2;249:9;240:7;236:23;232:32;229:2;;;-1:-1;;267:12;229:2;83:13;;-1:-1;;;;;576:54;;701:35;;691:2;;-1:-1;;740:12;691:2;319:74;223:186;-1:-1;;;223:186::o;:::-;512:5426:46;;;;;;;;;;;",
"deployedSourceMap": "512:5426:46:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2170:120:48;;;;;;:::i;:::-;;:::i;:::-;;5621:315:46;;;;;;:::i;:::-;;:::i;408:69:48:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;318:39;;;:::i;755:42::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;652:51::-;;;;;;:::i;:::-;;:::i;1908:938:46:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1774:154:48:-;;;;;;:::i;:::-;;:::i;528:69::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3852:1275:46:-;;;;;;:::i;:::-;;:::i;2170:120:48:-;836:13;:11;:13::i;:::-;2254:29:::1;2267:15;2254:12;:29::i;:::-;2170:120:::0;:::o;5621:315:46:-;836:13:48;:11;:13::i;:::-;5697:20:46::1;5727:17:::0;5754:12:::1;5825:4;5814:42;;;;;;;;;;;;:::i;:::-;5777:79:::0;;-1:-1:-1;5777:79:46;-1:-1:-1;5777:79:46;-1:-1:-1;5867:62:46::1;5777:79:::0;5903:4:::1;5777:79:::0;;5867:13:::1;:62::i;:::-;859:1:48;;;5621:315:46::0;:::o;408:69:48:-;;;;;;;;;;;;;-1:-1:-1;;;;;408:69:48;;:::o;318:39::-;;;:::o;755:42::-;;;;;;;;;;;;;;;:::o;652:51::-;;;;;;;;;;;;;;;:::o;1908:938:46:-;2097:21;836:13:48;:11;:13::i;:::-;2130:20:46::1;2173:24;::::0;;::::1;2184:4:::0;2173:24:::1;:::i;:::-;2208:20;2231:45:::0;;;::::1;::::0;;;;;;;;-1:-1:-1;;;;;2231:45:46::1;2294:32:::0;;;:18:::1;:32:::0;;;;;;;2161:36;;-1:-1:-1;2231:45:46;2294:32:::1;;2286:85;;;;-1:-1:-1::0;;;2286:85:46::1;;;;;;;:::i;:::-;;;;;;;;;2458:58;-1:-1:-1::0;;;;;2458:30:46;::::1;-1:-1:-1::0;;;2458:30:46::1;:58::i;:::-;2454:199;;;2617:24;::::0;-1:-1:-1;;;2617:24:46;;2573:12;;-1:-1:-1;;;;;2617:15:46;::::1;::::0;::::1;::::0;:24:::1;::::0;2633:7;;2617:24:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;2617:24:46::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;2600:42;;2454:199;;-1:-1:-1::0;;;;;2667:23:46;::::1;;::::0;;;:9:::1;:23;::::0;;;;;::::1;;2663:177;;;2706:33;2717:12;2731:7;2706:10;:33::i;:::-;2663:177;;;2770:59;2781:12;2795:9;2814:4;2821:7;2770:10;:59::i;:::-;859:1:48;;1908:938:46::0;;;;;;:::o;1774:154:48:-;836:13;:11;:13::i;:::-;1880:41:::1;1893:10;1905:15;1880:12;:41::i;:::-;1774:154:::0;;:::o;528:69::-;;;;;;;;;;;;;:::o;3852:1275:46:-;836:13:48;:11;:13::i;:::-;3957:20:46::1;::::0;4040:40:::1;3957:20:::0;;4040:40;4237:30:::1;::::0;;::::1;4248:4:::0;4237:30:::1;:::i;:::-;4193:74:::0;;-1:-1:-1;4193:74:46;-1:-1:-1;4294:2:46::1;:35:::0;;::::1;::::0;-1:-1:-1;4375:23:46::1;::::0;4294:35;;4375:4;;:23:::1;:::i;:::-;4339:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;4339:60:46;;-1:-1:-1;4434:21:46::1;::::0;-1:-1:-1;4434:4:46;;-1:-1:-1;4439:14:46;;-1:-1:-1;4434:4:46;;:21:::1;:::i;:::-;4423:41;;;;;;;:::i;:::-;4409:55:::0;-1:-1:-1;4491:59:46::1;4513:2;4516:33:::0;;;;;;4496:19;::::1;4491:4:::0;;:59:::1;:::i;:::-;4474:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;4679:4:46::1;4646:38:::0;;::::1;4640:45:::0;4728;;;;;;;;;;;-1:-1:-1;;;;;4728:45:46::1;4791:41:::0;;;:18:::1;:41:::0;;;;;;;4474:77;;-1:-1:-1;4640:45:46;;4728;;-1:-1:-1;4791:41:46::1;;::::0;-1:-1:-1;4783:94:46::1;::::0;-1:-1:-1;4783:94:46::1;;;-1:-1:-1::0;;;4783:94:46::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4892:23:46;::::1;;::::0;;;:9:::1;:23;::::0;;;;;::::1;;4888:233;;;4931:70;4942:12;4964:16;4956:25;;4983:7;4992:8;4931:10;:70::i;:::-;4888:233;;;5032:78;5046:12;5068:4;5083:16;5075:25;;5102:7;5032:13;:78::i;:::-;859:1:48;;;;;;;;3852:1275:46::0;;;:::o;1088:124:48:-;1142:10;-1:-1:-1;;;;;1156:14:48;1142:28;;1134:71;;;;-1:-1:-1;;;1134:71:48;;;;;;;:::i;:::-;1088:124::o;2655:200::-;-1:-1:-1;;;;;2729:35:48;;;;;;:18;:35;;;;;;;;2721:84;;;;-1:-1:-1;;;2721:84:48;;;;;;;:::i;:::-;-1:-1:-1;;;;;2815:26:48;;;;;:9;:26;;;;;:33;;-1:-1:-1;;2815:33:48;2844:4;2815:33;;;2655:200::o;1228:216:40:-;1391:46;;-1:-1:-1;;;1391:46:40;;1368:12;;-1:-1:-1;;;;;1391:19:40;;;;;:46;;1411:5;;1418:9;;1429:7;;1391:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1228:216;;;;;:::o;1358:286:3:-;1445:4;1552:23;1567:7;1552:14;:23::i;:::-;:85;;;;;1591:46;1616:7;1625:11;1591:24;:46::i;:::-;1545:92;1358:286;-1:-1:-1;;;1358:286:3:o;2133:187:40:-;2293:20;;-1:-1:-1;;;2293:20:40;;2270:12;;-1:-1:-1;;;;;2293:11:40;;;;;:20;;2305:7;;2293:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2133:187;;;:::o;2367:282:48:-;2453:33;:45;;;;;;;;;;;:63;;-1:-1:-1;;;;;2453:63:48;;;-1:-1:-1;;;;;;2453:63:48;;;;;;;2526:50;;;2453:63;2526:50;;;;;;:63;;;;2600:18;:35;;;:42;;-1:-1:-1;;2600:42:48;;;;;;2367:282::o;1724:250:40:-;1922:45;;-1:-1:-1;;;1922:45:40;;1899:12;;-1:-1:-1;;;;;1922:11:40;;;;;:45;;1934:9;;1945:7;;1961:4;;1922:45;;;:::i;746:394:3:-;810:4;1005:55;1030:7;-1:-1:-1;;;1005:24:3;:55::i;:::-;:128;;;;-1:-1:-1;1077:56:3;1102:7;-1:-1:-1;;;;;;1077:24:3;:56::i;:::-;1076:57;1005:128;998:135;746:394;-1:-1:-1;;746:394:3:o;4232:395::-;4325:4;4504:12;4518:11;4533:50;4562:7;4571:11;4533:28;:50::i;:::-;4503:80;;;;4602:7;:17;;;;;4613:6;4602:17;4594:26;4232:395;-1:-1:-1;;;;;4232:395:3:o;5144:444::-;5265:4;5271;5291:26;641:10;5343:20;;5365:11;5320:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;5320:57:3;;;;;;;-1:-1:-1;;;;;5320:57:3;;;;;;;;;;;5291:86;;5388:12;5402:19;5425:7;-1:-1:-1;;;;;5425:18:3;5450:5;5458:13;5425:47;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5387:85;;;;5502:2;5486:6;:13;:18;5482:45;;;5514:5;5521;5506:21;;;;;;;;;5482:45;5545:7;5565:6;5554:26;;;;;;;;;;;;:::i;:::-;5537:44;;;;;;;5144:444;;;;;;:::o;585:336:-1:-;;;699:3;692:4;684:6;680:17;676:27;666:2;;-1:-1;;707:12;666:2;-1:-1;737:20;;777:18;766:30;;763:2;;;-1:-1;;799:12;763:2;843:4;835:6;831:17;819:29;;894:3;843:4;874:17;835:6;860:32;;857:41;854:2;;;911:1;;901:12;2109:241;;2213:2;2201:9;2192:7;2188:23;2184:32;2181:2;;;-1:-1;;2219:12;2181:2;85:6;72:20;97:33;124:5;97:33;:::i;2357:567::-;;;;2522:2;2510:9;2501:7;2497:23;2493:32;2490:2;;;-1:-1;;2528:12;2490:2;234:6;228:13;246:41;281:5;246:41;:::i;:::-;2699:2;2757:22;;228:13;2580:82;;-1:-1;246:41;228:13;246:41;:::i;:::-;2707:82;;;;2826:2;2880:9;2876:22;2046:13;2834:74;;2484:440;;;;;:::o;2931:257::-;;3043:2;3031:9;3022:7;3018:23;3014:32;3011:2;;;-1:-1;;3049:12;3011:2;380:6;374:13;16630:5;15286:13;15279:21;16608:5;16605:32;16595:2;;-1:-1;;16641:12;3195:241;;3299:2;3287:9;3278:7;3274:23;3270:32;3267:2;;;-1:-1;;3305:12;3267:2;-1:-1;501:20;;3261:175;-1:-1;3261:175::o;3443:366::-;;;3564:2;3552:9;3543:7;3539:23;3535:32;3532:2;;;-1:-1;;3570:12;3532:2;514:6;501:20;3622:63;;3722:2;3765:9;3761:22;72:20;97:33;124:5;97:33;:::i;:::-;3730:63;;;;3526:283;;;;;:::o;3816:615::-;;;;;3973:2;3961:9;3952:7;3948:23;3944:32;3941:2;;;-1:-1;;3979:12;3941:2;514:6;501:20;4031:63;;4131:2;4174:9;4170:22;72:20;97:33;124:5;97:33;:::i;:::-;4139:63;-1:-1;4267:2;4252:18;;4239:32;4291:18;4280:30;;4277:2;;;-1:-1;;4313:12;4277:2;4351:64;4407:7;4398:6;4387:9;4383:22;4351:64;:::i;:::-;3935:496;;;;-1:-1;4333:82;-1:-1;;;;3935:496::o;4438:490::-;;;;4578:2;4566:9;4557:7;4553:23;4549:32;4546:2;;;-1:-1;;4584:12;4546:2;514:6;501:20;4636:63;;4764:2;4753:9;4749:18;4736:32;4788:18;4780:6;4777:30;4774:2;;;-1:-1;;4810:12;4774:2;4848:64;4904:7;4895:6;4884:9;4880:22;4848:64;:::i;:::-;4540:388;;4830:82;;-1:-1;4830:82;;-1:-1;;;;4540:388::o;4935:345::-;;5048:2;5036:9;5027:7;5023:23;5019:32;5016:2;;;-1:-1;;5054:12;5016:2;5112:17;5099:31;5150:18;5142:6;5139:30;5136:2;;;-1:-1;;5172:12;5136:2;5232:22;;1024:4;1012:17;;1008:27;-1:-1;998:2;;-1:-1;;1039:12;998:2;1086:6;1073:20;1108:64;1123:48;1164:6;1123:48;:::i;:::-;1108:64;:::i;:::-;1192:6;1185:5;1178:21;1296:3;5048:2;1287:6;1220;1278:16;;1275:25;1272:2;;;-1:-1;;1303:12;1272:2;15831:6;5048:2;1220:6;1216:17;5048:2;1254:5;1250:16;15808:30;15869:16;;;5048:2;15869:16;15862:27;;;;-1:-1;1254:5;5010:270;-1:-1;;5010:270::o;5287:362::-;;5412:2;5400:9;5391:7;5387:23;5383:32;5380:2;;;-1:-1;;5418:12;5380:2;5469:17;5463:24;5507:18;5499:6;5496:30;5493:2;;;-1:-1;;5529:12;5493:2;5601:22;;1485:4;1473:17;;1469:27;-1:-1;1459:2;;-1:-1;;1500:12;1459:2;1540:6;1534:13;1562:65;1577:49;1619:6;1577:49;:::i;1562:65::-;1647:6;1640:5;1633:21;1751:3;5412:2;1742:6;1675;1733:16;;1730:25;1727:2;;;-1:-1;;1758:12;1727:2;1778:39;1810:6;5412:2;1709:5;1705:16;5412:2;1675:6;1671:17;1778:39;:::i;5904:366::-;;;6025:2;6013:9;6004:7;6000:23;5996:32;5993:2;;;-1:-1;;6031:12;5993:2;-1:-1;;1898:20;;;6183:2;6222:22;;;1898:20;;-1:-1;5987:283::o;6745:343::-;;6887:5;14025:12;14310:6;14305:3;14298:19;6980:52;7025:6;14347:4;14342:3;14338:14;14347:4;7006:5;7002:16;6980:52;:::i;:::-;16264:7;16248:14;-1:-1;;16244:28;7044:39;;;;14347:4;7044:39;;6835:253;-1:-1;;6835:253::o;9039:271::-;;7255:5;14025:12;7366:52;7411:6;7406:3;7399:4;7392:5;7388:16;7366:52;:::i;:::-;7430:16;;;;;9173:137;-1:-1;;9173:137::o;9317:222::-;-1:-1;;;;;15604:54;;;;6348:37;;9444:2;9429:18;;9415:124::o;9546:444::-;-1:-1;;;;;15604:54;;;6348:37;;15604:54;;;;9893:2;9878:18;;6348:37;9976:2;9961:18;;6579:37;;;;9729:2;9714:18;;9700:290::o;9997:532::-;;777:18;;15615:42;;;15608:5;15604:54;6355:3;6348:37;6609:5;10364:2;10353:9;10349:18;6579:37;10200:2;10401;10390:9;10386:18;10379:48;10441:78;10200:2;10189:9;10185:18;10505:6;10441:78;:::i;10536:210::-;15286:13;;15279:21;6462:34;;10657:2;10642:18;;10628:118::o;10753:222::-;6579:37;;;10880:2;10865:18;;10851:124::o;10982:218::-;-1:-1;;;;;;15452:78;;;;6697:36;;11107:2;11092:18;;11078:122::o;11207:306::-;;11352:2;11373:17;11366:47;11427:76;11352:2;11341:9;11337:18;11489:6;11427:76;:::i;11520:416::-;11720:2;11734:47;;;8037:2;11705:18;;;14298:19;8073:32;14338:14;;;8053:53;8125:12;;;11691:245::o;11943:416::-;12143:2;12157:47;;;8376:2;12128:18;;;14298:19;8412:34;14338:14;;;8392:55;-1:-1;;;8467:12;;;8460:28;8507:12;;;12114:245::o;12366:416::-;12566:2;12580:47;;;8758:2;12551:18;;;14298:19;8794:34;14338:14;;;8774:55;-1:-1;;;8849:12;;;8842:32;8893:12;;;12537:245::o;13018:256::-;13080:2;13074:9;13106:17;;;13181:18;13166:34;;13202:22;;;13163:62;13160:2;;;13238:1;;13228:12;13160:2;13080;13247:22;13058:216;;-1:-1;13058:216::o;13281:321::-;;13424:18;13416:6;13413:30;13410:2;;;-1:-1;;13446:12;13410:2;-1:-1;16264:7;13500:17;-1:-1;;13496:33;13587:4;13577:15;;13347:255::o;14691:318::-;;;14841:8;14829:10;14826:24;14823:2;;;-1:-1;;14853:12;14823:2;14888:6;14878:8;14875:20;14872:2;;;-1:-1;;14898:12;14872:2;-1:-1;;14930:31;;;14979:25;;;;;-1:-1;14817:192::o;15904:268::-;15969:1;15976:101;15990:6;15987:1;15984:13;15976:101;;;16057:11;;;16051:18;16038:11;;;16031:39;16012:2;16005:10;15976:101;;;16092:6;16089:1;16086:13;16083:2;;;-1:-1;;15969:1;16139:16;;16132:27;15953:219::o;16285:117::-;-1:-1;;;;;15604:54;;16344:35;;16334:2;;16393:1;;16383:12",
"source": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\n\nimport \"../interfaces/IDepositExecute.sol\";\nimport \"./HandlerHelpers.sol\";\nimport \"../ERC721Safe.sol\";\nimport \"@openzeppelin/contracts/introspection/ERC165Checker.sol\";\nimport \"@openzeppelin/contracts/token/ERC721/IERC721Metadata.sol\";\n\n\n/**\n @title Handles ERC721 deposits and deposit executions.\n @author ChainSafe Systems.\n @notice This contract is intended to be used with the Bridge contract.\n */\ncontract ERC721Handler is IDepositExecute, HandlerHelpers, ERC721Safe {\n using ERC165Checker for address;\n\n bytes4 private constant _INTERFACE_ERC721_METADATA = 0x5b5e139f;\n\n /**\n @param bridgeAddress Contract address of previously deployed Bridge.\n */\n constructor(\n address bridgeAddress\n ) public HandlerHelpers(bridgeAddress) {\n }\n\n /**\n @notice A deposit is initiatied by making a deposit in the Bridge contract.\n @param resourceID ResourceID used to find address of token to be used for deposit.\n @param depositer Address of account making the deposit in the Bridge contract.\n @param data Consists of {tokenID} padded to 32 bytes.\n @notice Data passed into the function should be constructed as follows:\n tokenID uint256 bytes 0 - 32\n @notice If the corresponding {tokenAddress} for the parsed {resourceID} supports {_INTERFACE_ERC721_METADATA},\n then {metaData} will be set according to the {tokenURI} method in the token contract.\n @dev Depending if the corresponding {tokenAddress} for the parsed {resourceID} is\n marked true in {_burnList}, deposited tokens will be burned, if not, they will be locked.\n @return metaData : the deposited token metadata acquired by calling a {tokenURI} method in the token contract.\n */\n function deposit(bytes32 resourceID,\n address depositer,\n bytes calldata data\n ) external override onlyBridge returns (bytes memory metaData) {\n uint tokenID;\n\n (tokenID) = abi.decode(data, (uint));\n\n address tokenAddress = _resourceIDToTokenContractAddress[resourceID];\n require(_contractWhitelist[tokenAddress], \"provided tokenAddress is not whitelisted\");\n\n // Check if the contract supports metadata, fetch it if it does\n if (tokenAddress.supportsInterface(_INTERFACE_ERC721_METADATA)) {\n IERC721Metadata erc721 = IERC721Metadata(tokenAddress);\n metaData = bytes(erc721.tokenURI(tokenID));\n }\n\n if (_burnList[tokenAddress]) {\n burnERC721(tokenAddress, tokenID);\n } else {\n lockERC721(tokenAddress, depositer, address(this), tokenID);\n }\n }\n\n /**\n @notice Proposal execution should be initiated when a proposal is finalized in the Bridge contract.\n by a relayer on the deposit's destination chain.\n @param data Consists of {tokenID}, {resourceID}, {lenDestinationRecipientAddress},\n {destinationRecipientAddress}, {lenMeta}, and {metaData} all padded to 32 bytes.\n @notice Data passed into the function should be constructed as follows:\n tokenID uint256 bytes 0 - 32\n destinationRecipientAddress length uint256 bytes 32 - 64\n destinationRecipientAddress bytes bytes 64 - (64 + len(destinationRecipientAddress))\n metadata length uint256 bytes (64 + len(destinationRecipientAddress)) - (64 + len(destinationRecipientAddress) + 32)\n metadata bytes bytes (64 + len(destinationRecipientAddress) + 32) - END\n */\n function executeProposal(bytes32 resourceID, bytes calldata data) external override onlyBridge {\n uint tokenID;\n uint lenDestinationRecipientAddress;\n bytes memory destinationRecipientAddress;\n uint offsetMetaData;\n uint lenMetaData;\n bytes memory metaData;\n\n (tokenID, lenDestinationRecipientAddress) = abi.decode(data, (uint, uint));\n offsetMetaData = 64 + lenDestinationRecipientAddress;\n destinationRecipientAddress = bytes(data[64:offsetMetaData]);\n lenMetaData = abi.decode(data[offsetMetaData:], (uint));\n metaData = bytes(data[offsetMetaData + 32:offsetMetaData + 32 + lenMetaData]);\n\n bytes20 recipientAddress;\n\n assembly {\n recipientAddress := mload(add(destinationRecipientAddress, 0x20))\n }\n\n address tokenAddress = _resourceIDToTokenContractAddress[resourceID];\n require(_contractWhitelist[address(tokenAddress)], \"provided tokenAddress is not whitelisted\");\n\n if (_burnList[tokenAddress]) {\n mintERC721(tokenAddress, address(recipientAddress), tokenID, metaData);\n } else {\n releaseERC721(tokenAddress, address(this), address(recipientAddress), tokenID);\n }\n }\n\n /**\n @notice Used to manually release ERC721 tokens from ERC721Safe.\n @param data Consists of {tokenAddress}, {recipient}, and {tokenID} all padded to 32 bytes.\n @notice Data passed into the function should be constructed as follows:\n tokenAddress address bytes 0 - 32\n recipient address bytes 32 - 64\n tokenID uint bytes 64 - 96\n