0 txs
45.8k calls
constructor
No constructor.
functions
DEFAULT_PROTOCOL_REWARD_BPS
viewfunction DEFAULT_PROTOCOL_REWARD_BPS() view returns (uint256)
EIP712_DOMAIN_NAME
viewfunction EIP712_DOMAIN_NAME() view returns (string)
EIP712_DOMAIN_VERSION
viewfunction EIP712_DOMAIN_VERSION() view returns (string)
EIP712_FUNCTION_TYPE_HASH
viewfunction EIP712_FUNCTION_TYPE_HASH() view returns (bytes32)
eip712Domain
viewfunction eip712Domain() view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)
generateOfferMessageHash
viewfunction generateOfferMessageHash(address acceptor, uint256 offerId, uint256 tokenId) view returns (bytes32 structHash, bytes32 dataHash)
getDomainSeparator
viewfunction getDomainSeparator() view returns (bytes32)
getRoyaltyInfoWithCap
viewfunction getRoyaltyInfoWithCap(address collection, uint256 tokenId, uint256 amountInWei) view returns (address creator, uint256 royaltyAmount)
MAX_BPS
viewfunction MAX_BPS() view returns (uint256)
MAX_PROTOCOL_REWARD_BPS
viewfunction MAX_PROTOCOL_REWARD_BPS() view returns (uint256)
MAX_ROYALTY_BPS
viewfunction MAX_ROYALTY_BPS() view returns (uint256)
nextOfferId
viewfunction nextOfferId() view returns (uint256)
offerCreatedAt
viewfunction offerCreatedAt(uint256 offerId) view returns (uint256)
offers
viewfunction offers(uint256 offerId) view returns (uint256 offerId, address payer, address collection, uint256 tokenId, uint256 amount, uint256 priceInWei, uint256 expiresAt, address tokenRecipient, bool accepted)
offerVerificationInterval
viewfunction offerVerificationInterval() view returns (uint256)
offerVerifiers
viewfunction offerVerifiers(address offerVerifier) view returns (bool)
owner
viewfunction owner() view returns (address)
pendingOwner
viewfunction pendingOwner() view returns (address)
protocolRewardBps
viewfunction protocolRewardBps() view returns (uint256)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
SEND_VALUE_GAS_LIMIT_MULTIPLE_RECIPIENTS
viewfunction SEND_VALUE_GAS_LIMIT_MULTIPLE_RECIPIENTS() view returns (uint256)
SEND_VALUE_GAS_LIMIT_SINGLE_RECIPIENT
viewfunction SEND_VALUE_GAS_LIMIT_SINGLE_RECIPIENT() view returns (uint256)
treasury
viewfunction treasury() view returns (address)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
validateOfferSignature
viewfunction validateOfferSignature(address acceptor, uint256 offerId, uint256 tokenId, bytes signature) view returns (bool isValid, bytes32 dataHash, address recoveredSigner)
validateOfferWithId
viewfunction validateOfferWithId(uint256 offerId, uint256 tokenId, address seller) view returns (uint8)
weth
viewfunction weth() view returns (address)
acceptOffer
nonpayablefunction acceptOffer(uint256 offerId, uint256 tokenId, address paymentRecipient)
acceptOfferWithSignature
nonpayablefunction acceptOfferWithSignature(uint256 offerId, uint256 tokenId, address paymentRecipient, bytes signature)
acceptOwnership
nonpayablefunction acceptOwnership()
createOffer
payablefunction createOffer(address collection, uint256 tokenId, uint256 amount, uint256 priceInWei, uint256 expiresAt, address tokenRecipient) payable returns (uint256 offerId)
initialize
nonpayablefunction initialize()
initialize
nonpayablefunction initialize(address admin_, address weth_, address treasury_)
ownerSetOfferVerificationInterval
nonpayablefunction ownerSetOfferVerificationInterval(uint256 interval)
ownerSetOfferVerifier
nonpayablefunction ownerSetOfferVerifier(address verifier, bool isVerified)
ownerSetProtocolRewardBps
nonpayablefunction ownerSetProtocolRewardBps(uint256 protocolRewardBps_)
ownerSetTreasury
nonpayablefunction ownerSetTreasury(address treasury_)
ownerWithdrawETH
nonpayablefunction ownerWithdrawETH(address to, uint256 amount)
renounceOwnership
nonpayablefunction renounceOwnership()
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
events
EIP712DomainChanged
event EIP712DomainChanged()
ETHWithdrawn
event ETHWithdrawn(address indexed owner, address indexed to, uint256 amount)
ETHWithdrawnToWETH
event ETHWithdrawnToWETH(address indexed user, uint256 amount, bool success)
Initialized
event Initialized(uint64 version)
OfferAccepted
event OfferAccepted(address indexed acceptor, uint256 indexed offerId, uint256 indexed tokenId, address paymentRecipient, address tokenRecipient, address payer)
OfferAcceptSignatureVerified
event OfferAcceptSignatureVerified(address indexed acceptor, uint256 indexed offerId, uint256 indexed tokenId, bytes signature, bytes32 messageHash, address recoveredSigner)
OfferCreated
event OfferCreated(address indexed payer, address indexed collection, uint256 tokenId, uint256 amount, uint256 priceInWei, uint256 expiresAt, address tokenRecipient, uint256 indexed offerId)
OfferCreatedAtSet
event OfferCreatedAtSet(uint256 indexed offerId, uint256 createdAt)
OfferPaymentsSent
event OfferPaymentsSent(uint256 indexed offerId, address protocolRewardRecipient, uint256 protocolRewardAmount, address royaltyRecipient, uint256 royaltyAmount, address paymentRecipient, uint256 paymentAmount)
OfferVerificationIntervalSet
event OfferVerificationIntervalSet(uint256 interval)
OfferVerifierSet
event OfferVerifierSet(address indexed verifier, bool isVerified)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
OwnershipTransferStarted
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner)
ProtocolRewardBpsSet
event ProtocolRewardBpsSet(address indexed owner, uint256 protocolRewardBps)
TreasurySet
event TreasurySet(address indexed owner, address treasury)
Upgraded
event Upgraded(address indexed implementation)
errors
AcceptOfferAlreadyAccepted
error AcceptOfferAlreadyAccepted(uint256 offerId)
AcceptOfferExpired
error AcceptOfferExpired(uint256 offerId, uint256 expiresAt, uint256 currentTime)
AcceptOfferIdNotValid
error AcceptOfferIdNotValid(uint256 offerId)
AcceptOfferNotFromOwner
error AcceptOfferNotFromOwner(uint256 offerId, address offerAcceptor)
AcceptOfferTokenIdMismatched
error AcceptOfferTokenIdMismatched(uint256 offerId, address collection, uint256 offerTokenId, uint256 acceptTokenId)
AcceptOfferWETHTransferFailed
error AcceptOfferWETHTransferFailed(uint256 offerId, address from, address to, uint256 amount)
AddressCannotBeZero
error AddressCannotBeZero()
AddressEmptyCode
error AddressEmptyCode(address target)
CreateOfferInvalidAmount
error CreateOfferInvalidAmount(address collection, uint256 tokenId, uint256 amount)
CreateOfferWETHTransferFailed
error CreateOfferWETHTransferFailed(address to, uint256 amount)
ECDSAInvalidSignature
error ECDSAInvalidSignature()
ECDSAInvalidSignatureLength
error ECDSAInvalidSignatureLength(uint256 length)
ECDSAInvalidSignatureS
error ECDSAInvalidSignatureS(bytes32 s)
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
FailedCall
error FailedCall()
InvalidInitialization
error InvalidInitialization()
InvalidProtocolRewardBps
error InvalidProtocolRewardBps(uint256 protocolRewardBps)
NotInitializing
error NotInitializing()
OfferVerificationFailed
error OfferVerificationFailed(address acceptor, uint256 offerId, uint256 tokenId, bytes signature, bytes32 messageHash, address recoveredSigner)
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
creation bytecode
0x60a060405230608052348015610013575f5ffd5b5061001c610029565b610024610029565b6100db565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100795760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d85780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612e936101015f395f8181611380015281816113a901526114e80152612e935ff3fe608060405260043610610241575f3560e01c8063715018a611610134578063b40ad8da116100b3578063e30c397811610078578063e30c397814610798578063ed24911d146107ac578063f2fde38b146107c0578063f7a9b40e146107df578063fd070296146107f5578063fd967f4714610829575f5ffd5b8063b40ad8da14610727578063b47db761146103c0578063c0c53b8b1461073b578063cda092a71461075a578063d0dc91d214610779575f5ffd5b80638a72ea6a116100f95780638a72ea6a146105c55780638da5cb5b1461069157806393307c4b146106a55780639751beb9146106b8578063ad3cb1cc146106f7575f5ffd5b8063715018a61461054c57806379ba5097146105605780638129fc1c14610574578063829908511461058857806384b0196e1461059e575f5ffd5b80634dce2668116101c05780635e4db5a1116101855780635e4db5a1146104b65780635f5d0655146104d55780635fb01785146104eb57806361d027b31461051757806367836c3814610537575f5ffd5b80634dce26681461040d5780634f1ef2861461044057806352d1902d146104535780635cc33321146104675780635ccb1390146104a0575f5ffd5b806324666ea21161020657806324666ea21461031e5780632e01b8a31461036357806331375242146103a15780633dca40e6146103c05780633fc8cef3146103d5575f5ffd5b806303ab56ac1461024c57806307ae6a5d1461026d57806309ea6f621461028c5780631bd238d9146102ab578063218e18e2146102e4575f5ffd5b3661024857005b5f5ffd5b348015610257575f5ffd5b5061026b610266366004612714565b61083e565b005b348015610278575f5ffd5b5061026b61028736600461273f565b6108b0565b348015610297575f5ffd5b5061026b6102a6366004612782565b6108cf565b3480156102b6575f5ffd5b506102ca6102c53660046127b9565b610936565b604080519283526020830191909152015b60405180910390f35b3480156102ef575f5ffd5b506103106102fe366004612714565b6103ee6020525f908152604090205481565b6040519081526020016102db565b348015610329575f5ffd5b5061033d61033836600461288a565b6109ac565b60408051931515845260208401929092526001600160a01b0316908201526060016102db565b34801561036e575f5ffd5b5061038261037d3660046127b9565b610a06565b604080516001600160a01b0390931683526020830191909152016102db565b3480156103ac575f5ffd5b5061026b6103bb3660046128e9565b610ac0565b3480156103cb575f5ffd5b5061031061138881565b3480156103e0575f5ffd5b506103e8546103f5906001600160a01b031681565b6040516001600160a01b0390911681526020016102db565b348015610418575f5ffd5b506103107f87b54b1a80e67ba60ef9e9de55a9baac9a3e1d3b7b54dc1fc6b5f97d6473837781565b61026b61044e366004612904565b610b40565b34801561045e575f5ffd5b50610310610b5f565b348015610472575f5ffd5b50610493604051806040016040528060018152602001603160f81b81525081565b6040516102db919061297f565b3480156104ab575f5ffd5b506103106203345081565b3480156104c1575f5ffd5b5061026b6104d0366004612991565b610b7a565b3480156104e0575f5ffd5b506103106103ea5481565b3480156104f6575f5ffd5b5061050a61050536600461273f565b610c0b565b6040516102db91906129cf565b348015610522575f5ffd5b506103e9546103f5906001600160a01b031681565b348015610542575f5ffd5b50610310614e2081565b348015610557575f5ffd5b5061026b610cab565b34801561056b575f5ffd5b5061026b610cbe565b34801561057f575f5ffd5b5061026b610d06565b348015610593575f5ffd5b506103106103ec5481565b3480156105a9575f5ffd5b506105b2610e28565b6040516102db97969594939291906129f5565b3480156105d0575f5ffd5b5061063d6105df366004612714565b6103eb6020525f90815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495966001600160a01b0395861696948616959394929391929091811690600160a01b900460ff1689565b60408051998a526001600160a01b0398891660208b0152968816968901969096526060880194909452608087019290925260a086015260c085015290911660e08301521515610100820152610120016102db565b34801561069c575f5ffd5b506103f5610ed1565b6103106106b3366004612a8b565b610f05565b3480156106c3575f5ffd5b506106e76106d23660046128e9565b6103ed6020525f908152604090205460ff1681565b60405190151581526020016102db565b348015610702575f5ffd5b50610493604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610732575f5ffd5b5061031060fa81565b348015610746575f5ffd5b5061026b610755366004612ae5565b610fb0565b348015610765575f5ffd5b5061026b610774366004612714565b611173565b348015610784575f5ffd5b5061026b610793366004612b22565b6111b7565b3480156107a3575f5ffd5b506103f561122e565b3480156107b7575f5ffd5b50610310611256565b3480156107cb575f5ffd5b5061026b6107da3660046128e9565b611264565b3480156107ea575f5ffd5b506103106103e75481565b348015610800575f5ffd5b506104936040518060400160405280600981526020016852444f4f666665727360b81b81525081565b348015610834575f5ffd5b5061031061271081565b6108466112e9565b6113888111156108715760405163998dc1b560e01b8152600481018290526024015b60405180910390fd5b6103e781905560405181815233907f61143574fbcb9f5bdb303e42eb4fb569e32f40d192cac50f82c5dcb60ca7d8f4906020015b60405180910390a250565b6108ca83838360405180602001604052805f8152506111b7565b505050565b6108d76112e9565b6001600160a01b0382165f8181526103ed6020908152604091829020805460ff191685151590811790915591519182527faa27186c2b30d539d895df627aa4d1aa02e534d9b9919e92e3bd5c287c7744b5910160405180910390a25050565b604080517f87b54b1a80e67ba60ef9e9de55a9baac9a3e1d3b7b54dc1fc6b5f97d647383776020808301919091526001600160a01b038616828401526060820185905260808083018590528351808403909101815260a090920190925280519101205f6109a28261131b565b9050935093915050565b5f5f5f6109ba878787610936565b92506109c89050828561134d565b90506001600160a01b038116158015906109fa57506001600160a01b0381165f9081526103ed602052604090205460ff165b92509450945094915050565b60405163152a902d60e11b815260048101839052602481018290525f9081906001600160a01b03861690632a55205a906044016040805180830381865afa925050508015610a71575060408051601f3d908101601f19168201909252610a6e91810190612b69565b60015b610a7f57505f905080610ab8565b8193505f61271061138887610a949190612ba9565b610a9e9190612bc0565b905080821115610ab057809350610ab4565b8193505b5050505b935093915050565b610ac86112e9565b6001600160a01b038116610aef576040516303988b8160e61b815260040160405180910390fd5b6103e980546001600160a01b0319166001600160a01b03831690811790915560405190815233907f21eb548722a564f6e09f039f7aa858ae94c911910f3823b37af2250eeca4f403906020016108a5565b610b48611375565b610b5182611419565b610b5b8282611421565b5050565b5f610b686114dd565b505f516020612e3e5f395f51905f5290565b610b826112e9565b6001600160a01b038216610ba9576040516303988b8160e61b815260040160405180910390fd5b6103e854610bc79083908390614e20906001600160a01b0316611526565b6040518181526001600160a01b0383169033907fc81b1761d304f16ef2aeae3a8611d9bd1d618adfff67d5157365cfb1251395329060200160405180910390a35050565b5f8381526103eb602090815260408083208151610120810183528154815260018201546001600160a01b039081169482019490945260028201548416928101929092526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015491821660e0820152600160a01b90910460ff161515610100820152610ca081858561169f565b9150505b9392505050565b610cb36112e9565b610cbc5f611777565b565b3380610cc861122e565b6001600160a01b031614610cfa5760405163118cdaa760e01b81526001600160a01b0382166004820152602401610868565b610d0381611777565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460039190600160401b900460ff1680610d505750805467ffffffffffffffff808416911610155b15610d6e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff191667ffffffffffffffff831617600160401b178155610d986117af565b610ddc6040518060400160405280600981526020016852444f4f666665727360b81b815250604051806040016040528060018152602001603160f81b8152506117c7565b805460ff60401b1916815560405167ffffffffffffffff831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050565b5f60608082808083815f516020612e1e5f395f51905f528054909150158015610e5357506001810154155b610e975760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610868565b610e9f6117d9565b610ea7611899565b604080515f80825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b5f84600114610f4057604051636aaf228360e01b81526001600160a01b03881660048201526024810187905260448101869052606401610868565b426103ee5f6103ea5481526020019081526020015f20819055506103ea547fc0c6ac9cf8713a74714365c84ca748e26f39b6be57d486970addce13f700a2e342604051610f8f91815260200190565b60405180910390a2610fa58787878787876118d7565b979650505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f81158015610ff55750825b90505f8267ffffffffffffffff1660011480156110115750303b155b90508115801561101f575080155b1561103d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561106757845460ff60401b1916600160401b1785555b6001600160a01b03881661108e576040516303988b8160e61b815260040160405180910390fd5b6001600160a01b0387166110b5576040516303988b8160e61b815260040160405180910390fd5b6001600160a01b0386166110dc576040516303988b8160e61b815260040160405180910390fd5b60fa6103e7556103e880546001600160a01b03808a166001600160a01b0319928316179092556103e980549289169290911691909117905560016103ea5561112388611b37565b831561116957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b61117b6112e9565b6103ec8190556040518181527fefd89bf8acbed864a285e995c85dd3279e2a5c8f7e792cc6332f22eaeab8e1de9060200160405180910390a150565b5f5f5f6111c633888887611b48565b925092509250821561121a578587336001600160a01b03167f2f68f2a53a34147658dde0dc2257c0d443c6467ca228bb2d6efd231a5f5a756387868660405161121193929190612bdf565b60405180910390a45b611225878787611bc5565b50505050505050565b5f807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610ef5565b5f61125f611d96565b905090565b61126c6112e9565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556112b0610ed1565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b336112f2610ed1565b6001600160a01b031614610cbc5760405163118cdaa760e01b8152336004820152602401610868565b5f611347611327611d96565b8360405161190160f01b8152600281019290925260228201526042902090565b92915050565b5f5f5f5f61135b8686611d9f565b92509250925061136b8282611de8565b5090949350505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113fb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166113ef5f516020612e3e5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15610cbc5760405163703e46dd60e11b815260040160405180910390fd5b610d036112e9565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561147b575060408051601f3d908101601f1916820190925261147891810190612c11565b60015b6114a357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610868565b5f516020612e3e5f395f51905f5281146114d357604051632a87526960e21b815260048101829052602401610868565b6108ca8383611ea0565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cbc5760405163703e46dd60e11b815260040160405180910390fd5b8215611699575f846001600160a01b03168484906040515f60405180830381858888f193505050503d805f8114611578576040519150601f19603f3d011682016040523d82523d5f602084013e61157d565b606091505b5050905080611697575f829050806001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004015f604051808303818588803b1580156115c3575f5ffd5b505af11580156115d5573d5f5f3e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b038a81166004830152602482018a90525f94508516925063a9059cbb91506044016020604051808303815f875af1158015611628573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061164c9190612c28565b6040805188815282151560208201529192506001600160a01b038916917fcac03b534fd581f08f64e77ce981c7e94e1ef450ef999fe757932630790fb1a1910160405180910390a250505b505b50505050565b5f836101000151156116b357506001610ca4565b8360c001514211156116c757506002610ca4565b828460600151141580156116de5750606084015115155b156116eb57506003610ca4565b6040848101519051627eeac760e11b81526001600160a01b0384811660048301526024820186905282169062fdd58e90604401602060405180830381865afa158015611739573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175d9190612c11565b5f0361176d576004915050610ca4565b505f949350505050565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319168155610b5b82611ef5565b6117b7611f65565b610cbc6117c2610ed1565b611b37565b6117cf611f65565b610b5b8282611fae565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060915f516020612e1e5f395f51905f529161181790612c43565b80601f016020809104026020016040519081016040528092919081815260200182805461184390612c43565b801561188e5780601f106118655761010080835404028352916020019161188e565b820191905f5260205f20905b81548152906001019060200180831161187157829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060915f516020612e1e5f395f51905f529161181790612c43565b6103ea5460408051610120810182528281523360208083018281526001600160a01b038c8116858701818152606087018e8152608088018e815260a089018e815260c08a018e81528d871660e08c019081525f6101008d018181528f82526103eb909b528d90209b518c55975160018c0180549189166001600160a01b0319928316179055945160028c0180549189169190961617909455915160038a015551600489015551600588015551600687015591516007909501805493511515600160a01b026001600160a81b031990941695909116949094179190911790925591518392907fb52d03f658f2b5770408afe451ccdb703fdb28e6503e00c938eb24e5a55159f490611a17908b908b908b908b908b909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60405180910390a46103ea8054905f611a2f83612c7b565b90915550506103e85460408051630d0e30db60e41b815290516001600160a01b0390921691829163d0e30db09134916004808201925f9290919082900301818588803b158015611a7d575f5ffd5b505af1158015611a8f573d5f5f3e3d5ffd5b505060405163a9059cbb60e01b81523360048201523460248201525f93506001600160a01b038516925063a9059cbb91506044016020604051808303815f875af1158015611adf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b039190612c28565b905080611b2b57604051637532f88d60e11b8152336004820152346024820152604401610868565b50509695505050505050565b611b3f611f65565b610d038161200d565b6103ec545f8481526103ee6020526040812054909182918291611b6a91612c93565b421115611b7e57505f915081905080611bbb565b611b8a878787876109ac565b9194509250905082611bbb578686868685856040516302c597df60e21b815260040161086896959493929190612ca6565b9450945094915050565b5f8381526103eb60209081526040808320815161012081018352815480825260018301546001600160a01b039081169583019590955260028301548516938201939093526003820154606082015260048201546080820152600582015460a0820152600682015460c082015260079091015492831660e0820152600160a01b90920460ff161515610100830152909103611c755760405163472e0b5f60e01b815260048101859052602401610868565b611c7f818461203e565b5f8481526103eb6020908152604091829020600701805460ff60a01b1916600160a01b17905560e08301518382015183516001600160a01b0387811682529283169381019390935216918101919091528390859033907f2dc2e57214af402f4196774f1e428d8453075ed9f1d2dc37892f1673bd06cb519060600160405180910390a460408181015160e083015160808401519251637921219560e11b81523360048201526001600160a01b03918216602482015260448101879052606481019390935260a060848401525f60a484015290919082169063f242432a9060c4015f604051808303815f87803b158015611d76575f5ffd5b505af1158015611d88573d5f5f3e3d5ffd5b505050506116978284612166565b5f61125f6123ba565b5f5f5f8351604103611dd6576020840151604085015160608601515f1a611dc88882858561242d565b955095509550505050611de1565b505081515f91506002905b9250925092565b5f826003811115611dfb57611dfb6129bb565b03611e04575050565b6001826003811115611e1857611e186129bb565b03611e365760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611e4a57611e4a6129bb565b03611e6b5760405163fce698f760e01b815260048101829052602401610868565b6003826003811115611e7f57611e7f6129bb565b03610b5b576040516335e2f38360e21b815260048101829052602401610868565b611ea9826124f1565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611eed576108ca8282612554565b610b5b6125c6565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610cbc57604051631afcd79f60e31b815260040160405180910390fd5b611fb6611f65565b5f516020612e1e5f395f51905f527fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611fef8482612d39565b5060038101611ffe8382612d39565b505f8082556001909101555050565b612015611f65565b6001600160a01b038116610cfa57604051631e4fbdf760e01b81525f6004820152602401610868565b5f61204a83833361169f565b90506001816004811115612060576120606129bb565b036120845782516040516333ce20f360e01b81526004810191909152602401610868565b6002816004811115612098576120986129bb565b036120cc57825160c08401516040516310ca8a8f60e21b815260048101929092526024820152426044820152606401610868565b60038160048111156120e0576120e06129bb565b0361212857825160408085015160608601519151632a0ace0f60e01b815260048101939093526001600160a01b03166024830152604482015260648101839052608401610868565b600481600481111561213c5761213c6129bb565b036108ca5782516040516369d0fcbd60e01b81526004810191909152336024820152604401610868565b5f82608001518360a0015161217b9190612ba9565b90505f6127106103e754836121909190612ba9565b61219a9190612bc0565b90505f5f6121b18660400151876060015186610a06565b90925090505f816121c28587612df4565b6121cc9190612df4565b87516103e954604080516001600160a01b039283168152602081018990528783168183015260608101879052918a16608083015260a082018490525192935090917f13301ac831290e440725ce63600763944fd412bab740a7fb7928786c67224e5a9181900360c00190a26103e85460208801516040516323b872dd60e01b81526001600160a01b039182166004820152306024820152604481018890525f9291909116906323b872dd906064016020604051808303815f875af1158015612296573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ba9190612c28565b9050806123005787516020890151604051631c957a9160e01b815260048101929092526001600160a01b0316602482015230604482015260648101879052608401610868565b6103e854604051632e1a7d4d60e01b8152600481018890526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015612344575f5ffd5b505af1158015612356573d5f5f3e3d5ffd5b50506103e9546103e85461237e93506001600160a01b0391821692508891614e209116611526565b6103e85461239c9085908590614e20906001600160a01b0316611526565b6103e8546111699088908490614e20906001600160a01b0316611526565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123e46125e5565b6123ec61264d565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561246657505f91506003905082611bbb565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156124b7573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166124e257505f925060019150829050611bbb565b975f9750879650945050505050565b806001600160a01b03163b5f0361252657604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610868565b5f516020612e3e5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b0316846040516125709190612e07565b5f60405180830381855af49150503d805f81146125a8576040519150601f19603f3d011682016040523d82523d5f602084013e6125ad565b606091505b50915091506125bd85838361268f565b95945050505050565b3415610cbc5760405163b398979f60e01b815260040160405180910390fd5b5f5f516020612e1e5f395f51905f52816125fd6117d9565b80519091501561261557805160209091012092915050565b81548015612624579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f5f516020612e1e5f395f51905f5281612665611899565b80519091501561267d57805160209091012092915050565b60018201548015612624579392505050565b6060826126a45761269f826126eb565b610ca4565b81511580156126bb57506001600160a01b0384163b155b156126e457604051639996b31560e01b81526001600160a01b0385166004820152602401610868565b5080610ca4565b8051156126fb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f60208284031215612724575f5ffd5b5035919050565b6001600160a01b0381168114610d03575f5ffd5b5f5f5f60608486031215612751575f5ffd5b8335925060208401359150604084013561276a8161272b565b809150509250925092565b8015158114610d03575f5ffd5b5f5f60408385031215612793575f5ffd5b823561279e8161272b565b915060208301356127ae81612775565b809150509250929050565b5f5f5f606084860312156127cb575f5ffd5b83356127d68161272b565b95602085013595506040909401359392505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261280e575f5ffd5b813567ffffffffffffffff811115612828576128286127eb565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715612857576128576127eb565b60405281815283820160200185101561286e575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f6080858703121561289d575f5ffd5b84356128a88161272b565b93506020850135925060408501359150606085013567ffffffffffffffff8111156128d1575f5ffd5b6128dd878288016127ff565b91505092959194509250565b5f602082840312156128f9575f5ffd5b8135610ca48161272b565b5f5f60408385031215612915575f5ffd5b82356129208161272b565b9150602083013567ffffffffffffffff81111561293b575f5ffd5b612947858286016127ff565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610ca46020830184612951565b5f5f604083850312156129a2575f5ffd5b82356129ad8161272b565b946020939093013593505050565b634e487b7160e01b5f52602160045260245ffd5b60208101600583106129ef57634e487b7160e01b5f52602160045260245ffd5b91905290565b60ff60f81b8816815260e060208201525f612a1360e0830189612951565b8281036040840152612a258189612951565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612a7a578351835260209384019390920191600101612a5c565b50909b9a5050505050505050505050565b5f5f5f5f5f5f60c08789031215612aa0575f5ffd5b8635612aab8161272b565b95506020870135945060408701359350606087013592506080870135915060a0870135612ad78161272b565b809150509295509295509295565b5f5f5f60608486031215612af7575f5ffd5b8335612b028161272b565b92506020840135612b128161272b565b9150604084013561276a8161272b565b5f5f5f5f60808587031215612b35575f5ffd5b84359350602085013592506040850135612b4e8161272b565b9150606085013567ffffffffffffffff8111156128d1575f5ffd5b5f5f60408385031215612b7a575f5ffd5b8251612b858161272b565b6020939093015192949293505050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761134757611347612b95565b5f82612bda57634e487b7160e01b5f52601260045260245ffd5b500490565b606081525f612bf16060830186612951565b6020830194909452506001600160a01b0391909116604090910152919050565b5f60208284031215612c21575f5ffd5b5051919050565b5f60208284031215612c38575f5ffd5b8151610ca481612775565b600181811c90821680612c5757607f821691505b602082108103612c7557634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60018201612c8c57612c8c612b95565b5060010190565b8082018082111561134757611347612b95565b60018060a01b038716815285602082015284604082015260c060608201525f612cd260c0830186612951565b6080830194909452506001600160a01b039190911660a090910152949350505050565b601f8211156108ca57805f5260205f20601f840160051c81016020851015612d1a5750805b601f840160051c820191505b81811015611697575f8155600101612d26565b815167ffffffffffffffff811115612d5357612d536127eb565b612d6781612d618454612c43565b84612cf5565b6020601f821160018114612d99575f8315612d825750848201515b5f19600385901b1c1916600184901b178455611697565b5f84815260208120601f198516915b82811015612dc85787850151825560209485019460019092019101612da8565b5084821015612de557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8181038181111561134757611347612b95565b5f82518060208501845e5f92019182525091905056fea16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220fe54566b547b9ecb6c38326e2c617aa807219386f1bd000c73e4e23b3fe576fe64736f6c634300081c0033