[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AddressIsZero", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "fishId", "type": "uint256" } ], "name": "CannotWrapFish", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ERC1155InsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC1155InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "idsLength", "type": "uint256" }, { "internalType": "uint256", "name": "valuesLength", "type": "uint256" } ], "name": "ERC1155InvalidArrayLength", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" } ], "name": "ERC1155InvalidOperator", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC1155InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC1155InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "address", "name": "owner", "type": "address" } ], "name": "ERC1155MissingApprovalForAll", "type": "error" }, { "inputs": [], "name": "FailedSendingETH", "type": "error" }, { "inputs": [], "name": "FishAlreadyWrapped", "type": "error" }, { "inputs": [], "name": "InsufficientNativeWrapFee", "type": "error" }, { "inputs": [], "name": "InsufficientWrappedTokenReserves", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "OwnableInvalidOwner", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "OwnableUnauthorizedAccount", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "nativeWeight", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenWeight", "type": "uint256" } ], "name": "AddFeeRecipient", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenWrapAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenWrapAmountAfterWrapFee", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "disallowWrap", "type": "bool" } ], "name": "AddFish", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "disallowWrap", "type": "bool" } ], "name": "DisallowWrap", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenWrapAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenWrapAmountAfterWrapFee", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "disallowWrap", "type": "bool" } ], "name": "FishModified", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "index", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "nativeWeight", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenWeight", "type": "uint256" } ], "name": "ModifyFeeRecipient", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "indexed": false, "internalType": "uint256[]", "name": "values", "type": "uint256[]" } ], "name": "TransferBatch", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "TransferSingle", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "string", "name": "value", "type": "string" }, { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "URI", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "fishId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "UnwrapFish", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "fishId", "type": "uint256" } ], "name": "WrapFish", "type": "event" }, { "stateMutability": "payable", "type": "fallback" }, { "inputs": [ { "internalType": "address", "name": "_recipient", "type": "address" }, { "internalType": "uint256", "name": "_nativeWeight", "type": "uint256" }, { "internalType": "uint256", "name": "_tokenWeight", "type": "uint256" } ], "name": "addFeeRecipient", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenWrapAmount", "type": "uint256" }, { "internalType": "bool", "name": "_disallowWrap", "type": "bool" } ], "name": "addFish", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "accounts", "type": "address[]" }, { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" } ], "name": "balanceOfBatch", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_id", "type": "uint256" }, { "internalType": "bool", "name": "_disallowWrap", "type": "bool" } ], "name": "disallowWrap", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "distributeNativeFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "distributeTokenFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "exists", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "feeRecipients", "outputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "nativeWeight", "type": "uint256" }, { "internalType": "uint256", "name": "tokenWeight", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "fish", "outputs": [ { "internalType": "uint256", "name": "tokenWrapAmount", "type": "uint256" }, { "internalType": "uint256", "name": "tokenWrapAmountAfterWrapFee", "type": "uint256" }, { "internalType": "bool", "name": "disallowWrap", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "fishCount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getDistributionTokenAddress", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_fishId", "type": "uint256" } ], "name": "getTokenWrapAmount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_fishId", "type": "uint256" } ], "name": "getTokenWrapAmountAfterFee", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getTokensWrapped", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "isApprovedForAll", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_index", "type": "uint256" }, { "internalType": "address", "name": "_recipient", "type": "address" }, { "internalType": "uint256", "name": "_nativeWeight", "type": "uint256" }, { "internalType": "uint256", "name": "_tokenWeight", "type": "uint256" } ], "name": "modifyFeeRecipient", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_id", "type": "uint256" }, { "internalType": "uint256", "name": "_tokenWrapAmount", "type": "uint256" }, { "internalType": "bool", "name": "_disallowWrap", "type": "bool" } ], "name": "modifyFish", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "nativeWrapFee", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "proxyToApproved", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "safeBatchTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "setApprovalForAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_nativeWrapFee", "type": "uint256" } ], "name": "setNativeWrapFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "proxyAddress", "type": "address" }, { "internalType": "bool", "name": "value", "type": "bool" } ], "name": "setProxyState", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenAddress", "type": "address" } ], "name": "setTokenAddress", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenUnwrapFee", "type": "uint256" } ], "name": "setTokenUnwrapFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenWrapFee", "type": "uint256" } ], "name": "setTokenWrapFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_wrapTokenAddress", "type": "address" } ], "name": "setWrapTokenAddress", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "tokenUnwrapFee", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "tokenWrapFee", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalNativeWeight", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalTokenWeight", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_fishId", "type": "uint256" } ], "name": "unwrapFish", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_fishId", "type": "uint256" }, { "internalType": "address", "name": "_recipient", "type": "address" } ], "name": "unwrapFishByProxy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "uri", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_fishId", "type": "uint256" } ], "name": "wrapFish", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_fishId", "type": "uint256" }, { "internalType": "address", "name": "_recipient", "type": "address" } ], "name": "wrapFishByProxy", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "wrapTokenAddress", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "wrappedTokenReserves", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ]
60806040523480156200001157600080fd5b5060408051602081019091526000815233906200002e8162000075565b506001600160a01b0381166200005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b620000698162000087565b5060fa600d556200024c565b600262000083828262000180565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200010457607f821691505b6020821081036200012557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200017b576000816000526020600020601f850160051c81016020861015620001565750805b601f850160051c820191505b81811015620001775782815560010162000162565b5050505b505050565b81516001600160401b038111156200019c576200019c620000d9565b620001b481620001ad8454620000ef565b846200012b565b602080601f831160018114620001ec5760008415620001d35750858301515b600019600386901b1c1916600185901b17855562000177565b600085815260208120601f198616915b828110156200021d57888601518255948401946001909101908401620001fc565b50858210156200023c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612cab806200025c6000396000f3fe6080604052600436106102685760003560e01c80637341a9f111610143578063bc4c4547116100bb578063e985e9c511610077578063e985e9c5146107b5578063f155cd8c146107d5578063f242432a14610831578063f2fde38b14610851578063fd666e5b14610871578063fd95b6811461089157005b8063bc4c454714610706578063bd85b0391461071c578063c297e4ac14610749578063cacd3e381461075f578063cf83a13114610775578063d41d14c31461079557005b80638da5cb5b1161010a5780638da5cb5b146106435780639770e946146106615780639dc38c7d14610681578063a22cb465146106b1578063a8d9dba7146106d1578063b24f526c146106f157005b80637341a9f1146105b05780637c416daf146105d05780637dd2e641146105f0578063825c0ee01461061057806389ce91671461062357005b80633ebd04bb116101e15780635713e98c1161019d5780635713e98c146104f8578063606ed38e14610525578063673ac76e146105455780636975986d146105655780636d8fca511461057b578063715018a61461059b57005b80633ebd04bb146103f9578063427945bd1461040f5780634cc6f6b4146104255780634e1273f4146104575780634f558e791461048457806351fe9eff146104b357005b806323a5f1fe1161023057806323a5f1fe146103465780632426b0181461036657806326a4e8d2146103865780632eb2c2d6146103a657806339d4db3b146103c65780633d6052de146103e657005b8062fdd58e1461027157806301ffc9a7146102a45780630cb45ce5146102d45780630e89341c1461030457806318160ddd1461033157005b3661026f57005b005b34801561027d57600080fd5b5061029161028c3660046124dc565b6108a7565b6040519081526020015b60405180910390f35b3480156102b057600080fd5b506102c46102bf36600461251c565b6108cf565b604051901515815260200161029b565b3480156102e057600080fd5b506102916102ef366004612540565b60009081526011602052604090206001015490565b34801561031057600080fd5b5061032461031f366004612540565b61091f565b60405161029b919061259f565b34801561033d57600080fd5b50600554610291565b34801561035257600080fd5b5061026f610361366004612540565b6109b3565b34801561037257600080fd5b5061026f610381366004612540565b6109c0565b34801561039257600080fd5b5061026f6103a13660046125b2565b6109cd565b3480156103b257600080fd5b5061026f6103c1366004612717565b6109e1565b3480156103d257600080fd5b5061026f6103e13660046127cf565b610a4d565b61026f6103f4366004612540565b610ab1565b34801561040557600080fd5b5061029160085481565b34801561041b57600080fd5b50610291600d5481565b34801561043157600080fd5b506009546001600160a01b03165b6040516001600160a01b03909116815260200161029b565b34801561046357600080fd5b506104776104723660046127ff565b610af6565b60405161029b91906128fb565b34801561049057600080fd5b506102c461049f366004612540565b600090815260046020526040902054151590565b3480156104bf57600080fd5b506104d36104ce366004612540565b610bc3565b604080516001600160a01b03909416845260208401929092529082015260600161029b565b34801561050457600080fd5b50610291610513366004612540565b60009081526011602052604090205490565b34801561053157600080fd5b50600b5461043f906001600160a01b031681565b34801561055157600080fd5b5061026f61056036600461290e565b610c00565b34801561057157600080fd5b50610291600f5481565b34801561058757600080fd5b5061026f610596366004612540565b610d7d565b3480156105a757600080fd5b5061026f610d86565b3480156105bc57600080fd5b5061026f6105cb366004612949565b610d9a565b3480156105dc57600080fd5b5061026f6105eb3660046125b2565b610f09565b3480156105fc57600080fd5b5061026f61060b366004612540565b610f83565b61026f61061e36600461297c565b610f8d565b34801561062f57600080fd5b5061026f61063e36600461297c565b610fe3565b34801561064f57600080fd5b506003546001600160a01b031661043f565b34801561066d57600080fd5b5061026f61067c366004612540565b611039565b34801561068d57600080fd5b506102c461069c3660046125b2565b600a6020526000908152604090205460ff1681565b3480156106bd57600080fd5b5061026f6106cc3660046129a8565b611042565b3480156106dd57600080fd5b5061026f6106ec3660046129d4565b61104d565b3480156106fd57600080fd5b50600f54610291565b34801561071257600080fd5b50610291600e5481565b34801561072857600080fd5b50610291610737366004612540565b60009081526004602052604090205490565b34801561075557600080fd5b5061029160105481565b34801561076b57600080fd5b5061029160075481565b34801561078157600080fd5b5061026f610790366004612540565b611141565b3480156107a157600080fd5b5061026f6107b03660046129a8565b6111c2565b3480156107c157600080fd5b506102c46107d0366004612a0d565b6111f5565b3480156107e157600080fd5b506108146107f0366004612540565b60116020526000908152604090208054600182015460029092015490919060ff1683565b60408051938452602084019290925215159082015260600161029b565b34801561083d57600080fd5b5061026f61084c366004612a37565b611223565b34801561085d57600080fd5b5061026f61086c3660046125b2565b611282565b34801561087d57600080fd5b5061026f61088c3660046127cf565b6112bd565b34801561089d57600080fd5b50610291600c5481565b6000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061090057506001600160e01b031982166303a24d0760e21b145b806108c957506301ffc9a760e01b6001600160e01b03198316146108c9565b60606002805461092e90612a9c565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90612a9c565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b50505050509050919050565b6109bb611399565b600c55565b6109c8611399565b600d55565b6109d5611399565b6109de816113c6565b50565b336001600160a01b0386168114801590610a025750610a0086826111f5565b155b15610a385760405163711bec9160e11b81526001600160a01b038083166004830152871660248201526044015b60405180910390fd5b610a458686868686611411565b505050505050565b610a55611399565b600082815260116020908152604091829020600201805460ff19168415159081179091558251858152918201527fb503d2d45b99edd326b17ab14b45ecb6f09905530c02ada61c00980d1d600ea2910160405180910390a15050565b6000818152601160205260409020600281015460ff1615610ae857604051630ba42cf360e21b815260048101839052602401610a2f565b610af28233611478565b5050565b60608151835114610b275781518351604051635b05999160e01b815260048101929092526024820152604401610a2f565b6000835167ffffffffffffffff811115610b4357610b436125cd565b604051908082528060200260200182016040528015610b6c578160200160208202803683370190505b50905060005b8451811015610bbb57602080820286010151610b96906020808402870101516108a7565b828281518110610ba857610ba8612ad6565b6020908102919091010152600101610b72565b509392505050565b60068181548110610bd357600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116925083565b610c08611399565b826001600160a01b038116610c305760405163867915ab60e01b815260040160405180910390fd5b8260068681548110610c4457610c44612ad6565b906000526020600020906003020160010154600754610c639190612b02565b610c6d9190612b15565b6007819055508160068681548110610c8757610c87612ad6565b906000526020600020906003020160020154600854610ca69190612b02565b610cb09190612b15565b600855604080516060810182526001600160a01b0386168152602081018590529081018390526006805487908110610cea57610cea612ad6565b600091825260209182902083516003929092020180546001600160a01b0319166001600160a01b03928316178155838301516001820155604093840151600290910155825188815290871691810191909152908101849052606081018390527f822d51525d88c0fedfe943d7b56da9cc3b13c935d69b2bf573d5f3e1b3dd60649060800160405180910390a15050505050565b6109de8161167f565b610d8e611399565b610d9860006119d4565b565b610da2611399565b826001600160a01b038116610dca5760405163867915ab60e01b815260040160405180910390fd5b604080516060810182526001600160a01b0386811682526020820186815292820185815260068054600181018255600091825293517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f600390950294850180546001600160a01b031916919094161790925592517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4083015591517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d419091015560078054859290610e9b908490612b15565b925050819055508160086000828254610eb49190612b15565b9091555050604080516001600160a01b0386168152602081018590529081018390527f6e8435c2883c51ced34a07ecce7a92a4506c7b517ab61561ebde3108ecf767899060600160405180910390a150505050565b610f11611399565b806001600160a01b038116610f395760405163867915ab60e01b815260040160405180910390fd5b610f41611a26565b15610f5f5760405163527f315360e11b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b038416179055610af2826113c6565b6109de8133611a60565b336000908152600a602052604090205460ff16610fd95760405162461bcd60e51b815260206004820152600a6024820152694f6e6c792070726f787960b01b6044820152606401610a2f565b610af28282611478565b336000908152600a602052604090205460ff1661102f5760405162461bcd60e51b815260206004820152600a6024820152694f6e6c792070726f787960b01b6044820152606401610a2f565b610af28282611a60565b6109de81611b91565b610af2338383611d24565b611055611399565b600083815260046020526040902054156110825760405163527f315360e11b815260040160405180910390fd5b6000612710600e546127106110979190612b02565b6110a19085612b28565b6110ab9190612b3f565b6040805160608082018352868252602080830185815287151584860181815260008c815260118552879020955186559151600186015590516002909401805460ff19169415159490941790935583518881529081018590529283019190915291925085917f5fa26d55c39f30f43cd1ffd5ff9fd2fccbd8cad8d7eb5ebaa84f2be2ca26255791015b60405180910390a250505050565b611149611399565b611151611a26565b1561116f5760405163527f315360e11b815260040160405180910390fd5b600e81905560005b601054811015610af2576000818152601160205260409020600e54612710906111a09082612b02565b82546111ac9190612b28565b6111b69190612b3f565b60019182015501611177565b6111ca611399565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b336001600160a01b0386168114801590611244575061124286826111f5565b155b156112755760405163711bec9160e11b81526001600160a01b03808316600483015287166024820152604401610a2f565b610a458686868686611db2565b61128a611399565b6001600160a01b0381166112b457604051631e4fbdf760e01b815260006004820152602401610a2f565b6109de816119d4565b6112c5611399565b6000612710600e546127106112da9190612b02565b6112e49085612b28565b6112ee9190612b3f565b60408051606080820183528682526020808301858152871515848601818152601080546000908152601186528890209651875592516001870155516002909501805460ff1916951515959095179094555484518981529182018690529381019290925292935090917f7d0e108ee6d117218c32bf2b0499c0bacc4ccb933926aadf8c5c363a2298a70f910160405180910390a260106000815461139090612b61565b90915550505050565b6003546001600160a01b03163314610d985760405163118cdaa760e01b8152336004820152602401610a2f565b806001600160a01b0381166113ee5760405163867915ab60e01b815260040160405180910390fd5b50600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03841661143b57604051632bfa23e760e11b815260006004820152602401610a2f565b6001600160a01b03851661146457604051626a0d4560e21b815260006004820152602401610a2f565b6114718585858585611e40565b5050505050565b60008281526011602052604090819020600b54815492516323b872dd60e01b8152336004820152306024820152604481019390935290916001600160a01b03909116906323b872dd906064016020604051808303816000875af11580156114e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115079190612b7a565b50600e541561153e576000612710600e5483600001546115279190612b28565b6115319190612b3f565b905061153c8161167f565b505b600c541561157457600c5434101561156957604051631a635b2d60e21b815260040160405180910390fd5b611574600c54611b91565b8060010154600f600082825461158a9190612b15565b9091555050600b546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156115d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fb9190612b97565b600f54111561161d576040516368e7531360e01b815260040160405180910390fd5b6116398284600160405180602001604052806000815250611e93565b6040518381526001600160a01b0383169033907f5b3996dfdf605d75a7a17fda51b867ffde65f43c8754f52d612ff7f4f4bec28a906020015b60405180910390a3505050565b8060000361168a5750565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156116d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f69190612b97565b8111611702578061176e565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561174a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176e9190612b97565b905060005b600654811015610af2576006818154811061179057611790612ad6565b906000526020600020906003020160020154600003156119cc5760006001600160a01b0316600682815481106117c8576117c8612ad6565b60009182526020909120600390910201546001600160a01b0316146119cc576000600854600683815481106117ff576117ff612ad6565b9060005260206000209060030201600201548461181c9190612b28565b6118269190612b3f565b90508060000361183657506119cc565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561187e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a29190612b97565b81116118ae578061191a565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156118f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191a9190612b97565b600954600680549293506001600160a01b039091169163a9059cbb91908590811061194757611947612ad6565b600091825260209091206003909102015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156119a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c99190612b7a565b50505b600101611773565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000805b601054811015611a585760008181526004602052604090205415611a5057600191505090565b600101611a2a565b506000905090565b611a6c81836001611ef0565b60008281526011602052604090206001810154600d5415611ac1576000612710600d548460000154611a9e9190612b28565b611aa89190612b3f565b9050611ab38161167f565b611abd8183612b02565b9150505b80600f6000828254611ad39190612b02565b9091555050600b5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015611b2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4f9190612b7a565b5060408051858152602081018390526001600160a01b038516917f7e4ea5abf80e1e951f06e1350361669cac3103e135a168fcb0119426979b732b9101611133565b80600003611b9c5750565b478111611ba95780611bab565b475b905060005b600654811015610af25760068181548110611bcd57611bcd612ad6565b90600052602060002090600302016001015460000315611d1c5760006001600160a01b031660068281548110611c0557611c05612ad6565b60009182526020909120600390910201546001600160a01b031614611d1c57600060075460068381548110611c3c57611c3c612ad6565b90600052602060002090600302016001015484611c599190612b28565b611c639190612b3f565b905080600003611c735750611d1c565b478111611c805780611c82565b475b9050600060068381548110611c9957611c99612ad6565b600091825260208220600390910201546040516001600160a01b039091169184919081818185875af1925050503d8060008114611cf2576040519150601f19603f3d011682016040523d82523d6000602084013e611cf7565b606091505b5050905080611d1957604051635698963360e11b815260040160405180910390fd5b50505b600101611bb0565b6001600160a01b038216611d4d5760405162ced3e160e81b815260006004820152602401610a2f565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101611672565b6001600160a01b038416611ddc57604051632bfa23e760e11b815260006004820152602401610a2f565b6001600160a01b038516611e0557604051626a0d4560e21b815260006004820152602401610a2f565b60408051600180825260208201869052818301908152606082018590526080820190925290611e378787848487611e40565b50505050505050565b611e4c85858585611f58565b6001600160a01b038416156114715782513390600103611e855760208481015190840151611e7e83898985858961209f565b5050610a45565b610a458187878787876121c3565b6001600160a01b038416611ebd57604051632bfa23e760e11b815260006004820152602401610a2f565b60408051600180825260208201869052818301908152606082018590526080820190925290610a45600087848487611e40565b6001600160a01b038316611f1957604051626a0d4560e21b815260006004820152602401610a2f565b604080516001808252602082018590528183019081526060820184905260a0820190925260006080820181815291929161147191879185908590611e40565b611f64848484846122ac565b6001600160a01b03841661200e576000805b8351811015611ff4576000838281518110611f9357611f93612ad6565b602002602001015190508060046000878581518110611fb457611fb4612ad6565b602002602001015181526020019081526020016000206000828254611fd99190612b15565b90915550611fe990508184612b15565b925050600101611f76565b5080600560008282546120079190612b15565b9091555050505b6001600160a01b038316612099576000805b835181101561208d57600083828151811061203d5761203d612ad6565b60200260200101519050806004600087858151811061205e5761205e612ad6565b602090810291909101810151825281019190915260400160002080549190910390559190910190600101612020565b50600580549190910390555b50505050565b6001600160a01b0384163b15610a455760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906120e39089908990889088908890600401612bb0565b6020604051808303816000875af192505050801561211e575060408051601f3d908101601f1916820190925261211b91810190612bf5565b60015b612187573d80801561214c576040519150601f19603f3d011682016040523d82523d6000602084013e612151565b606091505b50805160000361217f57604051632bfa23e760e11b81526001600160a01b0386166004820152602401610a2f565b805181602001fd5b6001600160e01b0319811663f23a6e6160e01b14611e3757604051632bfa23e760e11b81526001600160a01b0386166004820152602401610a2f565b6001600160a01b0384163b15610a455760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906122079089908990889088908890600401612c12565b6020604051808303816000875af1925050508015612242575060408051601f3d908101601f1916820190925261223f91810190612bf5565b60015b612270573d80801561214c576040519150601f19603f3d011682016040523d82523d6000602084013e612151565b6001600160e01b0319811663bc197c8160e01b14611e3757604051632bfa23e760e11b81526001600160a01b0386166004820152602401610a2f565b80518251146122db5781518151604051635b05999160e01b815260048101929092526024820152604401610a2f565b3360005b83518110156123e1576020818102858101820151908501909101516001600160a01b03881615612392576000828152602081815260408083206001600160a01b038c1684529091529020548181101561236b576040516303dee4c560e01b81526001600160a01b038a166004820152602481018290526044810183905260648101849052608401610a2f565b6000838152602081815260408083206001600160a01b038d16845290915290209082900390555b6001600160a01b038716156123d7576000828152602081815260408083206001600160a01b038b168452909152812080548392906123d1908490612b15565b90915550505b50506001016122df565b5082516001036124625760208301516000906020840151909150856001600160a01b0316876001600160a01b0316846001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051612453929190918252602082015260400190565b60405180910390a45050611471565b836001600160a01b0316856001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516124b1929190612c70565b60405180910390a45050505050565b80356001600160a01b03811681146124d757600080fd5b919050565b600080604083850312156124ef57600080fd5b6124f8836124c0565b946020939093013593505050565b6001600160e01b0319811681146109de57600080fd5b60006020828403121561252e57600080fd5b813561253981612506565b9392505050565b60006020828403121561255257600080fd5b5035919050565b6000815180845260005b8181101561257f57602081850181015186830182015201612563565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006125396020830184612559565b6000602082840312156125c457600080fd5b612539826124c0565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561260c5761260c6125cd565b604052919050565b600067ffffffffffffffff82111561262e5761262e6125cd565b5060051b60200190565b600082601f83011261264957600080fd5b8135602061265e61265983612614565b6125e3565b8083825260208201915060208460051b87010193508684111561268057600080fd5b602086015b8481101561269c5780358352918301918301612685565b509695505050505050565b600082601f8301126126b857600080fd5b813567ffffffffffffffff8111156126d2576126d26125cd565b6126e5601f8201601f19166020016125e3565b8181528460208386010111156126fa57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561272f57600080fd5b612738866124c0565b9450612746602087016124c0565b9350604086013567ffffffffffffffff8082111561276357600080fd5b61276f89838a01612638565b9450606088013591508082111561278557600080fd5b61279189838a01612638565b935060808801359150808211156127a757600080fd5b506127b4888289016126a7565b9150509295509295909350565b80151581146109de57600080fd5b600080604083850312156127e257600080fd5b8235915060208301356127f4816127c1565b809150509250929050565b6000806040838503121561281257600080fd5b823567ffffffffffffffff8082111561282a57600080fd5b818501915085601f83011261283e57600080fd5b8135602061284e61265983612614565b82815260059290921b8401810191818101908984111561286d57600080fd5b948201945b8386101561289257612883866124c0565b82529482019490820190612872565b965050860135925050808211156128a857600080fd5b506128b585828601612638565b9150509250929050565b60008151808452602080850194506020840160005b838110156128f0578151875295820195908201906001016128d4565b509495945050505050565b60208152600061253960208301846128bf565b6000806000806080858703121561292457600080fd5b84359350612934602086016124c0565b93969395505050506040820135916060013590565b60008060006060848603121561295e57600080fd5b612967846124c0565b95602085013595506040909401359392505050565b6000806040838503121561298f57600080fd5b8235915061299f602084016124c0565b90509250929050565b600080604083850312156129bb57600080fd5b6129c4836124c0565b915060208301356127f4816127c1565b6000806000606084860312156129e957600080fd5b83359250602084013591506040840135612a02816127c1565b809150509250925092565b60008060408385031215612a2057600080fd5b612a29836124c0565b915061299f602084016124c0565b600080600080600060a08688031215612a4f57600080fd5b612a58866124c0565b9450612a66602087016124c0565b93506040860135925060608601359150608086013567ffffffffffffffff811115612a9057600080fd5b6127b4888289016126a7565b600181811c90821680612ab057607f821691505b602082108103612ad057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156108c9576108c9612aec565b808201808211156108c9576108c9612aec565b80820281158282048414176108c9576108c9612aec565b600082612b5c57634e487b7160e01b600052601260045260246000fd5b500490565b600060018201612b7357612b73612aec565b5060010190565b600060208284031215612b8c57600080fd5b8151612539816127c1565b600060208284031215612ba957600080fd5b5051919050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612bea90830184612559565b979650505050505050565b600060208284031215612c0757600080fd5b815161253981612506565b6001600160a01b0386811682528516602082015260a060408201819052600090612c3e908301866128bf565b8281036060840152612c5081866128bf565b90508281036080840152612c648185612559565b98975050505050505050565b604081526000612c8360408301856128bf565b8281036020840152612c9581856128bf565b9594505050505056fea164736f6c6343000817000a