Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 615 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Update Artist | 13492795 | 1133 days ago | IN | 0 ETH | 0.00251325 | ||||
Buy | 12887898 | 1227 days ago | IN | 0.4 ETH | 0.00105943 | ||||
Buy | 12884737 | 1228 days ago | IN | 0.4 ETH | 0.0038544 | ||||
Buy | 12884737 | 1228 days ago | IN | 0.4 ETH | 0.00031317 | ||||
Update Paused | 12884693 | 1228 days ago | IN | 0 ETH | 0.00073822 | ||||
Buy | 12884683 | 1228 days ago | IN | 0.4 ETH | 0.00344272 | ||||
Buy | 12884679 | 1228 days ago | IN | 0.4 ETH | 0.00086092 | ||||
Buy | 12884678 | 1228 days ago | IN | 0.4 ETH | 0.04832371 | ||||
Buy | 12884677 | 1228 days ago | IN | 0.4 ETH | 0.00396096 | ||||
Buy | 12884677 | 1228 days ago | IN | 0.4 ETH | 0.0041392 | ||||
Buy | 12884674 | 1228 days ago | IN | 0.4 ETH | 0.00594144 | ||||
Buy | 12884673 | 1228 days ago | IN | 0.4 ETH | 0.00091038 | ||||
Buy | 12884672 | 1228 days ago | IN | 0.4 ETH | 0.01279598 | ||||
Buy | 12884671 | 1228 days ago | IN | 0.4 ETH | 0.0008598 | ||||
Buy | 12884671 | 1228 days ago | IN | 0.4 ETH | 0.00336681 | ||||
Buy | 12884671 | 1228 days ago | IN | 0.4 ETH | 0.00064188 | ||||
Buy | 12884670 | 1228 days ago | IN | 0.4 ETH | 0.0049512 | ||||
Buy | 12884670 | 1228 days ago | IN | 0.4 ETH | 0.0106174 | ||||
Buy | 12884670 | 1228 days ago | IN | 0.4 ETH | 0.01318009 | ||||
Buy | 12884668 | 1228 days ago | IN | 0.4 ETH | 0.00396096 | ||||
Buy | 12884667 | 1228 days ago | IN | 0.4 ETH | 0.00396096 | ||||
Buy | 12884667 | 1228 days ago | IN | 0.4 ETH | 0.00594144 | ||||
Buy | 12884665 | 1228 days ago | IN | 0.4 ETH | 0.01960556 | ||||
Buy | 12884665 | 1228 days ago | IN | 0.4 ETH | 0.02198332 | ||||
Buy | 12884663 | 1228 days ago | IN | 0.4 ETH | 0.00101154 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12884678 | 1228 days ago | 0.34 ETH | ||||
12884678 | 1228 days ago | 0.06 ETH | ||||
12884677 | 1228 days ago | 0.34 ETH | ||||
12884677 | 1228 days ago | 0.06 ETH | ||||
12884677 | 1228 days ago | 0.34 ETH | ||||
12884677 | 1228 days ago | 0.06 ETH | ||||
12884674 | 1228 days ago | 0.34 ETH | ||||
12884674 | 1228 days ago | 0.06 ETH | ||||
12884671 | 1228 days ago | 0.34 ETH | ||||
12884671 | 1228 days ago | 0.06 ETH | ||||
12884670 | 1228 days ago | 0.34 ETH | ||||
12884670 | 1228 days ago | 0.06 ETH | ||||
12884670 | 1228 days ago | 0.34 ETH | ||||
12884670 | 1228 days ago | 0.06 ETH | ||||
12884670 | 1228 days ago | 0.34 ETH | ||||
12884670 | 1228 days ago | 0.06 ETH | ||||
12884668 | 1228 days ago | 0.34 ETH | ||||
12884668 | 1228 days ago | 0.06 ETH | ||||
12884667 | 1228 days ago | 0.34 ETH | ||||
12884667 | 1228 days ago | 0.06 ETH | ||||
12884667 | 1228 days ago | 0.34 ETH | ||||
12884667 | 1228 days ago | 0.06 ETH | ||||
12884665 | 1228 days ago | 0.34 ETH | ||||
12884665 | 1228 days ago | 0.06 ETH | ||||
12884665 | 1228 days ago | 0.34 ETH |
Loading...
Loading
Contract Name:
SeederController
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-14 */ // Sources flattened with hardhat v2.3.0 https://hardhat.org // File openzeppelin-solidity/contracts/GSN/[email protected] pragma solidity ^0.5.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 GSN 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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File openzeppelin-solidity/contracts/introspection/[email protected] pragma solidity ^0.5.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); } // File openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity ^0.5.0; /** * @dev Required interface of an ERC721 compliant contract. */ contract IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of NFTs in `owner`'s account. */ function balanceOf(address owner) public view returns (uint256 balance); /** * @dev Returns the owner of the NFT specified by `tokenId`. */ function ownerOf(uint256 tokenId) public view returns (address owner); /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * * * Requirements: * - `from`, `to` cannot be zero. * - `tokenId` must be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this * NFT by either {approve} or {setApprovalForAll}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public; /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * Requirements: * - If the caller is not `from`, it must be approved to move this NFT by * either {approve} or {setApprovalForAll}. */ function transferFrom(address from, address to, uint256 tokenId) public; function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } // File openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity ^0.5.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a {IERC721-safeTransferFrom}. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 contract address is always the message sender. * @param operator The address which called `safeTransferFrom` function * @param from The address which previously owned the token * @param tokenId The NFT identifier which is being transferred * @param data Additional data with no specified format * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4); } // File openzeppelin-solidity/contracts/math/[email protected] pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File openzeppelin-solidity/contracts/utils/[email protected] pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File openzeppelin-solidity/contracts/drafts/[email protected] pragma solidity ^0.5.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath} * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never * directly accessed. */ library Counters { using SafeMath for uint256; struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { // The {SafeMath} overflow check can be skipped here, see the comment at the top counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } // File openzeppelin-solidity/contracts/introspection/[email protected] pragma solidity ^0.5.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity ^0.5.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721 { using SafeMath for uint256; using Address for address; using Counters for Counters.Counter; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping (uint256 => address) private _tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to number of owned token mapping (address => Counters.Counter) private _ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; constructor () public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); } /** * @dev Gets the balance of the specified address. * @param owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address owner) public view returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _ownedTokensCount[owner].current(); } /** * @dev Gets the owner of the specified token ID. * @param tokenId uint256 ID of the token to query the owner of * @return address currently marked as the owner of the given token ID */ function ownerOf(uint256 tokenId) public view returns (address) { address owner = _tokenOwner[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) public { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 tokenId) public view returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev Sets or unsets the approval of a given operator * An operator is allowed to transfer all tokens of the sender on their behalf. * @param to operator address to set the approval * @param approved representing the status of the approval to be set */ function setApprovalForAll(address to, bool approved) public { require(to != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][to] = approved; emit ApprovalForAll(_msgSender(), to, approved); } /** * @dev Tells whether an operator is approved by a given owner. * @param owner owner address which you want to query the approval of * @param operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll(address owner, address operator) public view returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Transfers the ownership of a given token ID to another address. * Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * Requires the msg.sender to be the owner, approved, or operator. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom(address from, address to, uint256 tokenId) public { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transferFrom(from, to, tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the _msgSender() to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransferFrom(from, to, tokenId, _data); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) internal { _transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether the specified token exists. * @param tokenId uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists(uint256 tokenId) internal view returns (bool) { address owner = _tokenOwner[tokenId]; return owner != address(0); } /** * @dev Returns whether the given spender can transfer a given token ID. * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _safeMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId, ""); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted * @param _data bytes data to send along with a safe transfer check */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Internal function to mint a new token. * Reverts if the given token ID already exists. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _tokenOwner[tokenId] = to; _ownedTokensCount[to].increment(); emit Transfer(address(0), to, tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use {_burn} instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal { require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own"); _clearApproval(tokenId); _ownedTokensCount[owner].decrement(); _tokenOwner[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * @param tokenId uint256 ID of the token being burned */ function _burn(uint256 tokenId) internal { _burn(ownerOf(tokenId), tokenId); } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom(address from, address to, uint256 tokenId) internal { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _clearApproval(tokenId); _ownedTokensCount[from].decrement(); _ownedTokensCount[to].increment(); _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * This is an internal detail of the `ERC721` contract and its use is deprecated. * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { if (!to.isContract()) { return true; } // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data )); if (!success) { if (returndata.length > 0) { // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert("ERC721: transfer to non ERC721Receiver implementer"); } } else { bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } } /** * @dev Private function to clear current approval of a given token ID. * @param tokenId uint256 ID of the token to be transferred */ function _clearApproval(uint256 tokenId) private { if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } } // File openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity ^0.5.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract IERC721Enumerable is IERC721 { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId); function tokenByIndex(uint256 index) public view returns (uint256); } // File openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity ^0.5.0; /** * @title ERC-721 Non-Fungible Token with optional enumeration extension logic * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721Enumerable is Context, ERC165, ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => uint256[]) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Constructor function. */ constructor () public { // register the supported interface to conform to ERC721Enumerable via ERC165 _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev Gets the token ID at a given index of the tokens list of the requested owner. * @param owner address owning the tokens list to be accessed * @param index uint256 representing the index to be accessed of the requested tokens list * @return uint256 token ID at the given index of the tokens list owned by the requested address */ function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) { require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev Gets the total amount of tokens stored by the contract. * @return uint256 representing the total amount of tokens */ function totalSupply() public view returns (uint256) { return _allTokens.length; } /** * @dev Gets the token ID at a given index of all the tokens in this contract * Reverts if the index is greater or equal to the total number of tokens. * @param index uint256 representing the index to be accessed of the tokens list * @return uint256 token ID at the given index of the tokens list */ function tokenByIndex(uint256 index) public view returns (uint256) { require(index < totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to transferFrom, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom(address from, address to, uint256 tokenId) internal { super._transferFrom(from, to, tokenId); _removeTokenFromOwnerEnumeration(from, tokenId); _addTokenToOwnerEnumeration(to, tokenId); } /** * @dev Internal function to mint a new token. * Reverts if the given token ID already exists. * @param to address the beneficiary that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { super._mint(to, tokenId); _addTokenToOwnerEnumeration(to, tokenId); _addTokenToAllTokensEnumeration(tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use {ERC721-_burn} instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal { super._burn(owner, tokenId); _removeTokenFromOwnerEnumeration(owner, tokenId); // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund _ownedTokensIndex[tokenId] = 0; _removeTokenFromAllTokensEnumeration(tokenId); } /** * @dev Gets the list of token IDs of the requested owner. * @param owner address owning the tokens * @return uint256[] List of token IDs owned by the requested address */ function _tokensOfOwner(address owner) internal view returns (uint256[] storage) { return _ownedTokens[owner]; } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { _ownedTokensIndex[tokenId] = _ownedTokens[to].length; _ownedTokens[to].push(tokenId); } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _ownedTokens[from].length.sub(1); uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array _ownedTokens[from].length--; // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by // lastTokenId, or just over the end of the array if the token was the last one). } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length.sub(1); uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array _allTokens.length--; _allTokensIndex[tokenId] = 0; } } // File openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity ^0.5.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract IERC721Metadata is IERC721 { function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); } // File openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity ^0.5.0; contract ERC721Metadata is Context, ERC165, ERC721, IERC721Metadata { // Token name string private _name; // Token symbol string private _symbol; // Base URI string private _baseURI; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /** * @dev Constructor function */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721_METADATA); } /** * @dev Gets the token name. * @return string representing the token name */ function name() external view returns (string memory) { return _name; } /** * @dev Gets the token symbol. * @return string representing the token symbol */ function symbol() external view returns (string memory) { return _symbol; } /** * @dev Returns the URI for a given token ID. May return an empty string. * * If the token's URI is non-empty and a base URI was set (via * {_setBaseURI}), it will be added to the token ID's URI as a prefix. * * Reverts if the token ID does not exist. */ function tokenURI(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; // Even if there is a base URI, it is only appended to non-empty token-specific URIs if (bytes(_tokenURI).length == 0) { return ""; } else { // abi.encodePacked is being used to concatenate strings return string(abi.encodePacked(_baseURI, _tokenURI)); } } /** * @dev Internal function to set the token URI for a given token. * * Reverts if the token ID does not exist. * * TIP: if all token IDs share a prefix (e.g. if your URIs look like * `http://api.myproject.com/token/<id>`), use {_setBaseURI} to store * it and save gas. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}. * * _Available since v2.5.0._ */ function _setBaseURI(string memory baseURI) internal { _baseURI = baseURI; } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a preffix in {tokenURI} to each token's URI, when * they are non-empty. * * _Available since v2.5.0._ */ function baseURI() external view returns (string memory) { return _baseURI; } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use _burn(uint256) instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned by the msg.sender */ function _burn(address owner, uint256 tokenId) internal { super._burn(owner, tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity ^0.5.0; /** * @title Full ERC721 Token * @dev This implementation includes all the required and some optional functionality of the ERC721 standard * Moreover, it includes approve all functionality using operator terminology. * * See https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata { constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) { // solhint-disable-previous-line no-empty-blocks } } // File openzeppelin-solidity/contracts/token/ERC20/[email protected] pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File openzeppelin-solidity/contracts/ownership/[email protected] pragma solidity ^0.5.0; /** * @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. * * 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. */ 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _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 onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File openzeppelin-solidity/contracts/access/[email protected] pragma solidity ^0.5.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File contracts/helpers/strings.sol /* * @title String & slice utility library for Solidity contracts. * @author Nick Johnson <[email protected]> */ pragma solidity ^0.5.0; library strings { struct slice { uint _len; uint _ptr; } function memcpy(uint dest, uint src, uint len) private pure { // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } /* * @dev Returns a slice containing the entire string. * @param self The string to make a slice from. * @return A newly allocated slice containing the entire string. */ function toSlice(string memory self) internal pure returns (slice memory) { uint ptr; assembly { ptr := add(self, 0x20) } return slice(bytes(self).length, ptr); } /* * @dev Returns a newly allocated string containing the concatenation of * `self` and `other`. * @param self The first slice to concatenate. * @param other The second slice to concatenate. * @return The concatenation of the two strings. */ function concat(slice memory self, slice memory other) internal pure returns (string memory) { string memory ret = new string(self._len + other._len); uint retptr; assembly { retptr := add(ret, 32) } memcpy(retptr, self._ptr, self._len); memcpy(retptr + self._len, other._ptr, other._len); return ret; } } // File contracts/Metadata.sol /** * Forked from folia-app/folia-contracts: https://github.com/folia-app/folia-contracts * Many thanks to Billy Rennekamp <https://github.com/okwme> and Folia <https://www.folia.app/> 💚 */ pragma solidity ^0.5.0; /** * Metadata contract is upgradeable and returns metadata about Token */ contract Metadata { using strings for *; function tokenURI(uint256 _tokenId) public pure returns (string memory _infoUrl) { string memory base = "https://seeder.mutant.garden/v1/tokens/"; string memory id = uint2str(_tokenId); return base.toSlice().concat(id.toSlice()); } function uint2str(uint256 i) internal pure returns (string memory) { if (i == 0) return "0"; uint256 j = i; uint256 length; while (j != 0) { length++; j /= 10; } bytes memory bstr = new bytes(length); uint256 k = length - 1; while (i != 0) { uint256 _uint = 48 + (i % 10); bstr[k--] = toBytes(_uint)[31]; i /= 10; } return string(bstr); } function toBytes(uint256 x) public pure returns (bytes memory b) { b = new bytes(32); assembly { mstore(add(b, 32), x) } } } // File contracts/Seeder.sol /** * Forked from folia-app/folia-contracts: https://github.com/folia-app/folia-contracts * Many thanks to Billy Rennekamp <https://github.com/okwme> and Folia <https://www.folia.app/> 💚 */ pragma solidity ^0.5.0; contract Seeder is ERC721Full, Ownable { using Roles for Roles.Role; Roles.Role private _admins; uint8 admins; address public metadata; address public controller; modifier onlyAdminOrController() { require( (_admins.has(msg.sender) || msg.sender == controller), "You are not an admin or controller" ); _; } constructor( string memory name, string memory symbol, address _metadata ) public ERC721Full(name, symbol) { metadata = _metadata; _admins.add(msg.sender); admins += 1; } function mint(address recipient, uint256 tokenId) public onlyAdminOrController returns (uint256) { _mint(recipient, tokenId); } function burn(uint256 tokenId) public onlyAdminOrController { _burn(ownerOf(tokenId), tokenId); } function updateMetadata(address _metadata) public onlyAdminOrController { metadata = _metadata; } function updateController(address _controller) public onlyAdminOrController { controller = _controller; } function addAdmin(address _admin) public onlyOwner { _admins.add(_admin); admins += 1; } function removeAdmin(address _admin) public onlyOwner { require(admins > 1, "Cannot remove the last admin"); _admins.remove(_admin); admins -= 1; } function tokenURI(uint256 _tokenId) external view returns (string memory _infoUrl) { return Metadata(metadata).tokenURI(_tokenId); } /** * @dev Moves Token to a certain address. * @param _to The address to receive the Token. * @param _amount The amount of Token to be transferred. * @param _token The address of the Token to be transferred. */ function moveToken( address _to, uint256 _amount, address _token ) public onlyAdminOrController returns (bool) { require(_amount <= IERC20(_token).balanceOf(address(this))); return IERC20(_token).transfer(_to, _amount); } } // File openzeppelin-solidity/contracts/utils/[email protected] pragma solidity ^0.5.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. * * _Since v2.5.0:_ this module is now much more gas efficient, given net gas * metering changes introduced in the Istanbul hardfork. */ contract ReentrancyGuard { bool private _notEntered; constructor () internal { // Storing an initial non-zero value makes deployment a bit more // expensive, but in exchange the refund on every call to nonReentrant // will be lower in amount. Since refunds are capped to a percetange of // the total transaction's gas, it is best to keep them low in cases // like this one, to increase the likelihood of the full refund coming // into effect. _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } // File contracts/SeederController.sol /** * Forked from folia-app/folia-contracts: https://github.com/folia-app/folia-contracts * Many thanks to Billy Rennekamp <https://github.com/okwme> and Folia <https://www.folia.app/> 💚 */ pragma solidity ^0.5.0; contract SeederController is Ownable, ReentrancyGuard { address payable public artist; uint256 public price = 0.33 ether; uint256 public adminSplit = 15; uint256 public minBlockAge = 10; uint256 public maxBlockAge = 64; bool public paused = false; uint256 constant MAX_TOKENS = 512; // mapping (uint256 => uint256) public birthBlocks; // mapping (uint256 => bool) public exists; event updated( address payable artist, uint256 price, uint256 adminSplit, bool paused ); event editionBought( uint256 tokenId, address recipient, uint256 paid, uint256 artistReceived, uint256 adminReceived ); using SafeMath for uint256; address payable public adminWallet; Seeder public seeder; modifier notPaused() { require(!paused, "Controller is paused"); _; } constructor(Seeder _seeder, address payable _adminWallet) public { seeder = _seeder; adminWallet = _adminWallet; } function updatePaused(bool _paused) public onlyOwner { paused = _paused; emit updated( artist, price, adminSplit, paused ); } function updatePrice(uint256 _price) public onlyOwner { price = _price; emit updated( artist, price, adminSplit, paused ); } function buy(address recipient, uint256 tokenId) public payable notPaused nonReentrant { require(msg.value >= price, "You did not send enough ether"); // require(tokenId >= doNotMintBeforeBlock, "That's too far back in history"); require(block.number >= tokenId + minBlockAge, "Cannot mint a mutant in the future"); require(block.number < tokenId + maxBlockAge, "Cannot mint a mutant to far in the past"); uint256 totalSupply = seeder.totalSupply(); require(totalSupply <= MAX_TOKENS, "No more available mutants to mint"); seeder.mint(recipient, tokenId); uint256 adminReceives = msg.value.mul(adminSplit).div(100); uint256 artistReceives = msg.value.sub(adminReceives); bool success; (success, ) = adminWallet.call.value(adminReceives)(""); require(success, "Admin failed to receive"); (success, ) = artist.call.value(artistReceives)(""); require(success, "Artist failed to receive"); emit editionBought( tokenId, recipient, msg.value, artistReceives, adminReceives ); } function updateAdminSplit(uint256 _adminSplit) public onlyOwner { require(adminSplit <= 100, "The admin split must be less or equal to 100"); adminSplit = _adminSplit; emit updated( artist, price, adminSplit, paused ); } function updateAdminWallet(address payable _adminWallet) public onlyOwner { adminWallet = _adminWallet; } function updateArtist(address payable _artist) public onlyOwner { artist = _artist; } function updateMinBlockAge(uint256 _minBlockAge) public onlyOwner { minBlockAge = _minBlockAge; } function updateMaxBlockAge(uint256 _maxBlockAge) public onlyOwner { maxBlockAge = _maxBlockAge; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract Seeder","name":"_seeder","type":"address"},{"internalType":"address payable","name":"_adminWallet","type":"address"}],"payable":false,"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"paid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"artistReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adminReceived","type":"uint256"}],"name":"editionBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable","name":"artist","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adminSplit","type":"uint256"},{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"updated","type":"event"},{"constant":true,"inputs":[],"name":"adminSplit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"adminWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"artist","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"buy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxBlockAge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minBlockAge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"seeder","outputs":[{"internalType":"contract Seeder","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_adminSplit","type":"uint256"}],"name":"updateAdminSplit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_adminWallet","type":"address"}],"name":"updateAdminWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_artist","type":"address"}],"name":"updateArtist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_maxBlockAge","type":"uint256"}],"name":"updateMaxBlockAge","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_minBlockAge","type":"uint256"}],"name":"updateMinBlockAge","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"updatePaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updatePrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040908152670494654067e10000600255600f600355600a6004556005556006805460ff1916905534801561003557600080fd5b506040516112c73803806112c78339818101604052604081101561005857600080fd5b50805160209091015160006100746001600160e01b0361011016565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805460ff60a01b1916600160a01b179055600780546001600160a01b039384166001600160a01b0319909116179055600680549190921661010002610100600160a81b0319909116179055610114565b3390565b6111a4806101236000396000f3fe60806040526004361061011f5760003560e01c80638d6cc56d116100a0578063a8afd87d11610064578063a8afd87d14610320578063ad9604071461034a578063cce7ec1314610374578063d792440b146103a0578063f2fde38b146103b55761011f565b80638d6cc56d146102a25780638da5cb5b146102cc5780638f32d59b146102e1578063a035b1fe146102f6578063a4617a9c1461030b5761011f565b80635c975abb116100e75780635c975abb146101f55780635eec08701461021e5780636242028214610251578063684931ed14610278578063715018a61461028d5761011f565b806308cdc2a8146101245780632c482b201461015257806336b19cd71461018557806343bc1612146101b65780634cd31e73146101cb575b600080fd5b34801561013057600080fd5b506101506004803603602081101561014757600080fd5b503515156103e8565b005b34801561015e57600080fd5b506101506004803603602081101561017557600080fd5b50356001600160a01b03166104a1565b34801561019157600080fd5b5061019a61050a565b604080516001600160a01b039092168252519081900360200190f35b3480156101c257600080fd5b5061019a61051e565b3480156101d757600080fd5b50610150600480360360208110156101ee57600080fd5b503561052d565b34801561020157600080fd5b5061020a61061b565b604080519115158252519081900360200190f35b34801561022a57600080fd5b506101506004803603602081101561024157600080fd5b50356001600160a01b0316610624565b34801561025d57600080fd5b50610266610693565b60408051918252519081900360200190f35b34801561028457600080fd5b5061019a610699565b34801561029957600080fd5b506101506106a8565b3480156102ae57600080fd5b50610150600480360360208110156102c557600080fd5b5035610739565b3480156102d857600080fd5b5061019a6107e5565b3480156102ed57600080fd5b5061020a6107f4565b34801561030257600080fd5b50610266610818565b34801561031757600080fd5b5061026661081e565b34801561032c57600080fd5b506101506004803603602081101561034357600080fd5b5035610824565b34801561035657600080fd5b506101506004803603602081101561036d57600080fd5b5035610870565b6101506004803603604081101561038a57600080fd5b506001600160a01b0381351690602001356108bc565b3480156103ac57600080fd5b50610266610d93565b3480156103c157600080fd5b50610150600480360360208110156103d857600080fd5b50356001600160a01b0316610d99565b6103f06107f4565b61042f576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b6006805460ff19168215151790819055600154600254600354604080516001600160a01b03909416845260208401929092528282015260ff9092161515606082015290517fd7d16f9ccfb1f3b06ebf4cfd78736c09153a419884e47e95b3e0f2b378f23492916080908290030190a150565b6104a96107f4565b6104e8576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60065461010090046001600160a01b031681565b6001546001600160a01b031681565b6105356107f4565b610574576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b606460035411156105b65760405162461bcd60e51b815260040180806020018281038252602c815260200180611099602c913960400191505060405180910390fd5b6003819055600154600254600654604080516001600160a01b039094168452602084019290925282820184905260ff1615156060830152517fd7d16f9ccfb1f3b06ebf4cfd78736c09153a419884e47e95b3e0f2b378f234929181900360800190a150565b60065460ff1681565b61062c6107f4565b61066b576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60055481565b6007546001600160a01b031681565b6106b06107f4565b6106ef576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6107416107f4565b610780576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b6002819055600154600354600654604080516001600160a01b039094168452602084018590528381019290925260ff1615156060830152517fd7d16f9ccfb1f3b06ebf4cfd78736c09153a419884e47e95b3e0f2b378f234929181900360800190a150565b6000546001600160a01b031690565b600080546001600160a01b0316610809610dec565b6001600160a01b031614905090565b60025481565b60045481565b61082c6107f4565b61086b576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b600555565b6108786107f4565b6108b7576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b600455565b60065460ff161561090b576040805162461bcd60e51b815260206004820152601460248201527310dbdb9d1c9bdb1b195c881a5cc81c185d5cd95960621b604482015290519081900360640190fd5b600054600160a01b900460ff16610969576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff60a01b191690556002543410156109cd576040805162461bcd60e51b815260206004820152601d60248201527f596f7520646964206e6f742073656e6420656e6f756768206574686572000000604482015290519081900360640190fd5b6004548101431015610a105760405162461bcd60e51b81526004018080602001828103825260228152602001806111276022913960400191505060405180910390fd5b60055481014310610a525760405162461bcd60e51b81526004018080602001828103825260278152602001806111496027913960400191505060405180910390fd5b600754604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015610a9757600080fd5b505afa158015610aab573d6000803e3d6000fd5b505050506040513d6020811015610ac157600080fd5b50519050610200811115610b065760405162461bcd60e51b81526004018080602001828103825260218152602001806110e66021913960400191505060405180910390fd5b600754604080516340c10f1960e01b81526001600160a01b03868116600483015260248201869052915191909216916340c10f199160448083019260209291908290030181600087803b158015610b5c57600080fd5b505af1158015610b70573d6000803e3d6000fd5b505050506040513d6020811015610b8657600080fd5b5050600354600090610bb290606490610ba690349063ffffffff610df016565b9063ffffffff610e5216565b90506000610bc6348363ffffffff610e9416565b6006546040519192506000916101009091046001600160a01b03169084908381818185875af1925050503d8060008114610c1c576040519150601f19603f3d011682016040523d82523d6000602084013e610c21565b606091505b50508091505080610c79576040805162461bcd60e51b815260206004820152601760248201527f41646d696e206661696c656420746f2072656365697665000000000000000000604482015290519081900360640190fd5b6001546040516001600160a01b03909116908390600081818185875af1925050503d8060008114610cc6576040519150601f19603f3d011682016040523d82523d6000602084013e610ccb565b606091505b50508091505080610d23576040805162461bcd60e51b815260206004820152601860248201527f417274697374206661696c656420746f20726563656976650000000000000000604482015290519081900360640190fd5b604080518681526001600160a01b03881660208201523481830152606081018490526080810185905290517f33b5f6bed230cfc36865e6fbd592c08763bd928b1ea9adf07342d297f77ced8b9181900360a00190a150506000805460ff60a01b1916600160a01b17905550505050565b60035481565b610da16107f4565b610de0576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b610de981610ed6565b50565b3390565b600082610dff57506000610e4c565b82820282848281610e0c57fe5b0414610e495760405162461bcd60e51b81526004018080602001828103825260218152602001806110c56021913960400191505060405180910390fd5b90505b92915050565b6000610e4983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610f76565b6000610e4983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611018565b6001600160a01b038116610f1b5760405162461bcd60e51b81526004018080602001828103825260268152602001806110736026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600081836110025760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610fc7578181015183820152602001610faf565b50505050905090810190601f168015610ff45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161100e57fe5b0495945050505050565b6000818484111561106a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fc7578181015183820152602001610faf565b50505090039056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735468652061646d696e2073706c6974206d757374206265206c657373206f7220657175616c20746f20313030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774e6f206d6f726520617661696c61626c65206d7574616e747320746f206d696e744f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657243616e6e6f74206d696e742061206d7574616e7420696e207468652066757475726543616e6e6f74206d696e742061206d7574616e7420746f2066617220696e207468652070617374a265627a7a72315820e83fc4ce3a3abbc6a62f09bd42b0bc7a51c5171ba2b4c71f539dea28f5a3ea2864736f6c6343000511003200000000000000000000000020c70bdfcc398c1f06ba81730c8b52ace3af7cc3000000000000000000000000af2ce0962d1a4b1aab10f7faa62bbbca40a8ea53
Deployed Bytecode
0x60806040526004361061011f5760003560e01c80638d6cc56d116100a0578063a8afd87d11610064578063a8afd87d14610320578063ad9604071461034a578063cce7ec1314610374578063d792440b146103a0578063f2fde38b146103b55761011f565b80638d6cc56d146102a25780638da5cb5b146102cc5780638f32d59b146102e1578063a035b1fe146102f6578063a4617a9c1461030b5761011f565b80635c975abb116100e75780635c975abb146101f55780635eec08701461021e5780636242028214610251578063684931ed14610278578063715018a61461028d5761011f565b806308cdc2a8146101245780632c482b201461015257806336b19cd71461018557806343bc1612146101b65780634cd31e73146101cb575b600080fd5b34801561013057600080fd5b506101506004803603602081101561014757600080fd5b503515156103e8565b005b34801561015e57600080fd5b506101506004803603602081101561017557600080fd5b50356001600160a01b03166104a1565b34801561019157600080fd5b5061019a61050a565b604080516001600160a01b039092168252519081900360200190f35b3480156101c257600080fd5b5061019a61051e565b3480156101d757600080fd5b50610150600480360360208110156101ee57600080fd5b503561052d565b34801561020157600080fd5b5061020a61061b565b604080519115158252519081900360200190f35b34801561022a57600080fd5b506101506004803603602081101561024157600080fd5b50356001600160a01b0316610624565b34801561025d57600080fd5b50610266610693565b60408051918252519081900360200190f35b34801561028457600080fd5b5061019a610699565b34801561029957600080fd5b506101506106a8565b3480156102ae57600080fd5b50610150600480360360208110156102c557600080fd5b5035610739565b3480156102d857600080fd5b5061019a6107e5565b3480156102ed57600080fd5b5061020a6107f4565b34801561030257600080fd5b50610266610818565b34801561031757600080fd5b5061026661081e565b34801561032c57600080fd5b506101506004803603602081101561034357600080fd5b5035610824565b34801561035657600080fd5b506101506004803603602081101561036d57600080fd5b5035610870565b6101506004803603604081101561038a57600080fd5b506001600160a01b0381351690602001356108bc565b3480156103ac57600080fd5b50610266610d93565b3480156103c157600080fd5b50610150600480360360208110156103d857600080fd5b50356001600160a01b0316610d99565b6103f06107f4565b61042f576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b6006805460ff19168215151790819055600154600254600354604080516001600160a01b03909416845260208401929092528282015260ff9092161515606082015290517fd7d16f9ccfb1f3b06ebf4cfd78736c09153a419884e47e95b3e0f2b378f23492916080908290030190a150565b6104a96107f4565b6104e8576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60065461010090046001600160a01b031681565b6001546001600160a01b031681565b6105356107f4565b610574576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b606460035411156105b65760405162461bcd60e51b815260040180806020018281038252602c815260200180611099602c913960400191505060405180910390fd5b6003819055600154600254600654604080516001600160a01b039094168452602084019290925282820184905260ff1615156060830152517fd7d16f9ccfb1f3b06ebf4cfd78736c09153a419884e47e95b3e0f2b378f234929181900360800190a150565b60065460ff1681565b61062c6107f4565b61066b576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60055481565b6007546001600160a01b031681565b6106b06107f4565b6106ef576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6107416107f4565b610780576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b6002819055600154600354600654604080516001600160a01b039094168452602084018590528381019290925260ff1615156060830152517fd7d16f9ccfb1f3b06ebf4cfd78736c09153a419884e47e95b3e0f2b378f234929181900360800190a150565b6000546001600160a01b031690565b600080546001600160a01b0316610809610dec565b6001600160a01b031614905090565b60025481565b60045481565b61082c6107f4565b61086b576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b600555565b6108786107f4565b6108b7576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b600455565b60065460ff161561090b576040805162461bcd60e51b815260206004820152601460248201527310dbdb9d1c9bdb1b195c881a5cc81c185d5cd95960621b604482015290519081900360640190fd5b600054600160a01b900460ff16610969576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff60a01b191690556002543410156109cd576040805162461bcd60e51b815260206004820152601d60248201527f596f7520646964206e6f742073656e6420656e6f756768206574686572000000604482015290519081900360640190fd5b6004548101431015610a105760405162461bcd60e51b81526004018080602001828103825260228152602001806111276022913960400191505060405180910390fd5b60055481014310610a525760405162461bcd60e51b81526004018080602001828103825260278152602001806111496027913960400191505060405180910390fd5b600754604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015610a9757600080fd5b505afa158015610aab573d6000803e3d6000fd5b505050506040513d6020811015610ac157600080fd5b50519050610200811115610b065760405162461bcd60e51b81526004018080602001828103825260218152602001806110e66021913960400191505060405180910390fd5b600754604080516340c10f1960e01b81526001600160a01b03868116600483015260248201869052915191909216916340c10f199160448083019260209291908290030181600087803b158015610b5c57600080fd5b505af1158015610b70573d6000803e3d6000fd5b505050506040513d6020811015610b8657600080fd5b5050600354600090610bb290606490610ba690349063ffffffff610df016565b9063ffffffff610e5216565b90506000610bc6348363ffffffff610e9416565b6006546040519192506000916101009091046001600160a01b03169084908381818185875af1925050503d8060008114610c1c576040519150601f19603f3d011682016040523d82523d6000602084013e610c21565b606091505b50508091505080610c79576040805162461bcd60e51b815260206004820152601760248201527f41646d696e206661696c656420746f2072656365697665000000000000000000604482015290519081900360640190fd5b6001546040516001600160a01b03909116908390600081818185875af1925050503d8060008114610cc6576040519150601f19603f3d011682016040523d82523d6000602084013e610ccb565b606091505b50508091505080610d23576040805162461bcd60e51b815260206004820152601860248201527f417274697374206661696c656420746f20726563656976650000000000000000604482015290519081900360640190fd5b604080518681526001600160a01b03881660208201523481830152606081018490526080810185905290517f33b5f6bed230cfc36865e6fbd592c08763bd928b1ea9adf07342d297f77ced8b9181900360a00190a150506000805460ff60a01b1916600160a01b17905550505050565b60035481565b610da16107f4565b610de0576040805162461bcd60e51b81526020600482018190526024820152600080516020611107833981519152604482015290519081900360640190fd5b610de981610ed6565b50565b3390565b600082610dff57506000610e4c565b82820282848281610e0c57fe5b0414610e495760405162461bcd60e51b81526004018080602001828103825260218152602001806110c56021913960400191505060405180910390fd5b90505b92915050565b6000610e4983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610f76565b6000610e4983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611018565b6001600160a01b038116610f1b5760405162461bcd60e51b81526004018080602001828103825260268152602001806110736026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600081836110025760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610fc7578181015183820152602001610faf565b50505050905090810190601f168015610ff45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161100e57fe5b0495945050505050565b6000818484111561106a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fc7578181015183820152602001610faf565b50505090039056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735468652061646d696e2073706c6974206d757374206265206c657373206f7220657175616c20746f20313030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774e6f206d6f726520617661696c61626c65206d7574616e747320746f206d696e744f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657243616e6e6f74206d696e742061206d7574616e7420696e207468652066757475726543616e6e6f74206d696e742061206d7574616e7420746f2066617220696e207468652070617374a265627a7a72315820e83fc4ce3a3abbc6a62f09bd42b0bc7a51c5171ba2b4c71f539dea28f5a3ea2864736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000020c70bdfcc398c1f06ba81730c8b52ace3af7cc3000000000000000000000000af2ce0962d1a4b1aab10f7faa62bbbca40a8ea53
-----Decoded View---------------
Arg [0] : _seeder (address): 0x20C70BDFCc398C1f06bA81730c8B52ACE3af7cc3
Arg [1] : _adminWallet (address): 0xaF2CE0962D1a4B1AAB10f7faA62bBbcA40a8EA53
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000020c70bdfcc398c1f06ba81730c8b52ace3af7cc3
Arg [1] : 000000000000000000000000af2ce0962d1a4b1aab10f7faa62bbbca40a8ea53
Deployed Bytecode Sourcemap
63113:3614:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64208:232;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64208:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64208:232:0;;;;:::i;:::-;;66385:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66385:99:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66385:99:0;-1:-1:-1;;;;;66385:99:0;;:::i;63893:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63893:34:0;;;:::i;:::-;;;;-1:-1:-1;;;;;63893:34:0;;;;;;;;;;;;;;63174:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63174:29:0;;;:::i;65937:313::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65937:313:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65937:313:0;;:::i;63363:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63363:26:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;66258:119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66258:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66258:119:0;-1:-1:-1;;;;;66258:119:0;;:::i;63325:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63325:31:0;;;:::i;:::-;;;;;;;;;;;;;;;;63934:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63934:20:0;;;:::i;52744:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52744:140:0;;;:::i;64448:231::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64448:231:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64448:231:0;;:::i;51933:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51933:79:0;;;:::i;52299:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52299:94:0;;;:::i;63210:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63210:33:0;;;:::i;63287:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63287:31:0;;;:::i;66612:112::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66612:112:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66612:112:0;;:::i;66492:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66492:112:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66492:112:0;;:::i;64687:1242::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;64687:1242:0;;;;;;;;:::i;63250:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63250:30:0;;;:::i;53039:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53039:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53039:109:0;-1:-1:-1;;;;;53039:109:0;;:::i;64208:232::-;52145:9;:7;:9::i;:::-;52137:54;;;;;-1:-1:-1;;;52137:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52137:54:0;;;;;;;;;;;;;;;64295:6;:16;;-1:-1:-1;;64295:16:0;;;;;;;;;-1:-1:-1;64349:6:0;64370:5;;64390:10;;64327:105;;;-1:-1:-1;;;;;64349:6:0;;;64327:105;;;;;;;;;;;;;64295:16;64415:6;;;64327:105;;;;;;;;;;;;;;;;;;64208:232;:::o;66385:99::-;52145:9;:7;:9::i;:::-;52137:54;;;;;-1:-1:-1;;;52137:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52137:54:0;;;;;;;;;;;;;;;66460:6;:16;;-1:-1:-1;;;;;;66460:16:0;-1:-1:-1;;;;;66460:16:0;;;;;;;;;;66385:99::o;63893:34::-;;;;;;-1:-1:-1;;;;;63893:34:0;;:::o;63174:29::-;;;-1:-1:-1;;;;;63174:29:0;;:::o;65937:313::-;52145:9;:7;:9::i;:::-;52137:54;;;;;-1:-1:-1;;;52137:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52137:54:0;;;;;;;;;;;;;;;66034:3;66020:10;;:17;;66012:74;;;;-1:-1:-1;;;66012:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66097:10;:24;;;66159:6;;66180:5;;66225:6;;66137:105;;;-1:-1:-1;;;;;66159:6:0;;;66137:105;;;;;;;;;;;;;;;66225:6;;66137:105;;;;;;;;;;;;;;;;65937:313;:::o;63363:26::-;;;;;;:::o;66258:119::-;52145:9;:7;:9::i;:::-;52137:54;;;;;-1:-1:-1;;;52137:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52137:54:0;;;;;;;;;;;;;;;66343:11;:26;;-1:-1:-1;;;;;66343:26:0;;;;;-1:-1:-1;;;;;;66343:26:0;;;;;;;;;66258:119::o;63325:31::-;;;;:::o;63934:20::-;;;-1:-1:-1;;;;;63934:20:0;;:::o;52744:140::-;52145:9;:7;:9::i;:::-;52137:54;;;;;-1:-1:-1;;;52137:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52137:54:0;;;;;;;;;;;;;;;52843:1;52827:6;;52806:40;;-1:-1:-1;;;;;52827:6:0;;;;52806:40;;52843:1;;52806:40;52874:1;52857:19;;-1:-1:-1;;;;;;52857:19:0;;;52744:140::o;64448:231::-;52145:9;:7;:9::i;:::-;52137:54;;;;;-1:-1:-1;;;52137:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52137:54:0;;;;;;;;;;;;;;;64536:5;:14;;;64588:6;;64629:10;;64654:6;;64566:105;;;-1:-1:-1;;;;;64588:6:0;;;64566:105;;;;;;;;;;;;;;;64654:6;;64566:105;;;;;;;;;;;;;;;;64448:231;:::o;51933:79::-;51971:7;51998:6;-1:-1:-1;;;;;51998:6:0;51933:79;:::o;52299:94::-;52339:4;52379:6;;-1:-1:-1;;;;;52379:6:0;52363:12;:10;:12::i;:::-;-1:-1:-1;;;;;52363:22:0;;52356:29;;52299:94;:::o;63210:33::-;;;;:::o;63287:31::-;;;;:::o;66612:112::-;52145:9;:7;:9::i;:::-;52137:54;;;;;-1:-1:-1;;;52137:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52137:54:0;;;;;;;;;;;;;;;66690:11;:26;66612:112::o;66492:::-;52145:9;:7;:9::i;:::-;52137:54;;;;;-1:-1:-1;;;52137:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52137:54:0;;;;;;;;;;;;;;;66570:11;:26;66492:112::o;64687:1242::-;64004:6;;;;64003:7;63995:40;;;;;-1:-1:-1;;;63995:40:0;;;;;;;;;;;;-1:-1:-1;;;63995:40:0;;;;;;;;;;;;;;;62496:11;;-1:-1:-1;;;62496:11:0;;;;62488:55;;;;;-1:-1:-1;;;62488:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;62635:5;62621:19;;-1:-1:-1;;;;62621:19:0;;;64847:5;;64834:9;:18;;64826:60;;;;;-1:-1:-1;;;64826:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;65019:11;;65009:7;:21;64993:12;:37;;64985:84;;;;-1:-1:-1;;;64985:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65113:11;;65103:7;:21;65088:12;:36;65080:88;;;;-1:-1:-1;;;65080:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65201:6;;:20;;;-1:-1:-1;;;65201:20:0;;;;65179:19;;-1:-1:-1;;;;;65201:6:0;;:18;;:20;;;;;;;;;;;;;;:6;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;65201:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65201:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65201:20:0;;-1:-1:-1;63426:3:0;65240:25;;;65232:71;;;;-1:-1:-1;;;65232:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65316:6;;:31;;;-1:-1:-1;;;65316:31:0;;-1:-1:-1;;;;;65316:31:0;;;;;;;;;;;;;;;:6;;;;;:11;;:31;;;;;;;;;;;;;;:6;;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;65316:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65316:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;65398:10:0;;65360:21;;65384:34;;65414:3;;65384:25;;:9;;:25;:13;:25;:::i;:::-;:29;:34;:29;:34;:::i;:::-;65360:58;-1:-1:-1;65429:22:0;65454:28;:9;65360:58;65454:28;:13;:28;:::i;:::-;65540:11;;:41;;65429:53;;-1:-1:-1;65503:12:0;;65540:11;;;;-1:-1:-1;;;;;65540:11:0;;65563:13;;65503:12;65540:41;65503:12;65540:41;65563:13;65540:11;:41;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;65526:55:0;;;;;65600:7;65592:43;;;;;-1:-1:-1;;;65592:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;65660:6;;:37;;-1:-1:-1;;;;;65660:6:0;;;;65678:14;;65660:6;:37;:6;:37;65678:14;65660:6;:37;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;65646:51:0;;;;;65716:7;65708:44;;;;;-1:-1:-1;;;65708:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;65770:151;;;;;;-1:-1:-1;;;;;65770:151:0;;;;;;65844:9;65770:151;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62801:11:0;:18;;-1:-1:-1;;;;62801:18:0;-1:-1:-1;;;62801:18:0;;;-1:-1:-1;;;;64687:1242:0:o;63250:30::-;;;;:::o;53039:109::-;52145:9;:7;:9::i;:::-;52137:54;;;;;-1:-1:-1;;;52137:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52137:54:0;;;;;;;;;;;;;;;53112:28;53131:8;53112:18;:28::i;:::-;53039:109;:::o;936:98::-;1016:10;936:98;:::o;7797:471::-;7855:7;8100:6;8096:47;;-1:-1:-1;8130:1:0;8123:8;;8096:47;8167:5;;;8171:1;8167;:5;:1;8191:5;;;;;:10;8183:56;;;;-1:-1:-1;;;8183:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8259:1;-1:-1:-1;7797:471:0;;;;;:::o;8736:132::-;8794:7;8821:39;8825:1;8828;8821:39;;;;;;;;;;;;;;;;;:3;:39::i;6881:136::-;6939:7;6966:43;6970:1;6973;6966:43;;;;;;;;;;;;;;;;;:3;:43::i;53254:229::-;-1:-1:-1;;;;;53328:22:0;;53320:73;;;;-1:-1:-1;;;53320:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53430:6;;;53409:38;;-1:-1:-1;;;;;53409:38:0;;;;53430:6;;;53409:38;;;53458:6;:17;;-1:-1:-1;;;;;;53458:17:0;-1:-1:-1;;;;;53458:17:0;;;;;;;;;;53254:229::o;9398:345::-;9484:7;9586:12;9579:5;9571:28;;;;-1:-1:-1;;;9571:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9571:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9610:9;9626:1;9622;:5;;;;;;;9398:345;-1:-1:-1;;;;;9398:345:0:o;7354:192::-;7440:7;7476:12;7468:6;;;;7460:29;;;;-1:-1:-1;;;7460:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7460:29:0;-1:-1:-1;;;7512:5:0;;;7354:192::o
Swarm Source
bzzr://e83fc4ce3a3abbc6a62f09bd42b0bc7a51c5171ba2b4c71f539dea28f5a3ea28
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 29 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.