Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,482 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint | 14564513 | 1026 days ago | IN | 0.05 ETH | 0.00109679 | ||||
Mint | 14217990 | 1080 days ago | IN | 0.05 ETH | 0.00232173 | ||||
Mint | 13926496 | 1125 days ago | IN | 0.25 ETH | 0.00129178 | ||||
Claim | 13858840 | 1135 days ago | IN | 0 ETH | 0.27867079 | ||||
Claim | 13858827 | 1135 days ago | IN | 0 ETH | 0.00347033 | ||||
Claim | 13858743 | 1135 days ago | IN | 0 ETH | 0.00220818 | ||||
Claim | 13816848 | 1142 days ago | IN | 0 ETH | 0.00161751 | ||||
Mint | 13714553 | 1158 days ago | IN | 0.05 ETH | 0.00184637 | ||||
Mint | 13714499 | 1158 days ago | IN | 0.05 ETH | 0.00214179 | ||||
Claim | 13708031 | 1159 days ago | IN | 0 ETH | 0.93950795 | ||||
Claim | 13690486 | 1162 days ago | IN | 0 ETH | 0.04478424 | ||||
Claim | 13690372 | 1162 days ago | IN | 0 ETH | 0.31733068 | ||||
Claim | 13686539 | 1163 days ago | IN | 0 ETH | 0.03994647 | ||||
Claim | 13685161 | 1163 days ago | IN | 0 ETH | 0.11390558 | ||||
Mint | 13674932 | 1164 days ago | IN | 0.05 ETH | 0.00239243 | ||||
Claim | 13674844 | 1164 days ago | IN | 0 ETH | 0.04069486 | ||||
Claim | 13671656 | 1165 days ago | IN | 0 ETH | 0.07234475 | ||||
Mint | 13670325 | 1165 days ago | IN | 0.05 ETH | 0.00232199 | ||||
Mint | 13670325 | 1165 days ago | IN | 0.05 ETH | 0.00232199 | ||||
Claim | 13669970 | 1165 days ago | IN | 0 ETH | 0.03195147 | ||||
Claim | 13669391 | 1165 days ago | IN | 0 ETH | 0.04397884 | ||||
Claim | 13669031 | 1165 days ago | IN | 0 ETH | 0.05794906 | ||||
Withdraw Funds | 13668463 | 1165 days ago | IN | 0 ETH | 0.01107456 | ||||
Claim | 13665996 | 1166 days ago | IN | 0 ETH | 0.13834333 | ||||
Claim | 13664593 | 1166 days ago | IN | 0 ETH | 0.04144294 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Sale
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity >=0.8.0; import {EIP712} from "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {IAvatar, Part} from "../interfaces/IAvatar.sol"; import {IDava} from "../interfaces/IDava.sol"; import {IRandomBox} from "./IRandomBox.sol"; interface IPartCollection { function unsafeMintBatch( address account, uint256[] calldata partIds, uint256[] calldata amounts ) external; } contract Sale is EIP712, Ownable { using EnumerableSet for EnumerableSet.UintSet; bytes32 public constant WHITELIST_TYPE_HASH = keccak256("Whitelist(uint256 ticketAmount,address beneficiary)"); bytes32 public constant RESERVED_TYPE_HASH = keccak256("Reserved(uint256 amount,address beneficiary)"); uint16 public constant PARTS_PER_AVATAR = 3; uint16 public constant MAX_MINT_PER_TICKET = 3; uint16 public constant PRE_ALLOCATED_AMOUNT = 500; uint16 public constant MAX_MINT_PER_ACCOUNT = 100; // Supply uint16 private constant MAX_TOTAL_SUPPLY = 10000; uint16 public totalClaimedAmount = 0; uint16 public totalPreSaleAmount = 0; uint16 public totalPublicSaleAmount = 0; uint32 public immutable PRE_SALE_OPENING_TIME; uint32 public immutable PRE_SALE_CLOSING_TIME; uint32 public immutable PUBLIC_SALE_OPENING_TIME; uint32 public publicSaleClosingTime; uint56 public constant PRICE = 0.05 ether; // Parts IDava public dava; IPartCollection public davaOfficial; IRandomBox private _randomBox; mapping(address => uint256) public preSaleMintAmountOf; mapping(address => uint256) public mainSaleMintAmountOf; mapping(address => uint256) public claimedAmountOf; struct Reserved { uint256 amount; address beneficiary; } struct ClaimReq { uint8 vSig; bytes32 rSig; bytes32 sSig; Reserved reserved; } struct Whitelist { uint256 ticketAmount; address beneficiary; } struct PreSaleReq { uint8 vSig; bytes32 rSig; bytes32 sSig; Whitelist whitelist; } constructor( IDava dava_, IPartCollection davaOfficial_, IRandomBox randomBox_, uint32 presaleStart, uint32 presaleEnd, uint32 publicStart ) EIP712("AvatarSale", "V1") { dava = dava_; davaOfficial = davaOfficial_; _randomBox = randomBox_; PRE_SALE_OPENING_TIME = presaleStart; PRE_SALE_CLOSING_TIME = presaleEnd; PUBLIC_SALE_OPENING_TIME = publicStart; publicSaleClosingTime = 2**32 - 1; } modifier onlyDuringPreSale() { require( block.timestamp >= PRE_SALE_OPENING_TIME, "Sale: preSale has not started yet" ); require( block.timestamp <= PRE_SALE_CLOSING_TIME, "Sale: preSale has ended" ); _; } modifier onlyDuringPublicSale() { require( block.timestamp >= PUBLIC_SALE_OPENING_TIME, "Sale: publicSale has not started yet" ); require( block.timestamp <= publicSaleClosingTime, "Sale: publicSale has ended" ); _; } function setPublicSaleClosingTime(uint32 closingTime_) external onlyOwner { publicSaleClosingTime = closingTime_; } function claim(ClaimReq calldata claimReq, uint16 claimedAmount) external { require( msg.sender == claimReq.reserved.beneficiary, "Sale: not authorized" ); require( claimedAmount <= claimReq.reserved.amount - claimedAmountOf[msg.sender], "Sale: exceeds assigned amount" ); require( totalClaimedAmount + claimedAmount <= PRE_ALLOCATED_AMOUNT, "Sale: exceeds PRE_ALLOCATED_AMOUNT" ); _verifyClaimSig(claimReq); claimedAmountOf[msg.sender] += claimedAmount; for (uint16 i = 0; i < claimedAmount; i++) { _mintAvatarWithParts(totalClaimedAmount + i); } totalClaimedAmount += claimedAmount; } // this is for public sale. function mint(uint16 purchaseAmount) external payable onlyDuringPublicSale { require(!soldOut(), "Sale: sold out"); mainSaleMintAmountOf[msg.sender] += purchaseAmount; require( mainSaleMintAmountOf[msg.sender] <= MAX_MINT_PER_ACCOUNT, "Sale: can not purchase more than MAX_MINT_PER_ACCOUNT" ); _checkEthAmount(purchaseAmount, msg.value); uint16 davaId = _getMintableId(); for (uint16 i = 0; i < purchaseAmount; i += 1) { _mintAvatarWithParts(davaId + i); } totalPublicSaleAmount += purchaseAmount; } // this is for pre sale. function mintWithWhitelist( PreSaleReq calldata preSaleReq, uint16 purchaseAmount ) external payable onlyDuringPreSale { require( msg.sender == preSaleReq.whitelist.beneficiary, "Sale: msg.sender is not whitelisted" ); require( purchaseAmount <= (preSaleReq.whitelist.ticketAmount * MAX_MINT_PER_TICKET) - preSaleMintAmountOf[msg.sender], "Sale: exceeds assigned amount" ); _checkEthAmount(purchaseAmount, msg.value); _verifyWhitelistSig(preSaleReq); preSaleMintAmountOf[msg.sender] += purchaseAmount; uint16 davaId = _getMintableId(); for (uint16 i = 0; i < purchaseAmount; i += 1) { _mintAvatarWithParts(davaId + i); } totalPreSaleAmount += purchaseAmount; } function withdrawFunds(address payable receiver) external onlyOwner { uint256 amount = address(this).balance; receiver.transfer(amount); } function _mintAvatarWithParts(uint16 avatarId) internal { address avatar = dava.mint(address(this), uint256(avatarId)); uint256[] memory partIds = _randomBox.getPartIds(avatarId); uint256[] memory amounts = new uint256[](3); amounts[0] = 1; amounts[1] = 1; amounts[2] = 1; davaOfficial.unsafeMintBatch(avatar, partIds, amounts); Part[] memory parts = new Part[](PARTS_PER_AVATAR); for (uint16 i = 0; i < PARTS_PER_AVATAR; i += 1) { parts[i] = Part(address(davaOfficial), uint96(partIds[i])); } IAvatar(avatar).dress(parts, new bytes32[](0)); dava.transferFrom(address(this), msg.sender, avatarId); } function soldOut() public view returns (bool) { return (totalPreSaleAmount + totalPublicSaleAmount + PRE_ALLOCATED_AMOUNT == MAX_TOTAL_SUPPLY); } function _verifyClaimSig(ClaimReq calldata claimReq) internal view { bytes32 digest = _hashTypedDataV4( keccak256( abi.encode( RESERVED_TYPE_HASH, claimReq.reserved.amount, msg.sender ) ) ); address signer = ecrecover( digest, claimReq.vSig, claimReq.rSig, claimReq.sSig ); require(signer == owner(), "Sale: invalid signature"); } function _verifyWhitelistSig(PreSaleReq calldata preSaleReq) internal view { bytes32 digest = _hashTypedDataV4( keccak256( abi.encode( WHITELIST_TYPE_HASH, preSaleReq.whitelist.ticketAmount, msg.sender ) ) ); address signer = ecrecover( digest, preSaleReq.vSig, preSaleReq.rSig, preSaleReq.sSig ); require(signer == owner(), "Sale: invalid signature"); } function _getMintableId() private view returns (uint16) { uint16 id = PRE_ALLOCATED_AMOUNT + totalPreSaleAmount + totalPublicSaleAmount; require(id < MAX_TOTAL_SUPPLY, "Sale: exceeds max supply"); return id; } function _checkEthAmount(uint16 purchaseAmount, uint256 paidEth) private pure { require( paidEth >= uint256(purchaseAmount) * uint256(PRICE), "Sale: not enough eth" ); } }
// SPDX-License-Identifier: MIT 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; 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); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (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 pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT 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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
//SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.0; pragma abicoder v2; struct Part { address collection; uint96 id; } interface IAvatar { function dress(Part[] calldata partsOn, bytes32[] calldata partsOff) external; function version() external view returns (string memory); function dava() external view returns (address); function davaId() external view returns (uint256); function part(bytes32 categoryId) external view returns (Part memory); function allParts() external view returns (Part[] memory parts); function getPFP() external view returns (string memory); function getMetadata() external view returns (string memory); function externalImgUri() external view returns (string memory); }
//SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.0; pragma abicoder v2; import {IERC721} from "@openzeppelin/contracts/interfaces/IERC721.sol"; import {IHost} from "../interfaces/IHost.sol"; import {Part} from "../interfaces/IAvatar.sol"; interface IDava is IERC721, IHost { function mint(address to, uint256 id) external returns (address); function registerCollection(address collection) external; function registerCategory(bytes32 categoryId) external; function registerFrameCollection(address collection) external; function deregisterCollection(address collection) external; function deregisterCategory(bytes32 categoryId) external; function zap( uint256 tokenId, Part[] calldata partsOn, bytes32[] calldata partsOff ) external; function frameCollection() external view returns (address); function isRegisteredCollection(address collection) external view returns (bool); function isSupportedCategory(bytes32 categoryId) external view returns (bool); function isDavaPart(address collection, bytes32 categoryId) external view returns (bool); function getAvatar(uint256 id) external view returns (address); function getAllSupportedCategories() external view returns (bytes32[] memory); function getRegisteredCollections() external view returns (address[] memory); function getPFP(uint256 id) external view returns (string memory); }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.0; interface IRandomBox { function getPartIds(uint256 index) external view returns (uint256[] memory partIds); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 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 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 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 pragma solidity ^0.8.0; import "../token/ERC721/IERC721.sol";
//SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.0; pragma abicoder v2; interface IHost { function baseURI() external view returns (string memory); }
// SPDX-License-Identifier: MIT 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`, 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; }
// SPDX-License-Identifier: MIT 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); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IDava","name":"dava_","type":"address"},{"internalType":"contract IPartCollection","name":"davaOfficial_","type":"address"},{"internalType":"contract IRandomBox","name":"randomBox_","type":"address"},{"internalType":"uint32","name":"presaleStart","type":"uint32"},{"internalType":"uint32","name":"presaleEnd","type":"uint32"},{"internalType":"uint32","name":"publicStart","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"MAX_MINT_PER_ACCOUNT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_TICKET","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PARTS_PER_AVATAR","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_ALLOCATED_AMOUNT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_SALE_CLOSING_TIME","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_SALE_OPENING_TIME","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint56","name":"","type":"uint56"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_OPENING_TIME","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_TYPE_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_TYPE_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"vSig","type":"uint8"},{"internalType":"bytes32","name":"rSig","type":"bytes32"},{"internalType":"bytes32","name":"sSig","type":"bytes32"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"internalType":"struct Sale.Reserved","name":"reserved","type":"tuple"}],"internalType":"struct Sale.ClaimReq","name":"claimReq","type":"tuple"},{"internalType":"uint16","name":"claimedAmount","type":"uint16"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedAmountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dava","outputs":[{"internalType":"contract IDava","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"davaOfficial","outputs":[{"internalType":"contract IPartCollection","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mainSaleMintAmountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"purchaseAmount","type":"uint16"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"vSig","type":"uint8"},{"internalType":"bytes32","name":"rSig","type":"bytes32"},{"internalType":"bytes32","name":"sSig","type":"bytes32"},{"components":[{"internalType":"uint256","name":"ticketAmount","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"internalType":"struct Sale.Whitelist","name":"whitelist","type":"tuple"}],"internalType":"struct Sale.PreSaleReq","name":"preSaleReq","type":"tuple"},{"internalType":"uint16","name":"purchaseAmount","type":"uint16"}],"name":"mintWithWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSaleMintAmountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleClosingTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"closingTime_","type":"uint32"}],"name":"setPublicSaleClosingTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"soldOut","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimedAmount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPreSaleAmount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPublicSaleAmount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101806040526000805465ffffffffffff60a01b191690553480156200002457600080fd5b5060405162001ded38038062001ded833981016040819052620000479162000216565b604080518082018252600a81526941766174617253616c6560b01b6020808301918252835180850185526002815261563160f01b908201529151902060c08181527f4c23426613a5dc69e08fbd2787e6210aa679d4522e95a89d4dd88c4fd13a228360e08190524660a081815286517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281890196909652606081019390935260808084019290925230838201528651808403909101815291909201909452835193909201929092209052610100526200012633620001ac565b600180546001600160a01b039788166001600160a01b0319918216179091556002805496881696821696909617909555600380549490961693909416929092179093556001600160e01b031960e093841b81166101205290831b811661014052911b16610160526000805463ffffffff60d01b191663ffffffff60d01b179055620002b7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b805163ffffffff811681146200021157600080fd5b919050565b60008060008060008060c087890312156200022f578182fd5b86516200023c816200029e565b60208801519096506200024f816200029e565b604088015190955062000262816200029e565b93506200027260608801620001fc565b92506200028260808801620001fc565b91506200029260a08801620001fc565b90509295509295509295565b6001600160a01b0381168114620002b457600080fd5b50565b60805160a05160c05160e051610100516101205160e01c6101405160e01c6101605160e01c611ab26200033b60003960008181610484015261088a0152600081816102e3015261065e01526000818161054401526105d901526000611614015260006116630152600061163e015260006115c2015260006115eb0152611ab26000f3fe6080604052600436106101b75760003560e01c80638d859f3e116100ec578063bcd16e961161008a578063de8f6c9511610064578063de8f6c951461045d578063ed74d61414610566578063f2fde38b14610593578063f6fd8f12146105b357600080fd5b8063bcd16e96146104fa578063cb90110614610510578063d9a909ed1461053257600080fd5b80639c40e799116100c65780639c40e7991461045d578063b37e480e14610472578063b5a5ba60146104a6578063b6fc16cb146104c657600080fd5b80638d859f3e146103ea5780638da5cb5b1461041d5780639661cb0d1461043b57600080fd5b806339e5a26f1161015957806368742da61161013357806368742da61461036e578063715018a61461038e578063810941d7146103a3578063893da6c9146103c557600080fd5b806339e5a26f146102d157806359a64d811461031a5780635ed25c061461034e57600080fd5b8063193645041161019557806319364504146102395780631fa4f86e1461026657806323cf0a221461029e5780632f277193146102b157600080fd5b80630485978f146101bc578063066453df146101fc5780631269bfe714610224575b600080fd5b3480156101c857600080fd5b506101e96101d73660046116da565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561020857600080fd5b50610211606481565b60405161ffff90911681526020016101f3565b61023761023236600461180c565b6105d7565b005b34801561024557600080fd5b506101e96102543660046116da565b60056020526000908152604090205481565b34801561027257600080fd5b50600154610286906001600160a01b031681565b6040516001600160a01b0390911681526020016101f3565b6102376102ac36600461181e565b610888565b3480156102bd57600080fd5b506102376102cc3660046117d9565b610adb565b3480156102dd57600080fd5b506103057f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016101f3565b34801561032657600080fd5b506101e97f01b60039e26fe2ebf786fd30b959c8b4b94e41e9d251c8361f5eb3929011f6ec81565b34801561035a57600080fd5b50600254610286906001600160a01b031681565b34801561037a57600080fd5b506102376103893660046116da565b610cc1565b34801561039a57600080fd5b50610237610d28565b3480156103af57600080fd5b5060005461021190600160b01b900461ffff1681565b3480156103d157600080fd5b506103da610d5e565b60405190151581526020016101f3565b3480156103f657600080fd5b5061040566b1a2bc2ec5000081565b60405166ffffffffffffff90911681526020016101f3565b34801561042957600080fd5b506000546001600160a01b0316610286565b34801561044757600080fd5b5060005461021190600160a01b900461ffff1681565b34801561046957600080fd5b50610211600381565b34801561047e57600080fd5b506103057f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b257600080fd5b506102376104c1366004611838565b610d9c565b3480156104d257600080fd5b506101e97ffa6dcb9aba10b933a19b78f4196203cee26ec1933e740912c5b4adaeed8a052881565b34801561050657600080fd5b506102116101f481565b34801561051c57600080fd5b5060005461021190600160c01b900461ffff1681565b34801561053e57600080fd5b506103057f000000000000000000000000000000000000000000000000000000000000000081565b34801561057257600080fd5b506101e96105813660046116da565b60046020526000908152604090205481565b34801561059f57600080fd5b506102376105ae3660046116da565b610dec565b3480156105bf57600080fd5b5060005461030590600160d01b900463ffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642101561065c5760405162461bcd60e51b815260206004820152602160248201527f53616c653a2070726553616c6520686173206e6f7420737461727465642079656044820152601d60fa1b60648201526084015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff164211156106d25760405162461bcd60e51b815260206004820152601760248201527f53616c653a2070726553616c652068617320656e6465640000000000000000006044820152606401610653565b6106e260a08301608084016116da565b6001600160a01b0316336001600160a01b03161461074e5760405162461bcd60e51b815260206004820152602360248201527f53616c653a206d73672e73656e646572206973206e6f742077686974656c69736044820152621d195960ea1b6064820152608401610653565b3360009081526004602052604090205461076d600360608501356119e3565b6107779190611a02565b8161ffff1611156107ca5760405162461bcd60e51b815260206004820152601d60248201527f53616c653a20657863656564732061737369676e656420616d6f756e740000006044820152606401610653565b6107d48134610e87565b6107dd82610ee6565b336000908152600460205260408120805461ffff841692906108009084906119cb565b9091555060009050610810611031565b905060005b8261ffff168161ffff1610156108495761083761083282846119a5565b6110bf565b6108426001826119a5565b9050610815565b5081600060168282829054906101000a900461ffff1661086991906119a5565b92506101000a81548161ffff021916908361ffff160217905550505050565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642101561090a5760405162461bcd60e51b8152602060048201526024808201527f53616c653a207075626c696353616c6520686173206e6f742073746172746564604482015263081e595d60e21b6064820152608401610653565b600054600160d01b900463ffffffff164211156109695760405162461bcd60e51b815260206004820152601a60248201527f53616c653a207075626c696353616c652068617320656e6465640000000000006044820152606401610653565b610971610d5e565b156109af5760405162461bcd60e51b815260206004820152600e60248201526d14d85b194e881cdbdb19081bdd5d60921b6044820152606401610653565b336000908152600560205260408120805461ffff841692906109d29084906119cb565b90915550503360009081526005602052604090205460641015610a555760405162461bcd60e51b815260206004820152603560248201527f53616c653a2063616e206e6f74207075726368617365206d6f7265207468616e6044820152740813505617d352539517d4115497d050d0d3d55395605a1b6064820152608401610653565b610a5f8134610e87565b6000610a69611031565b905060005b8261ffff168161ffff161015610a9d57610a8b61083282846119a5565b610a966001826119a5565b9050610a6e565b5081600060188282829054906101000a900461ffff16610abd91906119a5565b92506101000a81548161ffff021916908361ffff1602179055505050565b610aeb60a08301608084016116da565b6001600160a01b0316336001600160a01b031614610b425760405162461bcd60e51b815260206004820152601460248201527314d85b194e881b9bdd08185d5d1a1bdc9a5e995960621b6044820152606401610653565b33600090815260066020526040902054610b60906060840135611a02565b8161ffff161115610bb35760405162461bcd60e51b815260206004820152601d60248201527f53616c653a20657863656564732061737369676e656420616d6f756e740000006044820152606401610653565b6000546101f490610bd0908390600160a01b900461ffff166119a5565b61ffff161115610c2d5760405162461bcd60e51b815260206004820152602260248201527f53616c653a2065786365656473205052455f414c4c4f43415445445f414d4f55604482015261139560f21b6064820152608401610653565b610c36826114cc565b336000908152600660205260408120805461ffff84169290610c599084906119cb565b90915550600090505b8161ffff168161ffff161015610ca157600054610c8f90610832908390600160a01b900461ffff166119a5565b80610c9981611a19565b915050610c62565b5080600060148282829054906101000a900461ffff16610abd91906119a5565b6000546001600160a01b03163314610ceb5760405162461bcd60e51b815260040161065390611970565b60405147906001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610d23573d6000803e3d6000fd5b505050565b6000546001600160a01b03163314610d525760405162461bcd60e51b815260040161065390611970565b610d5c600061151a565b565b60008054612710906101f490610d889061ffff600160c01b8204811691600160b01b9004166119a5565b610d9291906119a5565b61ffff1614905090565b6000546001600160a01b03163314610dc65760405162461bcd60e51b815260040161065390611970565b6000805463ffffffff909216600160d01b0263ffffffff60d01b19909216919091179055565b6000546001600160a01b03163314610e165760405162461bcd60e51b815260040161065390611970565b6001600160a01b038116610e7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610653565b610e848161151a565b50565b610e9c66b1a2bc2ec5000061ffff84166119e3565b811015610ee25760405162461bcd60e51b81526020600482015260146024820152730a6c2d8ca7440dcdee840cadcdeeaced040cae8d60631b6044820152606401610653565b5050565b604080517f01b60039e26fe2ebf786fd30b959c8b4b94e41e9d251c8361f5eb3929011f6ec6020820152606080840135928201929092523391810191909152600090610f4b906080015b6040516020818303038152906040528051906020012061156a565b90506000600182610f5f602086018661185c565b604080516000815260208181018084529490945260ff9092168282015291860135606082015290850135608082015260a0016020604051602081039080840390855afa158015610fb3573d6000803e3d6000fd5b505050602060405103519050610fd16000546001600160a01b031690565b6001600160a01b0316816001600160a01b031614610d235760405162461bcd60e51b815260206004820152601760248201527f53616c653a20696e76616c6964207369676e61747572650000000000000000006044820152606401610653565b60008054819061ffff600160c01b820481169161105991600160b01b909104166101f46119a5565b61106391906119a5565b905061271061ffff8216106110ba5760405162461bcd60e51b815260206004820152601860248201527f53616c653a2065786365656473206d617820737570706c7900000000000000006044820152606401610653565b919050565b6001546040516340c10f1960e01b815230600482015261ffff831660248201526000916001600160a01b0316906340c10f1990604401602060405180830381600087803b15801561110f57600080fd5b505af1158015611123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114791906116fd565b60035460405163c33348bd60e01b815261ffff851660048201529192506000916001600160a01b039091169063c33348bd9060240160006040518083038186803b15801561119457600080fd5b505afa1580156111a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111d09190810190611719565b60408051600380825260808201909252919250600091906020820160608036833701905050905060018160008151811061121a57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060018160018151811061124957634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060018160028151811061127857634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600254604051637bd2799760e01b81526001600160a01b0390911690637bd27997906112b7908690869086906004016118b7565b600060405180830381600087803b1580156112d157600080fd5b505af11580156112e5573d6000803e3d6000fd5b5060009250600391506112f59050565b60405190808252806020026020018201604052801561133a57816020015b60408051808201909152600080825260208201528152602001906001900390816113135790505b50905060005b600361ffff821610156113ea57604080518082019091526002546001600160a01b0316815284516020820190869061ffff851690811061139057634e487b7160e01b600052603260045260246000fd5b60200260200101516bffffffffffffffffffffffff16815250828261ffff16815181106113cd57634e487b7160e01b600052603260045260246000fd5b60209081029190910101526113e36001826119a5565b9050611340565b506040805160008152602081019182905263867cee7160e01b9091526001600160a01b0385169063867cee7190611426908490602481016118f7565b600060405180830381600087803b15801561144057600080fd5b505af1158015611454573d6000803e3d6000fd5b50506001546040516323b872dd60e01b815230600482015233602482015261ffff891660448201526001600160a01b0390911692506323b872dd9150606401600060405180830381600087803b1580156114ad57600080fd5b505af11580156114c1573d6000803e3d6000fd5b505050505050505050565b604080517ffa6dcb9aba10b933a19b78f4196203cee26ec1933e740912c5b4adaeed8a05286020820152606080840135928201929092523391810191909152600090610f4b90608001610f30565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006115b86115776115be565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b92915050565b60007f000000000000000000000000000000000000000000000000000000000000000046141561160d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600060a082840312156116c2578081fd5b50919050565b803561ffff811681146110ba57600080fd5b6000602082840312156116eb578081fd5b81356116f681611a67565b9392505050565b60006020828403121561170e578081fd5b81516116f681611a67565b6000602080838503121561172b578182fd5b825167ffffffffffffffff80821115611742578384fd5b818501915085601f830112611755578384fd5b81518181111561176757611767611a51565b8060051b604051601f19603f8301168101818110858211171561178c5761178c611a51565b604052828152858101935084860182860187018a10156117aa578788fd5b8795505b838610156117cc5780518552600195909501949386019386016117ae565b5098975050505050505050565b60008060c083850312156117eb578081fd5b6117f584846116b1565b915061180360a084016116c8565b90509250929050565b60008060c083850312156117eb578182fd5b60006020828403121561182f578081fd5b6116f6826116c8565b600060208284031215611849578081fd5b813563ffffffff811681146116f6578182fd5b60006020828403121561186d578081fd5b813560ff811681146116f6578182fd5b6000815180845260208085019450808401835b838110156118ac57815187529582019590820190600101611890565b509495945050505050565b6001600160a01b03841681526060602082018190526000906118db9083018561187d565b82810360408401526118ed818561187d565b9695505050505050565b60408082528351828201819052600091906020906060850190828801855b8281101561195157815180516001600160a01b031685528501516bffffffffffffffffffffffff16858501529285019290840190600101611915565b50505084810382860152611965818761187d565b979650505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600061ffff8083168185168083038211156119c2576119c2611a3b565b01949350505050565b600082198211156119de576119de611a3b565b500190565b60008160001904831182151516156119fd576119fd611a3b565b500290565b600082821015611a1457611a14611a3b565b500390565b600061ffff80831681811415611a3157611a31611a3b565b6001019392505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e8457600080fdfea2646970667358221220105f65b2fd7ee9e1f0d287858e329c5181dafede4f82bf8278fc08363de029b364736f6c63430008040033000000000000000000000000c0cb97a0e22e9c14fb0b39da6cf6ccdab8078fa9000000000000000000000000ba3bdc36e751e2ffa2c216416666b909af7fb49b000000000000000000000000fa11f52848f220edff379d9367c0f2ca11adc61c000000000000000000000000000000000000000000000000000000006194460000000000000000000000000000000000000000000000000000000000619597800000000000000000000000000000000000000000000000000000000061983a80
Deployed Bytecode
0x6080604052600436106101b75760003560e01c80638d859f3e116100ec578063bcd16e961161008a578063de8f6c9511610064578063de8f6c951461045d578063ed74d61414610566578063f2fde38b14610593578063f6fd8f12146105b357600080fd5b8063bcd16e96146104fa578063cb90110614610510578063d9a909ed1461053257600080fd5b80639c40e799116100c65780639c40e7991461045d578063b37e480e14610472578063b5a5ba60146104a6578063b6fc16cb146104c657600080fd5b80638d859f3e146103ea5780638da5cb5b1461041d5780639661cb0d1461043b57600080fd5b806339e5a26f1161015957806368742da61161013357806368742da61461036e578063715018a61461038e578063810941d7146103a3578063893da6c9146103c557600080fd5b806339e5a26f146102d157806359a64d811461031a5780635ed25c061461034e57600080fd5b8063193645041161019557806319364504146102395780631fa4f86e1461026657806323cf0a221461029e5780632f277193146102b157600080fd5b80630485978f146101bc578063066453df146101fc5780631269bfe714610224575b600080fd5b3480156101c857600080fd5b506101e96101d73660046116da565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561020857600080fd5b50610211606481565b60405161ffff90911681526020016101f3565b61023761023236600461180c565b6105d7565b005b34801561024557600080fd5b506101e96102543660046116da565b60056020526000908152604090205481565b34801561027257600080fd5b50600154610286906001600160a01b031681565b6040516001600160a01b0390911681526020016101f3565b6102376102ac36600461181e565b610888565b3480156102bd57600080fd5b506102376102cc3660046117d9565b610adb565b3480156102dd57600080fd5b506103057f000000000000000000000000000000000000000000000000000000006195978081565b60405163ffffffff90911681526020016101f3565b34801561032657600080fd5b506101e97f01b60039e26fe2ebf786fd30b959c8b4b94e41e9d251c8361f5eb3929011f6ec81565b34801561035a57600080fd5b50600254610286906001600160a01b031681565b34801561037a57600080fd5b506102376103893660046116da565b610cc1565b34801561039a57600080fd5b50610237610d28565b3480156103af57600080fd5b5060005461021190600160b01b900461ffff1681565b3480156103d157600080fd5b506103da610d5e565b60405190151581526020016101f3565b3480156103f657600080fd5b5061040566b1a2bc2ec5000081565b60405166ffffffffffffff90911681526020016101f3565b34801561042957600080fd5b506000546001600160a01b0316610286565b34801561044757600080fd5b5060005461021190600160a01b900461ffff1681565b34801561046957600080fd5b50610211600381565b34801561047e57600080fd5b506103057f0000000000000000000000000000000000000000000000000000000061983a8081565b3480156104b257600080fd5b506102376104c1366004611838565b610d9c565b3480156104d257600080fd5b506101e97ffa6dcb9aba10b933a19b78f4196203cee26ec1933e740912c5b4adaeed8a052881565b34801561050657600080fd5b506102116101f481565b34801561051c57600080fd5b5060005461021190600160c01b900461ffff1681565b34801561053e57600080fd5b506103057f000000000000000000000000000000000000000000000000000000006194460081565b34801561057257600080fd5b506101e96105813660046116da565b60046020526000908152604090205481565b34801561059f57600080fd5b506102376105ae3660046116da565b610dec565b3480156105bf57600080fd5b5060005461030590600160d01b900463ffffffff1681565b7f000000000000000000000000000000000000000000000000000000006194460063ffffffff1642101561065c5760405162461bcd60e51b815260206004820152602160248201527f53616c653a2070726553616c6520686173206e6f7420737461727465642079656044820152601d60fa1b60648201526084015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000006195978063ffffffff164211156106d25760405162461bcd60e51b815260206004820152601760248201527f53616c653a2070726553616c652068617320656e6465640000000000000000006044820152606401610653565b6106e260a08301608084016116da565b6001600160a01b0316336001600160a01b03161461074e5760405162461bcd60e51b815260206004820152602360248201527f53616c653a206d73672e73656e646572206973206e6f742077686974656c69736044820152621d195960ea1b6064820152608401610653565b3360009081526004602052604090205461076d600360608501356119e3565b6107779190611a02565b8161ffff1611156107ca5760405162461bcd60e51b815260206004820152601d60248201527f53616c653a20657863656564732061737369676e656420616d6f756e740000006044820152606401610653565b6107d48134610e87565b6107dd82610ee6565b336000908152600460205260408120805461ffff841692906108009084906119cb565b9091555060009050610810611031565b905060005b8261ffff168161ffff1610156108495761083761083282846119a5565b6110bf565b6108426001826119a5565b9050610815565b5081600060168282829054906101000a900461ffff1661086991906119a5565b92506101000a81548161ffff021916908361ffff160217905550505050565b7f0000000000000000000000000000000000000000000000000000000061983a8063ffffffff1642101561090a5760405162461bcd60e51b8152602060048201526024808201527f53616c653a207075626c696353616c6520686173206e6f742073746172746564604482015263081e595d60e21b6064820152608401610653565b600054600160d01b900463ffffffff164211156109695760405162461bcd60e51b815260206004820152601a60248201527f53616c653a207075626c696353616c652068617320656e6465640000000000006044820152606401610653565b610971610d5e565b156109af5760405162461bcd60e51b815260206004820152600e60248201526d14d85b194e881cdbdb19081bdd5d60921b6044820152606401610653565b336000908152600560205260408120805461ffff841692906109d29084906119cb565b90915550503360009081526005602052604090205460641015610a555760405162461bcd60e51b815260206004820152603560248201527f53616c653a2063616e206e6f74207075726368617365206d6f7265207468616e6044820152740813505617d352539517d4115497d050d0d3d55395605a1b6064820152608401610653565b610a5f8134610e87565b6000610a69611031565b905060005b8261ffff168161ffff161015610a9d57610a8b61083282846119a5565b610a966001826119a5565b9050610a6e565b5081600060188282829054906101000a900461ffff16610abd91906119a5565b92506101000a81548161ffff021916908361ffff1602179055505050565b610aeb60a08301608084016116da565b6001600160a01b0316336001600160a01b031614610b425760405162461bcd60e51b815260206004820152601460248201527314d85b194e881b9bdd08185d5d1a1bdc9a5e995960621b6044820152606401610653565b33600090815260066020526040902054610b60906060840135611a02565b8161ffff161115610bb35760405162461bcd60e51b815260206004820152601d60248201527f53616c653a20657863656564732061737369676e656420616d6f756e740000006044820152606401610653565b6000546101f490610bd0908390600160a01b900461ffff166119a5565b61ffff161115610c2d5760405162461bcd60e51b815260206004820152602260248201527f53616c653a2065786365656473205052455f414c4c4f43415445445f414d4f55604482015261139560f21b6064820152608401610653565b610c36826114cc565b336000908152600660205260408120805461ffff84169290610c599084906119cb565b90915550600090505b8161ffff168161ffff161015610ca157600054610c8f90610832908390600160a01b900461ffff166119a5565b80610c9981611a19565b915050610c62565b5080600060148282829054906101000a900461ffff16610abd91906119a5565b6000546001600160a01b03163314610ceb5760405162461bcd60e51b815260040161065390611970565b60405147906001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610d23573d6000803e3d6000fd5b505050565b6000546001600160a01b03163314610d525760405162461bcd60e51b815260040161065390611970565b610d5c600061151a565b565b60008054612710906101f490610d889061ffff600160c01b8204811691600160b01b9004166119a5565b610d9291906119a5565b61ffff1614905090565b6000546001600160a01b03163314610dc65760405162461bcd60e51b815260040161065390611970565b6000805463ffffffff909216600160d01b0263ffffffff60d01b19909216919091179055565b6000546001600160a01b03163314610e165760405162461bcd60e51b815260040161065390611970565b6001600160a01b038116610e7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610653565b610e848161151a565b50565b610e9c66b1a2bc2ec5000061ffff84166119e3565b811015610ee25760405162461bcd60e51b81526020600482015260146024820152730a6c2d8ca7440dcdee840cadcdeeaced040cae8d60631b6044820152606401610653565b5050565b604080517f01b60039e26fe2ebf786fd30b959c8b4b94e41e9d251c8361f5eb3929011f6ec6020820152606080840135928201929092523391810191909152600090610f4b906080015b6040516020818303038152906040528051906020012061156a565b90506000600182610f5f602086018661185c565b604080516000815260208181018084529490945260ff9092168282015291860135606082015290850135608082015260a0016020604051602081039080840390855afa158015610fb3573d6000803e3d6000fd5b505050602060405103519050610fd16000546001600160a01b031690565b6001600160a01b0316816001600160a01b031614610d235760405162461bcd60e51b815260206004820152601760248201527f53616c653a20696e76616c6964207369676e61747572650000000000000000006044820152606401610653565b60008054819061ffff600160c01b820481169161105991600160b01b909104166101f46119a5565b61106391906119a5565b905061271061ffff8216106110ba5760405162461bcd60e51b815260206004820152601860248201527f53616c653a2065786365656473206d617820737570706c7900000000000000006044820152606401610653565b919050565b6001546040516340c10f1960e01b815230600482015261ffff831660248201526000916001600160a01b0316906340c10f1990604401602060405180830381600087803b15801561110f57600080fd5b505af1158015611123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114791906116fd565b60035460405163c33348bd60e01b815261ffff851660048201529192506000916001600160a01b039091169063c33348bd9060240160006040518083038186803b15801561119457600080fd5b505afa1580156111a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111d09190810190611719565b60408051600380825260808201909252919250600091906020820160608036833701905050905060018160008151811061121a57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060018160018151811061124957634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060018160028151811061127857634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600254604051637bd2799760e01b81526001600160a01b0390911690637bd27997906112b7908690869086906004016118b7565b600060405180830381600087803b1580156112d157600080fd5b505af11580156112e5573d6000803e3d6000fd5b5060009250600391506112f59050565b60405190808252806020026020018201604052801561133a57816020015b60408051808201909152600080825260208201528152602001906001900390816113135790505b50905060005b600361ffff821610156113ea57604080518082019091526002546001600160a01b0316815284516020820190869061ffff851690811061139057634e487b7160e01b600052603260045260246000fd5b60200260200101516bffffffffffffffffffffffff16815250828261ffff16815181106113cd57634e487b7160e01b600052603260045260246000fd5b60209081029190910101526113e36001826119a5565b9050611340565b506040805160008152602081019182905263867cee7160e01b9091526001600160a01b0385169063867cee7190611426908490602481016118f7565b600060405180830381600087803b15801561144057600080fd5b505af1158015611454573d6000803e3d6000fd5b50506001546040516323b872dd60e01b815230600482015233602482015261ffff891660448201526001600160a01b0390911692506323b872dd9150606401600060405180830381600087803b1580156114ad57600080fd5b505af11580156114c1573d6000803e3d6000fd5b505050505050505050565b604080517ffa6dcb9aba10b933a19b78f4196203cee26ec1933e740912c5b4adaeed8a05286020820152606080840135928201929092523391810191909152600090610f4b90608001610f30565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006115b86115776115be565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b92915050565b60007f000000000000000000000000000000000000000000000000000000000000000146141561160d57507f5685c55121df6589e2c1e1936e437044c00355beda6cca7d6196e173cc2919be90565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f41187e12907f275d8bd0cd2cf8106b66a87af0eb1272acd5e425ef7530912d18828401527f4c23426613a5dc69e08fbd2787e6210aa679d4522e95a89d4dd88c4fd13a228360608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600060a082840312156116c2578081fd5b50919050565b803561ffff811681146110ba57600080fd5b6000602082840312156116eb578081fd5b81356116f681611a67565b9392505050565b60006020828403121561170e578081fd5b81516116f681611a67565b6000602080838503121561172b578182fd5b825167ffffffffffffffff80821115611742578384fd5b818501915085601f830112611755578384fd5b81518181111561176757611767611a51565b8060051b604051601f19603f8301168101818110858211171561178c5761178c611a51565b604052828152858101935084860182860187018a10156117aa578788fd5b8795505b838610156117cc5780518552600195909501949386019386016117ae565b5098975050505050505050565b60008060c083850312156117eb578081fd5b6117f584846116b1565b915061180360a084016116c8565b90509250929050565b60008060c083850312156117eb578182fd5b60006020828403121561182f578081fd5b6116f6826116c8565b600060208284031215611849578081fd5b813563ffffffff811681146116f6578182fd5b60006020828403121561186d578081fd5b813560ff811681146116f6578182fd5b6000815180845260208085019450808401835b838110156118ac57815187529582019590820190600101611890565b509495945050505050565b6001600160a01b03841681526060602082018190526000906118db9083018561187d565b82810360408401526118ed818561187d565b9695505050505050565b60408082528351828201819052600091906020906060850190828801855b8281101561195157815180516001600160a01b031685528501516bffffffffffffffffffffffff16858501529285019290840190600101611915565b50505084810382860152611965818761187d565b979650505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600061ffff8083168185168083038211156119c2576119c2611a3b565b01949350505050565b600082198211156119de576119de611a3b565b500190565b60008160001904831182151516156119fd576119fd611a3b565b500290565b600082821015611a1457611a14611a3b565b500390565b600061ffff80831681811415611a3157611a31611a3b565b6001019392505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e8457600080fdfea2646970667358221220105f65b2fd7ee9e1f0d287858e329c5181dafede4f82bf8278fc08363de029b364736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c0cb97a0e22e9c14fb0b39da6cf6ccdab8078fa9000000000000000000000000ba3bdc36e751e2ffa2c216416666b909af7fb49b000000000000000000000000fa11f52848f220edff379d9367c0f2ca11adc61c000000000000000000000000000000000000000000000000000000006194460000000000000000000000000000000000000000000000000000000000619597800000000000000000000000000000000000000000000000000000000061983a80
-----Decoded View---------------
Arg [0] : dava_ (address): 0xC0CB97a0e22E9c14fB0B39da6cF6ccdab8078fa9
Arg [1] : davaOfficial_ (address): 0xBa3BDc36e751E2Ffa2C216416666b909Af7fB49B
Arg [2] : randomBox_ (address): 0xFa11f52848F220EdFf379d9367c0F2cA11ADc61c
Arg [3] : presaleStart (uint32): 1637107200
Arg [4] : presaleEnd (uint32): 1637193600
Arg [5] : publicStart (uint32): 1637366400
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000c0cb97a0e22e9c14fb0b39da6cf6ccdab8078fa9
Arg [1] : 000000000000000000000000ba3bdc36e751e2ffa2c216416666b909af7fb49b
Arg [2] : 000000000000000000000000fa11f52848f220edff379d9367c0f2ca11adc61c
Arg [3] : 0000000000000000000000000000000000000000000000000000000061944600
Arg [4] : 0000000000000000000000000000000000000000000000000000000061959780
Arg [5] : 0000000000000000000000000000000000000000000000000000000061983a80
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.