Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 2,482 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Mint | 14564513 | 1397 days ago | IN | 0.05 ETH | 0.00109679 | ||||
| Mint | 14217990 | 1451 days ago | IN | 0.05 ETH | 0.00232173 | ||||
| Mint | 13926496 | 1496 days ago | IN | 0.25 ETH | 0.00129178 | ||||
| Claim | 13858840 | 1506 days ago | IN | 0 ETH | 0.27867079 | ||||
| Claim | 13858827 | 1506 days ago | IN | 0 ETH | 0.00347033 | ||||
| Claim | 13858743 | 1506 days ago | IN | 0 ETH | 0.00220818 | ||||
| Claim | 13816848 | 1513 days ago | IN | 0 ETH | 0.00161751 | ||||
| Mint | 13714553 | 1529 days ago | IN | 0.05 ETH | 0.00184637 | ||||
| Mint | 13714499 | 1529 days ago | IN | 0.05 ETH | 0.00214179 | ||||
| Claim | 13708031 | 1530 days ago | IN | 0 ETH | 0.93950795 | ||||
| Claim | 13690486 | 1533 days ago | IN | 0 ETH | 0.04478424 | ||||
| Claim | 13690372 | 1533 days ago | IN | 0 ETH | 0.31733068 | ||||
| Claim | 13686539 | 1533 days ago | IN | 0 ETH | 0.03994647 | ||||
| Claim | 13685161 | 1533 days ago | IN | 0 ETH | 0.11390558 | ||||
| Mint | 13674932 | 1535 days ago | IN | 0.05 ETH | 0.00239243 | ||||
| Claim | 13674844 | 1535 days ago | IN | 0 ETH | 0.04069486 | ||||
| Claim | 13671656 | 1536 days ago | IN | 0 ETH | 0.07234475 | ||||
| Mint | 13670325 | 1536 days ago | IN | 0.05 ETH | 0.00232199 | ||||
| Mint | 13670325 | 1536 days ago | IN | 0.05 ETH | 0.00232199 | ||||
| Claim | 13669970 | 1536 days ago | IN | 0 ETH | 0.03195147 | ||||
| Claim | 13669391 | 1536 days ago | IN | 0 ETH | 0.04397884 | ||||
| Claim | 13669031 | 1536 days ago | IN | 0 ETH | 0.05794906 | ||||
| Withdraw Funds | 13668463 | 1536 days ago | IN | 0 ETH | 0.01107456 | ||||
| Claim | 13665996 | 1536 days ago | IN | 0 ETH | 0.13834333 | ||||
| Claim | 13664593 | 1537 days ago | IN | 0 ETH | 0.04144294 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
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
Contract ABI
API[{"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
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.