More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 123 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdrawal Token | 15138739 | 741 days ago | IN | 0 ETH | 0.00083158 | ||||
Withdrawal Token | 15136033 | 742 days ago | IN | 0 ETH | 0.00189453 | ||||
Withdrawal Token | 15065293 | 753 days ago | IN | 0 ETH | 0.00066965 | ||||
Withdrawal Token | 15055287 | 754 days ago | IN | 0 ETH | 0.00077277 | ||||
Withdrawal Token | 15055280 | 754 days ago | IN | 0 ETH | 0.00094417 | ||||
Withdrawal Token | 15051412 | 755 days ago | IN | 0 ETH | 0.00408004 | ||||
Withdrawal Token | 15050781 | 755 days ago | IN | 0 ETH | 0.00278362 | ||||
Withdrawal Token | 15050775 | 755 days ago | IN | 0 ETH | 0.00236964 | ||||
Withdrawal Token | 15050769 | 755 days ago | IN | 0 ETH | 0.00218151 | ||||
Withdrawal Token | 15046259 | 756 days ago | IN | 0 ETH | 0.00676047 | ||||
Withdrawal Token | 15046037 | 756 days ago | IN | 0 ETH | 0.00520946 | ||||
Withdrawal Token | 15044455 | 756 days ago | IN | 0 ETH | 0.00205951 | ||||
Withdrawal Token | 15044296 | 756 days ago | IN | 0 ETH | 0.00229106 | ||||
Withdrawal Token | 15040879 | 757 days ago | IN | 0 ETH | 0.0079358 | ||||
Withdrawal Token | 15040394 | 757 days ago | IN | 0 ETH | 0.00364432 | ||||
Withdrawal Token | 15040360 | 757 days ago | IN | 0 ETH | 0.00304013 | ||||
Withdrawal Token | 15039480 | 757 days ago | IN | 0 ETH | 0.001548 | ||||
Withdrawal Token | 15039351 | 757 days ago | IN | 0 ETH | 0.00159029 | ||||
Withdrawal Token | 15039346 | 757 days ago | IN | 0 ETH | 0.00219286 | ||||
Withdrawal Token | 15038863 | 757 days ago | IN | 0 ETH | 0.00179971 | ||||
Withdrawal Token | 15038855 | 757 days ago | IN | 0 ETH | 0.00161957 | ||||
Withdrawal Token | 15038850 | 757 days ago | IN | 0 ETH | 0.00196896 | ||||
Withdrawal Token | 15036612 | 758 days ago | IN | 0 ETH | 0.00364945 | ||||
Withdrawal Token | 15034978 | 758 days ago | IN | 0 ETH | 0.00414161 | ||||
Withdrawal Token | 15034537 | 758 days ago | IN | 0 ETH | 0.00639022 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
WedreamEscrow
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 1 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; /** * WEDREAM ESCROW CONTRACT * Learn more about this Project on https://auction.wedream.world/ */ import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./BidValidator.sol"; import "./LibBid.sol"; contract WedreamEscrow is BidValidator, IERC721Receiver, Ownable { using Counters for Counters.Counter; Counters.Counter public tokenRegistryId; uint256 public withdrawalLockedUntil; uint256 public auctionStartsAt; uint256 public auctionEndsAt; uint256 public escrowSharePercentage; mapping(uint256 => TokenRegistryEntry) public tokenRegistry; mapping(address => uint256[]) public tokenIdsByAddress; mapping(address => uint256) public tokenCountByAddress; struct TokenRegistryEntry { address tokenContract; uint256 tokenIdentifier; address tokenOwner; uint256 minimumPrice; } // Events event TokenWithdrawal( uint256 tokenRegistryId, address tokenContract, uint256 tokenIdentifier, address withdrawalInitiator, address withdrawalReceiver ); event MinmumPriceChange( uint256 tokenRegistryId, uint256 oldMiniumPrice, uint256 newMiniumPrice, address priceChanger ); event FulfillBid( uint256 tokenRegistryId, address tokenContract, uint256 tokenIdentifier, address tokenReceiver, uint256 minimumPrice, uint256 paidAmount ); constructor() public { ESCROW_WALLET = 0x901E0FDaf9326A7B962793d2518aB4cC6E4FeF04; escrowSharePercentage = 250; } /** * @dev See {IERC721Receiver-onERC721Received}. Also registers token in our TokenRegistry. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, // operator not required address tokenOwnerAddress, uint256 tokenIdentifier, bytes memory ) public virtual override returns (bytes4) { tokenRegistryId.increment(); tokenRegistry[tokenRegistryId.current()] = TokenRegistryEntry( msg.sender, tokenIdentifier, tokenOwnerAddress, 0 ); tokenIdsByAddress[tokenOwnerAddress].push(tokenRegistryId.current()); tokenCountByAddress[tokenOwnerAddress]++; return this.onERC721Received.selector; } /** * @dev Function withdrawal a specific token from the registry. * Requirements: * - Token must be owned by this contract. * - Token was owned by msg.sender before. * - It is allowed to withdrawal tokens at this moment. * * @param _tokenRegistryId Id in the token registry * @param _tokenContract ERC721 Contract Address * @param _tokenIdentifier Identifier of token on the contract */ function withdrawalToken( uint256 _tokenRegistryId, address _tokenContract, uint256 _tokenIdentifier ) public virtual { require( tokenRegistry[_tokenRegistryId].tokenOwner == msg.sender, "WedreamEscrow: Invalid Sender" ); require( tokenRegistry[_tokenRegistryId].tokenIdentifier == _tokenIdentifier && tokenRegistry[_tokenRegistryId].tokenContract == _tokenContract, "WedreamEscrow: Invalid Registry Entry" ); require( (block.timestamp < auctionStartsAt || withdrawalLockedUntil < block.timestamp), "WedreamEscrow: Withdrawal currently not allowed" ); transferToken( tokenRegistry[_tokenRegistryId].tokenContract, tokenRegistry[_tokenRegistryId].tokenIdentifier, tokenRegistry[_tokenRegistryId].tokenOwner ); emit TokenWithdrawal( _tokenRegistryId, tokenRegistry[_tokenRegistryId].tokenContract, tokenRegistry[_tokenRegistryId].tokenIdentifier, msg.sender, tokenRegistry[_tokenRegistryId].tokenOwner ); delete tokenRegistry[_tokenRegistryId]; } /** * @dev Function to set the token on sale and add a minimum price. Tokens * with minimum Price 0 are not allowed to be sold. * * Requirements: * - `msg.sender` needs to be owner of token in our registry * - Withdrawals are allowed / Auction is not running * * @param _tokenRegistryId Id in the token registry * @param _tokenContract ERC721 Contract Address * @param _tokenIdentifier Identifier of token on the contract * @param minimumPrice New minimum price in wei */ function setMinimumPrice( uint256 _tokenRegistryId, address _tokenContract, uint256 _tokenIdentifier, uint256 minimumPrice ) external { require( tokenRegistry[_tokenRegistryId].tokenOwner == msg.sender, "WedreamEscrow: Invalid Sender" ); require( tokenRegistry[_tokenRegistryId].tokenIdentifier == _tokenIdentifier && tokenRegistry[_tokenRegistryId].tokenContract == _tokenContract, "WedreamEscrow: Invalid Registry Entry" ); require( (block.timestamp < auctionStartsAt || withdrawalLockedUntil < block.timestamp), "WedreamEscrow: Minimum Price Change is currently not allowed" ); uint256 oldPrice = tokenRegistry[_tokenRegistryId].minimumPrice; tokenRegistry[_tokenRegistryId].minimumPrice = minimumPrice; emit MinmumPriceChange( _tokenRegistryId, oldPrice, minimumPrice, msg.sender ); } /** * @dev Function to set the token on sale and add a minimum price. Tokens * with minimum Price 0 are not allowed to be sold. This is a Emergency Function. * * Requirements: * - `msg.sender` needs to admin of contract * * @param _tokenRegistryId Id in the token registry * @param _tokenContract ERC721 Contract Address * @param _tokenIdentifier Identifier of token on the contract * @param minimumPrice New minimum price in wei */ function adminSetMinimumPrice( uint256 _tokenRegistryId, address _tokenContract, uint256 _tokenIdentifier, uint256 minimumPrice ) external onlyOwner { require( tokenRegistry[_tokenRegistryId].tokenIdentifier == _tokenIdentifier && tokenRegistry[_tokenRegistryId].tokenContract == _tokenContract, "WedreamEscrow: Invalid Registry Entry" ); uint256 oldPrice = tokenRegistry[_tokenRegistryId].minimumPrice; tokenRegistry[_tokenRegistryId].minimumPrice = minimumPrice; emit MinmumPriceChange( _tokenRegistryId, oldPrice, minimumPrice, msg.sender ); } /** * @dev Function to change the Auction Period and withdrawal Locking * Requirements: * - `msg.sender` needs to admin of contract * - Dates must be in right order _auctionStartsAt < _auctionEndsAt < _withdrawalLockedUntil * * @param _auctionStartsAt Timestamp when auction starts (no minimum price changes, no withdrawals) * @param _auctionEndsAt Timestamp when auction ends (earlierst when the bids can be fulfilled) * @param _withdrawalLockedUntil Timestamp until when previous token owner withdrawal and minimum price changes are not possible */ function adminChangePeriods( uint256 _auctionStartsAt, uint256 _auctionEndsAt, uint256 _withdrawalLockedUntil ) external onlyOwner { require( (_auctionStartsAt < _auctionEndsAt && _auctionEndsAt < _withdrawalLockedUntil), "WedreamEscrow: Invalid dates order" ); auctionStartsAt = _auctionStartsAt; auctionEndsAt = _auctionEndsAt; withdrawalLockedUntil = _withdrawalLockedUntil; } /** * @dev Function to change the escrow share percentage * * Requirements: * - `msg.sender` needs to admin of contract * - _escrowSharePercentage can't be more than 10000 (=100%) * @param _escrowSharePercentage basis points of share that is sent to the contract owner, default: 250 (=2.5%) */ function adminChangeEscrowSharePercentage( uint256 _escrowSharePercentage ) external onlyOwner { require( (_escrowSharePercentage <= 10000), "WedreamEscrow: Invalid share percentage (> 10000)" ); escrowSharePercentage = _escrowSharePercentage; } /** * @dev ESCROW_WALLET is used to verify bids integrity. With this function the owner can change it. * * Requirements: * - `msg.sender` needs to admin of contract * * @param _escrow_wallet Public Address of Signer Wallet */ function adminChangeEscrowWallet( address _escrow_wallet ) external onlyOwner { ESCROW_WALLET = _escrow_wallet; } /** * @dev Withrawal all Funds sent to the contract to Owner. * Should never happen but just in case... * * Requirements: * - `msg.sender` needs to be Owner and payable */ function adminWithdrawalEth() external onlyOwner { require(payable(msg.sender).send(address(this).balance)); } /** * @dev Emergency Admin function to withdrawal a specific token from the registry. * Requirements: * - Token must be owned by this contract. * - msg.sender is owner. * * @param _tokenRegistryId Id in the token registry. * @param _tokenContract ERC721 Contract Address * @param _tokenIdentifier Identifier of token on the contract */ function adminWithdrawalToken( uint256 _tokenRegistryId, address _tokenContract, uint256 _tokenIdentifier ) public virtual onlyOwner { require( tokenRegistry[_tokenRegistryId].tokenIdentifier == _tokenIdentifier && tokenRegistry[_tokenRegistryId].tokenContract == _tokenContract, "WedreamEscrow: Invalid Registry Entry" ); transferToken( tokenRegistry[_tokenRegistryId].tokenContract, tokenRegistry[_tokenRegistryId].tokenIdentifier, tokenRegistry[_tokenRegistryId].tokenOwner ); emit TokenWithdrawal( _tokenRegistryId, tokenRegistry[_tokenRegistryId].tokenContract, tokenRegistry[_tokenRegistryId].tokenIdentifier, msg.sender, tokenRegistry[_tokenRegistryId].tokenOwner ); delete tokenRegistry[_tokenRegistryId]; } /** * @dev Function for auction winner to fulfill the bid. Token is exchanged with ETH minus {escrowSharePercentage} fee * Requirements: * - minimumPrice needs to be more than 0 * - ETH send must match the bid value * - transaction needs to be sent by the bidder wallet * - TokenContract and TokenIdentifier has to match our TokenRegistryEntry * - Auction must have ended * * @param acceptedBidSignature id in the token registry signed by ESCROW_WALLET * @param bidData Struct of Bid */ function fulfillBid( bytes memory acceptedBidSignature, LibBid.Bid memory bidData ) public payable { require( tokenRegistry[bidData.tokenRegistryId].minimumPrice > 0, "WedreamEscrow: Token is not on Sale" ); require( msg.value >= tokenRegistry[bidData.tokenRegistryId].minimumPrice, "WedreamEscrow: Reserve Price not met" ); require( msg.value == bidData.amount, "WedreamEscrow: Amount send does not match bid" ); require( msg.sender == bidData.winnerWallet, "WedreamEscrow: Wrong Wallet" ); require( tokenRegistry[bidData.tokenRegistryId].tokenContract == bidData.tokenContract, "WedreamEscrow: Mismatch of Token Data (Contract)" ); require( tokenRegistry[bidData.tokenRegistryId].tokenIdentifier == bidData.tokenIdentifier, "WedreamEscrow: Mismatch of Token Data (Identifier)" ); require( (auctionEndsAt < block.timestamp), "WedreamEscrow: Auction still running" ); validateBid(bidData, acceptedBidSignature); uint256 totalReceived = msg.value; uint256 escrowPayout = (totalReceived * escrowSharePercentage) / 10000; uint256 ownerPayout = totalReceived - escrowPayout; payable(owner()).transfer(escrowPayout); payable(tokenRegistry[bidData.tokenRegistryId].tokenOwner).transfer(ownerPayout); transferToken( tokenRegistry[bidData.tokenRegistryId].tokenContract, tokenRegistry[bidData.tokenRegistryId].tokenIdentifier, msg.sender ); emit FulfillBid( bidData.tokenRegistryId, tokenRegistry[bidData.tokenRegistryId].tokenContract, tokenRegistry[bidData.tokenRegistryId].tokenIdentifier, msg.sender, tokenRegistry[bidData.tokenRegistryId].minimumPrice, msg.value ); delete tokenRegistry[bidData.tokenRegistryId]; } /** * @dev Function to send a Token owned by this contract to an address * Requirements: * - Token must be owned by this contract. * * @param tokenContractAddress ERC721 Contract Address * @param tokenIdentifier Identifier on the token contract * @param tokenReceiver Receiver of the NFT */ function transferToken( address tokenContractAddress, uint256 tokenIdentifier, address tokenReceiver ) private { require( IERC721(tokenContractAddress).ownerOf(tokenIdentifier) == address(this), "WedreamEscrow: NFT is not owned by Escrow Contract" ); IERC721(tokenContractAddress).safeTransferFrom( address(this), tokenReceiver, tokenIdentifier ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; /** * @dev Bid Struct definition used to validate EIP712. * */ library LibBid { bytes32 private constant BID_TYPE = keccak256( "Bid(address winnerWallet,address tokenContract,uint256 tokenIdentifier,uint256 tokenRegistryId,uint256 amount)" ); struct Bid { address winnerWallet; address tokenContract; uint256 tokenIdentifier; uint256 tokenRegistryId; uint256 amount; } function bidHash(Bid memory bid) internal pure returns (bytes32) { return keccak256( abi.encode( BID_TYPE, bid.winnerWallet, bid.tokenContract, bid.tokenIdentifier, bid.tokenRegistryId, bid.amount ) ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import "./LibBid.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; /** * @dev EIP712 based contract module which validates a Bid. * The signer is {ESCROW_WALLET} and checks for integrity of * the bid. {bid} is struct defined in LibBid. * */ abstract contract BidValidator is EIP712 { constructor() EIP712("WedreamEscrow", "1") {} // Wallet that signs our bides address public ESCROW_WALLET; /** * @dev Validates if {bid} was signed by {ESCROW_WALLET} and created {signature}. * * @param bid Struct with bid properties * @param signature Signature to decode and compare */ function validateBid(LibBid.Bid memory bid, bytes memory signature) internal view { bytes32 bidHash = LibBid.bidHash(bid); bytes32 digest = _hashTypedDataV4(bidHash); address signer = ECDSA.recover(digest, signature); require( signer == ESCROW_WALLET, "BidValidator: Bid signature verification error" ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; import "./ECDSA.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 1 }, "evmVersion": "london", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenRegistryId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenIdentifier","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paidAmount","type":"uint256"}],"name":"FulfillBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenRegistryId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMiniumPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMiniumPrice","type":"uint256"},{"indexed":false,"internalType":"address","name":"priceChanger","type":"address"}],"name":"MinmumPriceChange","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":false,"internalType":"uint256","name":"tokenRegistryId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenIdentifier","type":"uint256"},{"indexed":false,"internalType":"address","name":"withdrawalInitiator","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawalReceiver","type":"address"}],"name":"TokenWithdrawal","type":"event"},{"inputs":[],"name":"ESCROW_WALLET","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_escrowSharePercentage","type":"uint256"}],"name":"adminChangeEscrowSharePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_escrow_wallet","type":"address"}],"name":"adminChangeEscrowWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_auctionStartsAt","type":"uint256"},{"internalType":"uint256","name":"_auctionEndsAt","type":"uint256"},{"internalType":"uint256","name":"_withdrawalLockedUntil","type":"uint256"}],"name":"adminChangePeriods","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenRegistryId","type":"uint256"},{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_tokenIdentifier","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"}],"name":"adminSetMinimumPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminWithdrawalEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenRegistryId","type":"uint256"},{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_tokenIdentifier","type":"uint256"}],"name":"adminWithdrawalToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auctionEndsAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionStartsAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"escrowSharePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"acceptedBidSignature","type":"bytes"},{"components":[{"internalType":"address","name":"winnerWallet","type":"address"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenIdentifier","type":"uint256"},{"internalType":"uint256","name":"tokenRegistryId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct LibBid.Bid","name":"bidData","type":"tuple"}],"name":"fulfillBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"tokenOwnerAddress","type":"address"},{"internalType":"uint256","name":"tokenIdentifier","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenRegistryId","type":"uint256"},{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_tokenIdentifier","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"}],"name":"setMinimumPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenCountByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdsByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenRegistry","outputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenIdentifier","type":"uint256"},{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenRegistryId","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalLockedUntil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenRegistryId","type":"uint256"},{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_tokenIdentifier","type":"uint256"}],"name":"withdrawalToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61014060405234801561001157600080fd5b50604080518082018252600d81526c5765647265616d457363726f7760981b6020808301918252835180850190945260018452603160f81b908401528151902060e08190527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6100f48184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c0526101205250610114925061010f9150503390565b610144565b600080546001600160a01b03191673901e0fdaf9326a7b962793d2518ab4cc6e4fef0417905560fa600655610196565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60805160a05160c05160e0516101005161012051611dd36101e56000396000611523015260006115720152600061154d015260006114a6015260006114d0015260006114fa0152611dd36000f3fe6080604052600436106101055760003560e01c8063030bfc341461010a5780630d49f4bf1461012c57806313ce3ab71461014c578063150b7a021461016c57806329bd355b146101aa5780634961d032146101ca5780635df0f1cc146101ee57806369df6db414610203578063715018a6146102235780637d39e831146102385780638385fa0f1461024e5780638577c8c2146102865780638da5cb5b146102a65780639a59d4a7146102bb578063a49668e4146102d1578063a9197fd5146102e8578063aefeba631461036d578063b8191d571461038d578063d05c0ed3146103ad578063dc16b07e146103c3578063e5ebdee4146103f0578063f2fde38b14610403575b600080fd5b34801561011657600080fd5b5061012a610125366004611917565b610423565b005b34801561013857600080fd5b5061012a610147366004611954565b6105a2565b34801561015857600080fd5b5061012a610167366004611917565b610785565b34801561017857600080fd5b5061018c610187366004611a56565b610809565b6040516001600160e01b031990911681526020015b60405180910390f35b3480156101b657600080fd5b5061012a6101c5366004611ac1565b61090c565b3480156101d657600080fd5b506101e060045481565b6040519081526020016101a1565b3480156101fa57600080fd5b5061012a61095d565b34801561020f57600080fd5b5061012a61021e366004611ae5565b6109b2565b34801561022f57600080fd5b5061012a610a52565b34801561024457600080fd5b506101e060035481565b34801561025a57600080fd5b5060005461026e906001600160a01b031681565b6040516001600160a01b0390911681526020016101a1565b34801561029257600080fd5b506101e06102a1366004611afe565b610a8b565b3480156102b257600080fd5b5061026e610abc565b3480156102c757600080fd5b506101e060055481565b3480156102dd57600080fd5b506002546101e09081565b3480156102f457600080fd5b50610338610303366004611ae5565b60076020526000908152604090208054600182015460028301546003909301546001600160a01b039283169391929091169084565b6040516101a194939291906001600160a01b039485168152602081019390935292166040820152606081019190915260800190565b34801561037957600080fd5b5061012a610388366004611954565b610acb565b34801561039957600080fd5b5061012a6103a8366004611b2a565b610b4f565b3480156103b957600080fd5b506101e060065481565b3480156103cf57600080fd5b506101e06103de366004611ac1565b60096020526000908152604090205481565b61012a6103fe366004611b56565b610bf1565b34801561040f57600080fd5b5061012a61041e366004611ac1565b6110a5565b6000848152600760205260409020600201546001600160a01b031633146104655760405162461bcd60e51b815260040161045c90611bf8565b60405180910390fd5b6000848152600760205260409020600101548214801561049e57506000848152600760205260409020546001600160a01b038481169116145b6104ba5760405162461bcd60e51b815260040161045c90611c2f565b6004544210806104cb575042600354105b61053c5760405162461bcd60e51b815260206004820152603c60248201527f5765647265616d457363726f773a204d696e696d756d2050726963652043686160448201527b1b99d9481a5cc818dd5c9c995b9d1b1e481b9bdd08185b1b1bddd95960221b606482015260840161045c565b60008481526007602090815260409182902060030180549084905582518781529182018190529181018390523360608201527fc24b7c0d2143fabcfc02278376cda260752ec16992537aa11dba0426992ae2ad9060800160405180910390a15050505050565b6000838152600760205260409020600201546001600160a01b031633146105db5760405162461bcd60e51b815260040161045c90611bf8565b6000838152600760205260409020600101548114801561061457506000838152600760205260409020546001600160a01b038381169116145b6106305760405162461bcd60e51b815260040161045c90611c2f565b600454421080610641575042600354105b6106a55760405162461bcd60e51b815260206004820152602f60248201527f5765647265616d457363726f773a205769746864726177616c2063757272656e60448201526e1d1b1e481b9bdd08185b1b1bddd959608a1b606482015260840161045c565b6000838152600760205260409020805460018201546002909201546106d8926001600160a01b0392831692909116611145565b6000838152600760209081526040918290208054600182015460029092015484518881526001600160a01b03928316948101949094528385019290925233606084015216608082015290517f7847512811390ff3fcbd24019c07ba656d246c3cef230cd028cbf2bd7136cef69181900360a00190a15050600090815260076020526040812080546001600160a01b0319908116825560018201839055600282018054909116905560030155565b3361078e610abc565b6001600160a01b0316146107b45760405162461bcd60e51b815260040161045c90611c74565b600084815260076020526040902060010154821480156107ed57506000848152600760205260409020546001600160a01b038481169116145b61053c5760405162461bcd60e51b815260040161045c90611c2f565b6000610819600280546001019055565b6040518060800160405280336001600160a01b03168152602001848152602001856001600160a01b0316815260200160008152506007600061085a60025490565b815260208082019290925260409081016000908120845181546001600160a01b03199081166001600160a01b039283161783558686015160018085019190915587860151600280860180549094169185169190911790925560609097015160039093019290925589168083526008855283832091548254968701835591835284832090950155928352600990915281208054916108f683611cbf565b90915550630a85bd0160e11b9695505050505050565b33610915610abc565b6001600160a01b03161461093b5760405162461bcd60e51b815260040161045c90611c74565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b33610966610abc565b6001600160a01b03161461098c5760405162461bcd60e51b815260040161045c90611c74565b60405133904780156108fc02916000818181858888f193505050506109b057600080fd5b565b336109bb610abc565b6001600160a01b0316146109e15760405162461bcd60e51b815260040161045c90611c74565b612710811115610a4d5760405162461bcd60e51b815260206004820152603160248201527f5765647265616d457363726f773a20496e76616c69642073686172652070657260448201527063656e7461676520283e2031303030302960781b606482015260840161045c565b600655565b33610a5b610abc565b6001600160a01b031614610a815760405162461bcd60e51b815260040161045c90611c74565b6109b0600061128e565b60086020528160005260406000208181548110610aa757600080fd5b90600052602060002001600091509150505481565b6001546001600160a01b031690565b33610ad4610abc565b6001600160a01b031614610afa5760405162461bcd60e51b815260040161045c90611c74565b60008381526007602052604090206001015481148015610b3357506000838152600760205260409020546001600160a01b038381169116145b6106a55760405162461bcd60e51b815260040161045c90611c2f565b33610b58610abc565b6001600160a01b031614610b7e5760405162461bcd60e51b815260040161045c90611c74565b8183108015610b8c57508082105b610be35760405162461bcd60e51b815260206004820152602260248201527f5765647265616d457363726f773a20496e76616c6964206461746573206f726460448201526132b960f11b606482015260840161045c565b600492909255600555600355565b6060810151600090815260076020526040902060030154610c605760405162461bcd60e51b815260206004820152602360248201527f5765647265616d457363726f773a20546f6b656e206973206e6f74206f6e2053604482015262616c6560e81b606482015260840161045c565b6060810151600090815260076020526040902060030154341015610cd25760405162461bcd60e51b8152602060048201526024808201527f5765647265616d457363726f773a2052657365727665205072696365206e6f74604482015263081b595d60e21b606482015260840161045c565b80608001513414610d3b5760405162461bcd60e51b815260206004820152602d60248201527f5765647265616d457363726f773a20416d6f756e742073656e6420646f65732060448201526c1b9bdd081b585d18da08189a59609a1b606482015260840161045c565b80516001600160a01b03163314610d925760405162461bcd60e51b815260206004820152601b60248201527a15d9591c99585b515cd8dc9bddce8815dc9bdb99c815d85b1b195d602a1b604482015260640161045c565b6020808201516060830151600090815260079092526040909120546001600160a01b03908116911614610e0e5760405162461bcd60e51b81526020600482015260306024820152600080516020611d7e83398151915260448201526f20446174612028436f6e74726163742960801b606482015260840161045c565b604080820151606083015160009081526007602052919091206001015414610e815760405162461bcd60e51b81526020600482015260326024820152600080516020611d7e833981519152604482015271204461746120284964656e7469666965722960701b606482015260840161045c565b4260055410610ede5760405162461bcd60e51b8152602060048201526024808201527f5765647265616d457363726f773a2041756374696f6e207374696c6c2072756e6044820152636e696e6760e01b606482015260840161045c565b610ee881836112e0565b600654349060009061271090610efe9084611cda565b610f089190611cf9565b90506000610f168284611d1b565b9050610f20610abc565b6001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015610f58573d6000803e3d6000fd5b5060608401516000908152600760205260408082206002015490516001600160a01b039091169183156108fc02918491818181858888f19350505050158015610fa5573d6000803e3d6000fd5b506060840180516000908152600760205260408082205492518252902060010154610fda916001600160a01b03169033611145565b60608481018051600081815260076020908152604080832054855184528184206001015495518452928190206003015481519485526001600160a01b0390931691840191909152820192909252339281019290925260808201523460a08201527f0884c9ce2617e9a663c80ac6ebbae298e9557d9a262db4cc310d568068f2496e9060c00160405180910390a150505060600151600090815260076020526040812080546001600160a01b031990811682556001820183905560028201805490911690556003015550565b336110ae610abc565b6001600160a01b0316146110d45760405162461bcd60e51b815260040161045c90611c74565b6001600160a01b0381166111395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161045c565b6111428161128e565b50565b6040516331a9108f60e11b81526004810183905230906001600160a01b03851690636352211e90602401602060405180830381865afa15801561118c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b09190611d32565b6001600160a01b0316146112215760405162461bcd60e51b815260206004820152603260248201527f5765647265616d457363726f773a204e4654206973206e6f74206f776e656420604482015271189e48115cd8dc9bddc810dbdb9d1c9858dd60721b606482015260840161045c565b604051632142170760e11b81523060048201526001600160a01b038281166024830152604482018490528416906342842e0e90606401600060405180830381600087803b15801561127157600080fd5b505af1158015611285573d6000803e3d6000fd5b50505050505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006112eb83611384565b905060006112f882611421565b905060006113068285611475565b6000549091506001600160a01b0380831691161461137d5760405162461bcd60e51b815260206004820152602e60248201527f42696456616c696461746f723a20426964207369676e6174757265207665726960448201526d3334b1b0ba34b7b71032b93937b960911b606482015260840161045c565b5050505050565b60007f25394b59130c71772b353c3cc36c384791592323c8f2caccf49cf9c9adefca2a82600001518360200151846040015185606001518660800151604051602001611404969594939291909586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b604051602081830303815290604052805190602001209050919050565b600061146f61142e611499565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b92915050565b600080600061148485856115c0565b9150915061149181611630565b509392505050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156114f257507f000000000000000000000000000000000000000000000000000000000000000046145b1561151c57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000808251604114156115f75760208301516040840151606085015160001a6115eb878285856117e6565b94509450505050611629565b82516040141561162157602083015160408401516116168683836118c9565b935093505050611629565b506000905060025b9250929050565b600081600481111561164457611644611d4f565b141561164d5750565b600181600481111561166157611661611d4f565b14156116aa5760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015260640161045c565b60028160048111156116be576116be611d4f565b141561170c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161045c565b600381600481111561172057611720611d4f565b14156117795760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161045c565b600481600481111561178d5761178d611d4f565b14156111425760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161045c565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b0383111561181357506000905060036118c0565b8460ff16601b1415801561182b57508460ff16601c14155b1561183c57506000905060046118c0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611890573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166118b9576000600192509250506118c0565b9150600090505b94509492505050565b6000806001600160ff1b038316816118e660ff86901c601b611d65565b90506118f4878288856117e6565b935093505050935093915050565b6001600160a01b038116811461114257600080fd5b6000806000806080858703121561192d57600080fd5b84359350602085013561193f81611902565b93969395505050506040820135916060013590565b60008060006060848603121561196957600080fd5b83359250602084013561197b81611902565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b03811182821017156119c4576119c461198c565b60405290565b600082601f8301126119db57600080fd5b81356001600160401b03808211156119f5576119f561198c565b604051601f8301601f19908116603f01168101908282118183101715611a1d57611a1d61198c565b81604052838152866020858801011115611a3657600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060808587031215611a6c57600080fd5b8435611a7781611902565b93506020850135611a8781611902565b92506040850135915060608501356001600160401b03811115611aa957600080fd5b611ab5878288016119ca565b91505092959194509250565b600060208284031215611ad357600080fd5b8135611ade81611902565b9392505050565b600060208284031215611af757600080fd5b5035919050565b60008060408385031215611b1157600080fd5b8235611b1c81611902565b946020939093013593505050565b600080600060608486031215611b3f57600080fd5b505081359360208301359350604090920135919050565b60008082840360c0811215611b6a57600080fd5b83356001600160401b03811115611b8057600080fd5b611b8c868287016119ca565b93505060a0601f1982011215611ba157600080fd5b50611baa6119a2565b6020840135611bb881611902565b81526040840135611bc881611902565b80602083015250606084013560408201526080840135606082015260a08401356080820152809150509250929050565b6020808252601d908201527f5765647265616d457363726f773a20496e76616c69642053656e646572000000604082015260600190565b60208082526025908201527f5765647265616d457363726f773a20496e76616c696420526567697374727920604082015264456e74727960d81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600019821415611cd357611cd3611ca9565b5060010190565b6000816000190483118215151615611cf457611cf4611ca9565b500290565b600082611d1657634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611d2d57611d2d611ca9565b500390565b600060208284031215611d4457600080fd5b8151611ade81611902565b634e487b7160e01b600052602160045260246000fd5b60008219821115611d7857611d78611ca9565b50019056fe5765647265616d457363726f773a204d69736d61746368206f6620546f6b656ea2646970667358221220df94bc625c4360e3f4c76fcd1100bf77f3f5d3bfd7a0a1accfaacbb71c8f4b6e64736f6c634300080a0033
Deployed Bytecode
0x6080604052600436106101055760003560e01c8063030bfc341461010a5780630d49f4bf1461012c57806313ce3ab71461014c578063150b7a021461016c57806329bd355b146101aa5780634961d032146101ca5780635df0f1cc146101ee57806369df6db414610203578063715018a6146102235780637d39e831146102385780638385fa0f1461024e5780638577c8c2146102865780638da5cb5b146102a65780639a59d4a7146102bb578063a49668e4146102d1578063a9197fd5146102e8578063aefeba631461036d578063b8191d571461038d578063d05c0ed3146103ad578063dc16b07e146103c3578063e5ebdee4146103f0578063f2fde38b14610403575b600080fd5b34801561011657600080fd5b5061012a610125366004611917565b610423565b005b34801561013857600080fd5b5061012a610147366004611954565b6105a2565b34801561015857600080fd5b5061012a610167366004611917565b610785565b34801561017857600080fd5b5061018c610187366004611a56565b610809565b6040516001600160e01b031990911681526020015b60405180910390f35b3480156101b657600080fd5b5061012a6101c5366004611ac1565b61090c565b3480156101d657600080fd5b506101e060045481565b6040519081526020016101a1565b3480156101fa57600080fd5b5061012a61095d565b34801561020f57600080fd5b5061012a61021e366004611ae5565b6109b2565b34801561022f57600080fd5b5061012a610a52565b34801561024457600080fd5b506101e060035481565b34801561025a57600080fd5b5060005461026e906001600160a01b031681565b6040516001600160a01b0390911681526020016101a1565b34801561029257600080fd5b506101e06102a1366004611afe565b610a8b565b3480156102b257600080fd5b5061026e610abc565b3480156102c757600080fd5b506101e060055481565b3480156102dd57600080fd5b506002546101e09081565b3480156102f457600080fd5b50610338610303366004611ae5565b60076020526000908152604090208054600182015460028301546003909301546001600160a01b039283169391929091169084565b6040516101a194939291906001600160a01b039485168152602081019390935292166040820152606081019190915260800190565b34801561037957600080fd5b5061012a610388366004611954565b610acb565b34801561039957600080fd5b5061012a6103a8366004611b2a565b610b4f565b3480156103b957600080fd5b506101e060065481565b3480156103cf57600080fd5b506101e06103de366004611ac1565b60096020526000908152604090205481565b61012a6103fe366004611b56565b610bf1565b34801561040f57600080fd5b5061012a61041e366004611ac1565b6110a5565b6000848152600760205260409020600201546001600160a01b031633146104655760405162461bcd60e51b815260040161045c90611bf8565b60405180910390fd5b6000848152600760205260409020600101548214801561049e57506000848152600760205260409020546001600160a01b038481169116145b6104ba5760405162461bcd60e51b815260040161045c90611c2f565b6004544210806104cb575042600354105b61053c5760405162461bcd60e51b815260206004820152603c60248201527f5765647265616d457363726f773a204d696e696d756d2050726963652043686160448201527b1b99d9481a5cc818dd5c9c995b9d1b1e481b9bdd08185b1b1bddd95960221b606482015260840161045c565b60008481526007602090815260409182902060030180549084905582518781529182018190529181018390523360608201527fc24b7c0d2143fabcfc02278376cda260752ec16992537aa11dba0426992ae2ad9060800160405180910390a15050505050565b6000838152600760205260409020600201546001600160a01b031633146105db5760405162461bcd60e51b815260040161045c90611bf8565b6000838152600760205260409020600101548114801561061457506000838152600760205260409020546001600160a01b038381169116145b6106305760405162461bcd60e51b815260040161045c90611c2f565b600454421080610641575042600354105b6106a55760405162461bcd60e51b815260206004820152602f60248201527f5765647265616d457363726f773a205769746864726177616c2063757272656e60448201526e1d1b1e481b9bdd08185b1b1bddd959608a1b606482015260840161045c565b6000838152600760205260409020805460018201546002909201546106d8926001600160a01b0392831692909116611145565b6000838152600760209081526040918290208054600182015460029092015484518881526001600160a01b03928316948101949094528385019290925233606084015216608082015290517f7847512811390ff3fcbd24019c07ba656d246c3cef230cd028cbf2bd7136cef69181900360a00190a15050600090815260076020526040812080546001600160a01b0319908116825560018201839055600282018054909116905560030155565b3361078e610abc565b6001600160a01b0316146107b45760405162461bcd60e51b815260040161045c90611c74565b600084815260076020526040902060010154821480156107ed57506000848152600760205260409020546001600160a01b038481169116145b61053c5760405162461bcd60e51b815260040161045c90611c2f565b6000610819600280546001019055565b6040518060800160405280336001600160a01b03168152602001848152602001856001600160a01b0316815260200160008152506007600061085a60025490565b815260208082019290925260409081016000908120845181546001600160a01b03199081166001600160a01b039283161783558686015160018085019190915587860151600280860180549094169185169190911790925560609097015160039093019290925589168083526008855283832091548254968701835591835284832090950155928352600990915281208054916108f683611cbf565b90915550630a85bd0160e11b9695505050505050565b33610915610abc565b6001600160a01b03161461093b5760405162461bcd60e51b815260040161045c90611c74565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b33610966610abc565b6001600160a01b03161461098c5760405162461bcd60e51b815260040161045c90611c74565b60405133904780156108fc02916000818181858888f193505050506109b057600080fd5b565b336109bb610abc565b6001600160a01b0316146109e15760405162461bcd60e51b815260040161045c90611c74565b612710811115610a4d5760405162461bcd60e51b815260206004820152603160248201527f5765647265616d457363726f773a20496e76616c69642073686172652070657260448201527063656e7461676520283e2031303030302960781b606482015260840161045c565b600655565b33610a5b610abc565b6001600160a01b031614610a815760405162461bcd60e51b815260040161045c90611c74565b6109b0600061128e565b60086020528160005260406000208181548110610aa757600080fd5b90600052602060002001600091509150505481565b6001546001600160a01b031690565b33610ad4610abc565b6001600160a01b031614610afa5760405162461bcd60e51b815260040161045c90611c74565b60008381526007602052604090206001015481148015610b3357506000838152600760205260409020546001600160a01b038381169116145b6106a55760405162461bcd60e51b815260040161045c90611c2f565b33610b58610abc565b6001600160a01b031614610b7e5760405162461bcd60e51b815260040161045c90611c74565b8183108015610b8c57508082105b610be35760405162461bcd60e51b815260206004820152602260248201527f5765647265616d457363726f773a20496e76616c6964206461746573206f726460448201526132b960f11b606482015260840161045c565b600492909255600555600355565b6060810151600090815260076020526040902060030154610c605760405162461bcd60e51b815260206004820152602360248201527f5765647265616d457363726f773a20546f6b656e206973206e6f74206f6e2053604482015262616c6560e81b606482015260840161045c565b6060810151600090815260076020526040902060030154341015610cd25760405162461bcd60e51b8152602060048201526024808201527f5765647265616d457363726f773a2052657365727665205072696365206e6f74604482015263081b595d60e21b606482015260840161045c565b80608001513414610d3b5760405162461bcd60e51b815260206004820152602d60248201527f5765647265616d457363726f773a20416d6f756e742073656e6420646f65732060448201526c1b9bdd081b585d18da08189a59609a1b606482015260840161045c565b80516001600160a01b03163314610d925760405162461bcd60e51b815260206004820152601b60248201527a15d9591c99585b515cd8dc9bddce8815dc9bdb99c815d85b1b195d602a1b604482015260640161045c565b6020808201516060830151600090815260079092526040909120546001600160a01b03908116911614610e0e5760405162461bcd60e51b81526020600482015260306024820152600080516020611d7e83398151915260448201526f20446174612028436f6e74726163742960801b606482015260840161045c565b604080820151606083015160009081526007602052919091206001015414610e815760405162461bcd60e51b81526020600482015260326024820152600080516020611d7e833981519152604482015271204461746120284964656e7469666965722960701b606482015260840161045c565b4260055410610ede5760405162461bcd60e51b8152602060048201526024808201527f5765647265616d457363726f773a2041756374696f6e207374696c6c2072756e6044820152636e696e6760e01b606482015260840161045c565b610ee881836112e0565b600654349060009061271090610efe9084611cda565b610f089190611cf9565b90506000610f168284611d1b565b9050610f20610abc565b6001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015610f58573d6000803e3d6000fd5b5060608401516000908152600760205260408082206002015490516001600160a01b039091169183156108fc02918491818181858888f19350505050158015610fa5573d6000803e3d6000fd5b506060840180516000908152600760205260408082205492518252902060010154610fda916001600160a01b03169033611145565b60608481018051600081815260076020908152604080832054855184528184206001015495518452928190206003015481519485526001600160a01b0390931691840191909152820192909252339281019290925260808201523460a08201527f0884c9ce2617e9a663c80ac6ebbae298e9557d9a262db4cc310d568068f2496e9060c00160405180910390a150505060600151600090815260076020526040812080546001600160a01b031990811682556001820183905560028201805490911690556003015550565b336110ae610abc565b6001600160a01b0316146110d45760405162461bcd60e51b815260040161045c90611c74565b6001600160a01b0381166111395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161045c565b6111428161128e565b50565b6040516331a9108f60e11b81526004810183905230906001600160a01b03851690636352211e90602401602060405180830381865afa15801561118c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b09190611d32565b6001600160a01b0316146112215760405162461bcd60e51b815260206004820152603260248201527f5765647265616d457363726f773a204e4654206973206e6f74206f776e656420604482015271189e48115cd8dc9bddc810dbdb9d1c9858dd60721b606482015260840161045c565b604051632142170760e11b81523060048201526001600160a01b038281166024830152604482018490528416906342842e0e90606401600060405180830381600087803b15801561127157600080fd5b505af1158015611285573d6000803e3d6000fd5b50505050505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006112eb83611384565b905060006112f882611421565b905060006113068285611475565b6000549091506001600160a01b0380831691161461137d5760405162461bcd60e51b815260206004820152602e60248201527f42696456616c696461746f723a20426964207369676e6174757265207665726960448201526d3334b1b0ba34b7b71032b93937b960911b606482015260840161045c565b5050505050565b60007f25394b59130c71772b353c3cc36c384791592323c8f2caccf49cf9c9adefca2a82600001518360200151846040015185606001518660800151604051602001611404969594939291909586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b604051602081830303815290604052805190602001209050919050565b600061146f61142e611499565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b92915050565b600080600061148485856115c0565b9150915061149181611630565b509392505050565b6000306001600160a01b037f000000000000000000000000d9f6d49a72e9e36ece53c8d2087c1a0773c388ee161480156114f257507f000000000000000000000000000000000000000000000000000000000000000146145b1561151c57507f6b8a6f48b262c227f06f1f4b61caee3160c96512ff5a1567e3b8e5a32bc3984b90565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f0bfe8ec45d2ed6689fd4357a17322e1202b97f8c70d3f3cbc13f29271659f36d828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000808251604114156115f75760208301516040840151606085015160001a6115eb878285856117e6565b94509450505050611629565b82516040141561162157602083015160408401516116168683836118c9565b935093505050611629565b506000905060025b9250929050565b600081600481111561164457611644611d4f565b141561164d5750565b600181600481111561166157611661611d4f565b14156116aa5760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015260640161045c565b60028160048111156116be576116be611d4f565b141561170c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161045c565b600381600481111561172057611720611d4f565b14156117795760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161045c565b600481600481111561178d5761178d611d4f565b14156111425760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161045c565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b0383111561181357506000905060036118c0565b8460ff16601b1415801561182b57508460ff16601c14155b1561183c57506000905060046118c0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611890573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166118b9576000600192509250506118c0565b9150600090505b94509492505050565b6000806001600160ff1b038316816118e660ff86901c601b611d65565b90506118f4878288856117e6565b935093505050935093915050565b6001600160a01b038116811461114257600080fd5b6000806000806080858703121561192d57600080fd5b84359350602085013561193f81611902565b93969395505050506040820135916060013590565b60008060006060848603121561196957600080fd5b83359250602084013561197b81611902565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b03811182821017156119c4576119c461198c565b60405290565b600082601f8301126119db57600080fd5b81356001600160401b03808211156119f5576119f561198c565b604051601f8301601f19908116603f01168101908282118183101715611a1d57611a1d61198c565b81604052838152866020858801011115611a3657600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060808587031215611a6c57600080fd5b8435611a7781611902565b93506020850135611a8781611902565b92506040850135915060608501356001600160401b03811115611aa957600080fd5b611ab5878288016119ca565b91505092959194509250565b600060208284031215611ad357600080fd5b8135611ade81611902565b9392505050565b600060208284031215611af757600080fd5b5035919050565b60008060408385031215611b1157600080fd5b8235611b1c81611902565b946020939093013593505050565b600080600060608486031215611b3f57600080fd5b505081359360208301359350604090920135919050565b60008082840360c0811215611b6a57600080fd5b83356001600160401b03811115611b8057600080fd5b611b8c868287016119ca565b93505060a0601f1982011215611ba157600080fd5b50611baa6119a2565b6020840135611bb881611902565b81526040840135611bc881611902565b80602083015250606084013560408201526080840135606082015260a08401356080820152809150509250929050565b6020808252601d908201527f5765647265616d457363726f773a20496e76616c69642053656e646572000000604082015260600190565b60208082526025908201527f5765647265616d457363726f773a20496e76616c696420526567697374727920604082015264456e74727960d81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600019821415611cd357611cd3611ca9565b5060010190565b6000816000190483118215151615611cf457611cf4611ca9565b500290565b600082611d1657634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611d2d57611d2d611ca9565b500390565b600060208284031215611d4457600080fd5b8151611ade81611902565b634e487b7160e01b600052602160045260246000fd5b60008219821115611d7857611d78611ca9565b50019056fe5765647265616d457363726f773a204d69736d61746368206f6620546f6b656ea2646970667358221220df94bc625c4360e3f4c76fcd1100bf77f3f5d3bfd7a0a1accfaacbb71c8f4b6e64736f6c634300080a0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.