Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 891 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 24056998 | 64 days ago | IN | 0 ETH | 0.00010394 | ||||
| Set Approval For... | 23686987 | 116 days ago | IN | 0 ETH | 0.00000452 | ||||
| Set Approval For... | 22881947 | 228 days ago | IN | 0 ETH | 0.00027653 | ||||
| Set Approval For... | 21744556 | 387 days ago | IN | 0 ETH | 0.00032881 | ||||
| Set Approval For... | 21416222 | 433 days ago | IN | 0 ETH | 0.00098939 | ||||
| Set Approval For... | 20811390 | 518 days ago | IN | 0 ETH | 0.00096282 | ||||
| Set Approval For... | 20799059 | 519 days ago | IN | 0 ETH | 0.00061112 | ||||
| Set Approval For... | 20668952 | 538 days ago | IN | 0 ETH | 0.00023968 | ||||
| Set Approval For... | 19926152 | 641 days ago | IN | 0 ETH | 0.00093678 | ||||
| Safe Transfer Fr... | 19881102 | 648 days ago | IN | 0 ETH | 0.00042121 | ||||
| Set Approval For... | 19820744 | 656 days ago | IN | 0 ETH | 0.00015633 | ||||
| Set Approval For... | 19633817 | 682 days ago | IN | 0 ETH | 0.00074857 | ||||
| Set Approval For... | 19451596 | 708 days ago | IN | 0 ETH | 0.00111658 | ||||
| Set Approval For... | 19121897 | 754 days ago | IN | 0 ETH | 0.00068528 | ||||
| Set Approval For... | 19044018 | 765 days ago | IN | 0 ETH | 0.0005224 | ||||
| Set Approval For... | 18701423 | 813 days ago | IN | 0 ETH | 0.00160845 | ||||
| Set Approval For... | 18596558 | 828 days ago | IN | 0 ETH | 0.00092309 | ||||
| Transfer From | 18500840 | 841 days ago | IN | 0 ETH | 0.00071262 | ||||
| Transfer From | 18500839 | 841 days ago | IN | 0 ETH | 0.00099373 | ||||
| Set Approval For... | 18465869 | 846 days ago | IN | 0 ETH | 0.00107186 | ||||
| Set Approval For... | 18457996 | 847 days ago | IN | 0 ETH | 0.00066502 | ||||
| Set Approval For... | 18099976 | 897 days ago | IN | 0 ETH | 0.00035245 | ||||
| Set Approval For... | 17984630 | 913 days ago | IN | 0 ETH | 0.00104411 | ||||
| Safe Transfer Fr... | 17981360 | 914 days ago | IN | 0 ETH | 0.00073572 | ||||
| Set Approval For... | 17903464 | 925 days ago | IN | 0 ETH | 0.00059277 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 16514402 | 1120 days ago | 2.508 ETH | ||||
| Transfer | 16450615 | 1129 days ago | 0.304 ETH | ||||
| Transfer | 16430416 | 1132 days ago | 2.698 ETH | ||||
| Transfer | 16392373 | 1137 days ago | 0.798 ETH | ||||
| Transfer | 16370260 | 1140 days ago | 0.19 ETH | ||||
| Transfer | 16365432 | 1141 days ago | 0.076 ETH | ||||
| Transfer | 16363951 | 1141 days ago | 0.836 ETH | ||||
| Transfer | 16351435 | 1143 days ago | 0.342 ETH | ||||
| Transfer | 16346774 | 1144 days ago | 1.672 ETH | ||||
| Transfer | 16328897 | 1146 days ago | 0.836 ETH | ||||
| Transfer | 16314975 | 1148 days ago | 1.748 ETH | ||||
| Transfer | 16306848 | 1149 days ago | 3.078 ETH | ||||
| Transfer | 16274735 | 1154 days ago | 1.976 ETH | ||||
| Transfer | 16184119 | 1166 days ago | 0.608 ETH | ||||
| Transfer | 16124025 | 1175 days ago | 0.38 ETH | ||||
| Transfer | 15727604 | 1230 days ago | 0.228 ETH | ||||
| Transfer | 15536832 | 1257 days ago | 0.494 ETH | ||||
| Transfer | 15450832 | 1271 days ago | 0.38 ETH | ||||
| Transfer | 15450756 | 1271 days ago | 0.38 ETH | ||||
| Transfer | 15450744 | 1271 days ago | 0.494 ETH | ||||
| Transfer | 15410399 | 1277 days ago | 6.46 ETH | ||||
| Transfer | 15406861 | 1278 days ago | 1.406 ETH | ||||
| Transfer | 15391176 | 1280 days ago | 1.1385 ETH | ||||
| Transfer | 15368304 | 1284 days ago | 0.621 ETH | ||||
| Transfer | 15332094 | 1290 days ago | 0.483 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MechaPilots
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// Sources flattened with hardhat v2.6.0 https://hardhat.org
// File @openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol@v4.3.2
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165Upgradeable {
/**
* @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/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721Upgradeable is IERC165Upgradeable {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
// File @openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721ReceiverUpgradeable {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721MetadataUpgradeable is IERC721Upgradeable {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @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) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @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].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
require(_initializing || !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
}
// File @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal initializer {
__Context_init_unchained();
}
function __Context_init_unchained() internal initializer {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
uint256[50] private __gap;
}
// File @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library StringsUpgradeable {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// File @openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {
function __ERC165_init() internal initializer {
__ERC165_init_unchained();
}
function __ERC165_init_unchained() internal initializer {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165Upgradeable).interfaceId;
}
uint256[50] private __gap;
}
// File @openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {
using AddressUpgradeable for address;
using StringsUpgradeable for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
function __ERC721_init(string memory name_, string memory symbol_) internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__ERC721_init_unchained(name_, symbol_);
}
function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {
return
interfaceId == type(IERC721Upgradeable).interfaceId ||
interfaceId == type(IERC721MetadataUpgradeable).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721Upgradeable.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"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
require(operator != _msgSender(), "ERC721: approve to caller");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721Upgradeable.ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721Upgradeable.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721Upgradeable.ownerOf(tokenId), 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.
*
* @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
) private returns (bool) {
if (to.isContract()) {
try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721ReceiverUpgradeable.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
uint256[44] private __gap;
}
// File @openzeppelin/contracts-upgradeable/interfaces/IERC165Upgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
// File @openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Interface for the NFT Royalty Standard
*/
interface IERC2981Upgradeable is IERC165Upgradeable {
/**
* @dev Called with the sale price to determine how much royalty is owed and to whom.
* @param tokenId - the NFT asset queried for royalty information
* @param salePrice - the sale price of the NFT asset specified by `tokenId`
* @return receiver - address of who should be sent the royalty payment
* @return royaltyAmount - the royalty payment amount for `salePrice`
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}
// File @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol@v4.3.2
pragma solidity ^0.8.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.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal initializer {
__Context_init_unchained();
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal initializer {
_setOwner(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
uint256[49] private __gap;
}
// File @openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library CountersUpgradeable {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
// File gwei-slim-nft-contracts/contracts/base/IBaseERC721Interface.sol@v1.0.3
pragma solidity 0.8.9;
/// Additional features and functions assigned to the
/// Base721 contract for hooks and overrides
interface IBaseERC721Interface {
/*
Exposing common NFT internal functionality for base contract overrides
To save gas and make API cleaner this is only for new functionality not exposed in
the core ERC721 contract
*/
/// Mint an NFT. Allowed to mint by owner, approval or by the parent contract
/// @param tokenId id to burn
function __burn(uint256 tokenId) external;
/// Mint an NFT. Allowed only by the parent contract
/// @param to address to mint to
/// @param tokenId token id to mint
function __mint(address to, uint256 tokenId) external;
/// Set the base URI of the contract. Allowed only by parent contract
/// @param base base uri
/// @param extension extension
function __setBaseURI(string memory base, string memory extension) external;
/* Exposes common internal read features for public use */
/// Token exists
/// @param tokenId token id to see if it exists
function __exists(uint256 tokenId) external view returns (bool);
/// Simple approval for operation check on token for address
/// @param spender address spending/changing token
/// @param tokenId tokenID to change / operate on
function __isApprovedOrOwner(address spender, uint256 tokenId)
external
view
returns (bool);
function __isApprovedForAll(address owner, address operator)
external
view
returns (bool);
function __tokenURI(uint256 tokenId) external view returns (string memory);
function __owner() external view returns (address);
}
// File gwei-slim-nft-contracts/contracts/base/ERC721Base.sol@v1.0.3
pragma solidity 0.8.9;
struct ConfigSettings {
uint16 royaltyBps;
string uriBase;
string uriExtension;
bool hasTransferHook;
}
/**
This smart contract adds features and allows for a ownership only by another smart contract as fallback behavior
while also implementing all normal ERC721 functions as expected
*/
contract ERC721Base is
ERC721Upgradeable,
IBaseERC721Interface,
IERC2981Upgradeable,
OwnableUpgradeable
{
using CountersUpgradeable for CountersUpgradeable.Counter;
// Minted counter for totalSupply()
CountersUpgradeable.Counter private mintedCounter;
modifier onlyInternal() {
require(msg.sender == address(this), "Only internal");
_;
}
/// on-chain record of when this contract was deployed
uint256 public immutable deployedBlock;
ConfigSettings public advancedConfig;
/// Constructor called once when the base contract is deployed
constructor() {
// Can be used to verify contract implementation is correct at address
deployedBlock = block.number;
}
/// Initializer that's called when a new child nft is setup
/// @param newOwner Owner for the new derived nft
/// @param _name name of NFT contract
/// @param _symbol symbol of NFT contract
/// @param settings configuration settings for uri, royalty, and hooks features
function initialize(
address newOwner,
string memory _name,
string memory _symbol,
ConfigSettings memory settings
) public initializer {
__ERC721_init(_name, _symbol);
__Ownable_init();
advancedConfig = settings;
transferOwnership(newOwner);
}
/// Getter to expose appoval status to root contract
function isApprovedForAll(address _owner, address operator)
public
view
override
returns (bool)
{
return
ERC721Upgradeable.isApprovedForAll(_owner, operator) ||
operator == address(this);
}
/// internal getter for approval by all
/// When isApprovedForAll is overridden, this can be used to call original impl
function __isApprovedForAll(address _owner, address operator)
public
view
override
returns (bool)
{
return isApprovedForAll(_owner, operator);
}
/// Hook that when enabled manually calls _beforeTokenTransfer on
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal override {
if (advancedConfig.hasTransferHook) {
(bool success, ) = address(this).delegatecall(
abi.encodeWithSignature(
"_beforeTokenTransfer(address,address,uint256)",
from,
to,
tokenId
)
);
// Raise error again from result if error exists
assembly {
switch success
// delegatecall returns 0 on error.
case 0 {
returndatacopy(0, 0, returndatasize())
revert(0, returndatasize())
}
}
}
}
/// Internal-only function to update the base uri
function __setBaseURI(string memory uriBase, string memory uriExtension)
public
override
onlyInternal
{
advancedConfig.uriBase = uriBase;
advancedConfig.uriExtension = uriExtension;
}
/// @dev returns the number of minted tokens
/// uses some extra gas but makes etherscan and users happy so :shrug:
/// partial erc721enumerable implemntation
function totalSupply() public view returns (uint256) {
return mintedCounter.current();
}
/**
Internal-only
@param to address to send the newly minted NFT to
@dev This mints one edition to the given address by an allowed minter on the edition instance.
*/
function __mint(address to, uint256 tokenId)
external
override
onlyInternal
{
_mint(to, tokenId);
mintedCounter.increment();
}
/**
@param tokenId Token ID to burn
User burn function for token id
*/
function burn(uint256 tokenId) public {
require(_isApprovedOrOwner(_msgSender(), tokenId), "Not allowed");
_burn(tokenId);
mintedCounter.decrement();
}
/// Internal only
function __burn(uint256 tokenId) public onlyInternal {
_burn(tokenId);
mintedCounter.decrement();
}
/**
Simple override for owner interface.
*/
function owner()
public
view
override(OwnableUpgradeable)
returns (address)
{
return super.owner();
}
/// internal alias for overrides
function __owner()
public
view
override(IBaseERC721Interface)
returns (address)
{
return owner();
}
/// Get royalty information for token
/// ignored token id to get royalty info. able to override and set per-token royalties
/// @param _salePrice sales price for token to determine royalty split
function royaltyInfo(uint256, uint256 _salePrice)
external
view
override
returns (address receiver, uint256 royaltyAmount)
{
// If ownership is revoked, don't set royalties.
if (owner() == address(0x0)) {
return (owner(), 0);
}
return (owner(), (_salePrice * advancedConfig.royaltyBps) / 10_000);
}
/// Default simple token-uri implementation. works for ipfs folders too
/// @param tokenId token id ot get uri for
/// @return default uri getter functionality
function tokenURI(uint256 tokenId)
public
view
override
returns (string memory)
{
require(_exists(tokenId), "No token");
return
string(
abi.encodePacked(
advancedConfig.uriBase,
StringsUpgradeable.toString(tokenId),
advancedConfig.uriExtension
)
);
}
/// internal base override
function __tokenURI(uint256 tokenId)
public
view
onlyInternal
returns (string memory)
{
return tokenURI(tokenId);
}
/// Exposing token exists check for base contract
function __exists(uint256 tokenId) external view override returns (bool) {
return _exists(tokenId);
}
/// Getter for approved or owner
function __isApprovedOrOwner(address spender, uint256 tokenId)
external
view
override
onlyInternal
returns (bool)
{
return _isApprovedOrOwner(spender, tokenId);
}
/// IERC165 getter
/// @param interfaceId interfaceId bytes4 to check support for
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721Upgradeable, IERC165Upgradeable)
returns (bool)
{
return
type(IERC2981Upgradeable).interfaceId == interfaceId ||
type(IBaseERC721Interface).interfaceId == interfaceId ||
ERC721Upgradeable.supportsInterface(interfaceId);
}
}
// File @openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC1967 implementation slot:
* ```
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*
* _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
*/
library StorageSlotUpgradeable {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/
function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BooleanSlot` with member `value` located at `slot`.
*/
function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
*/
function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Uint256Slot` with member `value` located at `slot`.
*/
function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
assembly {
r.slot := slot
}
}
}
// File gwei-slim-nft-contracts/contracts/base/ERC721Delegated.sol@v1.0.3
pragma solidity 0.8.9;
contract ERC721Delegated {
uint256[100000] gap;
bytes32 internal constant _IMPLEMENTATION_SLOT =
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
// Reference to base NFT implementation
function implementation() public view returns (address) {
return
StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;
}
function _initImplementation(address _nftImplementation) private {
StorageSlotUpgradeable
.getAddressSlot(_IMPLEMENTATION_SLOT)
.value = _nftImplementation;
}
/// Constructor that sets up the
constructor(
address _nftImplementation,
string memory name,
string memory symbol,
ConfigSettings memory settings
) {
/// Removed for gas saving reasons, the check below implictly accomplishes this
// require(
// _nftImplementation.supportsInterface(
// type(IBaseERC721Interface).interfaceId
// )
// );
_initImplementation(_nftImplementation);
(bool success, ) = _nftImplementation.delegatecall(
abi.encodeWithSignature(
"initialize(address,string,string,(uint16,string,string,bool))",
msg.sender,
name,
symbol,
settings
)
);
require(success);
}
/// OnlyOwner implemntation that proxies to base ownable contract for info
modifier onlyOwner() {
require(msg.sender == base().__owner(), "Not owner");
_;
}
/// Getter to return the base implementation contract to call methods from
/// Don't expose base contract to parent due to need to call private internal base functions
function base() private view returns (IBaseERC721Interface) {
return IBaseERC721Interface(address(this));
}
// helpers to mimic Openzeppelin internal functions
/// Getter for the contract owner
/// @return address owner address
function _owner() internal view returns (address) {
return base().__owner();
}
/// Internal burn function, only accessible from within contract
/// @param id nft id to burn
function _burn(uint256 id) internal {
base().__burn(id);
}
/// Internal mint function, only accessible from within contract
/// @param to address to mint NFT to
/// @param id nft id to mint
function _mint(address to, uint256 id) internal {
base().__mint(to, id);
}
/// Internal exists function to determine if fn exists
/// @param id nft id to check if exists
function _exists(uint256 id) internal view returns (bool) {
return base().__exists(id);
}
/// Internal getter for tokenURI
/// @param tokenId id of token to get tokenURI for
function _tokenURI(uint256 tokenId) internal view returns (string memory) {
return base().__tokenURI(tokenId);
}
/// is approved for all getter underlying getter
/// @param owner to check
/// @param operator to check
function _isApprovedForAll(address owner, address operator)
internal
view
returns (bool)
{
return base().__isApprovedForAll(owner, operator);
}
/// Internal getter for approved or owner for a given operator
/// @param operator address of operator to check
/// @param id id of nft to check for
function _isApprovedOrOwner(address operator, uint256 id)
internal
view
returns (bool)
{
return base().__isApprovedOrOwner(operator, id);
}
/// Sets the base URI of the contract. Allowed only by parent contract
/// @param newUri new uri base (http://URI) followed by number string of nft followed by extension string
/// @param newExtension optional uri extension
function _setBaseURI(string memory newUri, string memory newExtension)
internal
{
base().__setBaseURI(newUri, newExtension);
}
/**
* @dev Delegates the current call to nftImplementation.
*
* This function does not return to its internall call site, it will return directly to the external caller.
*/
function _fallback() internal virtual {
address impl = implementation();
assembly {
// Copy msg.data. We take full control of memory in this inline assembly
// block because it will not return to Solidity code. We overwrite the
// Solidity scratch pad at memory position 0.
calldatacopy(0, 0, calldatasize())
// Call the implementation.
// out and outsize are 0 because we don't know the size yet.
let result := delegatecall(gas(), impl, 0, calldatasize(), 0, 0)
// Copy the returned data.
returndatacopy(0, 0, returndatasize())
switch result
// delegatecall returns 0 on error.
case 0 {
revert(0, returndatasize())
}
default {
return(0, returndatasize())
}
}
}
/**
* @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
* function in the contract matches the call data.
*/
fallback() external virtual {
_fallback();
}
/**
* @dev No base NFT functions receive any value
*/
receive() external payable {
revert();
}
}
// File contracts/MechaPilots.sol
pragma solidity 0.8.9;
contract MechaPilots is ERC721Delegated {
uint256 public MAX_SUPPLY = 10000;
uint256 public MAX_PURCHASE_PER_TX = 11;
uint256 public reserveTokenId = 0;
uint256 public mintPrice = 0.0525 ether;
address public crossMintAddress = 0xdAb1a1854214684acE522439684a145E62505233;
bool public sale = false;
bool public allowProxies = true;
mapping(address => bool) public projectProxy;
constructor(
address baseFactory
)
ERC721Delegated(
baseFactory,
"MechaPilots",
"MVP",
ConfigSettings({
royaltyBps: 500,
uriBase: "",
uriExtension: "",
hasTransferHook: false
})
)
{
}
function mint(uint256 amount) public payable {
require(sale, "Sale not yet open");
require(reserveTokenId + amount <= MAX_SUPPLY, "Sold Out");
require(msg.value == mintPrice * amount, "Purchase: payment incorrect");
require(amount <= MAX_PURCHASE_PER_TX, "Purchase: max purchase amount exceeded");
for(uint256 i; i < amount; i++) {
_mint(msg.sender, reserveTokenId++);
}
}
function crossmint(address to, uint256 count) public payable {
require(sale, "Sale not yet open");
require(reserveTokenId + count <= MAX_SUPPLY, "Sold Out");
require(msg.value == mintPrice * count, "Purchase: payment incorrect");
require(msg.sender == crossMintAddress,
"This function is for Crossmint only."
);
for(uint256 i; i < count; i++) {
_mint(to, reserveTokenId++);
}
}
function flipProxyState(address proxyAddress) public onlyOwner {
projectProxy[proxyAddress] = !projectProxy[proxyAddress];
}
function setBaseURI(string memory newUri) public onlyOwner {
_setBaseURI(newUri, "");
}
function setCrossMintAddress(address _crossMintAddress) public onlyOwner {
crossMintAddress = _crossMintAddress;
}
function setPrice(uint256 price) public onlyOwner {
mintPrice = price;
}
function setSupply(uint256 supply) public onlyOwner {
MAX_SUPPLY = supply;
}
function setMaxLimitPerTransaction(uint256 maxPerTransaction) public onlyOwner {
MAX_PURCHASE_PER_TX = maxPerTransaction;
}
function setSale(bool shouldSale) external onlyOwner {
sale = shouldSale;
}
function setAllowProxies(bool shouldAllowProxies) external onlyOwner {
allowProxies = shouldAllowProxies;
}
function withdraw() public onlyOwner {
uint balance = address(this).balance;
(bool success, ) = payable(msg.sender).call{value: balance}("");
require(success, "Transfer failed.");
}
function isApprovedForAll(address owner, address operator) external view returns (bool) {
if (allowProxies) {
if (projectProxy[operator]) return true;
}
return _isApprovedForAll(owner, operator);
}
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"baseFactory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"MAX_PURCHASE_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowProxies","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crossMintAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"crossmint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"flipProxyState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"projectProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"shouldAllowProxies","type":"bool"}],"name":"setAllowProxies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_crossMintAddress","type":"address"}],"name":"setCrossMintAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerTransaction","type":"uint256"}],"name":"setMaxLimitPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"shouldSale","type":"bool"}],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052612710620186a055600b620186a1556000620186a25566ba8478cab54000620186a35573dab1a1854214684ace522439684a145e62505233620186a460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000620186a460146101000a81548160ff0219169083151502179055506001620186a460156101000a81548160ff021916908315150217905550348015620000c557600080fd5b50604051620026df380380620026df8339818101604052810190620000eb9190620003be565b806040518060400160405280600b81526020017f4d6563686150696c6f74730000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d5650000000000000000000000000000000000000000000000000000000000081525060405180608001604052806101f461ffff16815260200160405180602001604052806000815250815260200160405180602001604052806000815250815260200160001515815250620001b184620002cc60201b60201c565b60008473ffffffffffffffffffffffffffffffffffffffff1633858585604051602401620001e39493929190620005a5565b6040516020818303038152906040527fb1a78e3f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516200026f919062000654565b600060405180830381855af49150503d8060008114620002ac576040519150601f19603f3d011682016040523d82523d6000602084013e620002b1565b606091505b5050905080620002c057600080fd5b5050505050506200066d565b80620003067f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200034a60201b620014571760201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003868262000359565b9050919050565b620003988162000379565b8114620003a457600080fd5b50565b600081519050620003b8816200038d565b92915050565b600060208284031215620003d757620003d662000354565b5b6000620003e784828501620003a7565b91505092915050565b620003fb8162000379565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156200043d57808201518184015260208101905062000420565b838111156200044d576000848401525b50505050565b6000601f19601f8301169050919050565b6000620004718262000401565b6200047d81856200040c565b93506200048f8185602086016200041d565b6200049a8162000453565b840191505092915050565b600061ffff82169050919050565b620004be81620004a5565b82525050565b600082825260208201905092915050565b6000620004e28262000401565b620004ee8185620004c4565b9350620005008185602086016200041d565b6200050b8162000453565b840191505092915050565b60008115159050919050565b6200052d8162000516565b82525050565b60006080830160008301516200054d6000860182620004b3565b5060208301518482036020860152620005678282620004d5565b91505060408301518482036040860152620005838282620004d5565b91505060608301516200059a606086018262000522565b508091505092915050565b6000608082019050620005bc6000830187620003f0565b8181036020830152620005d0818662000464565b90508181036040830152620005e6818562000464565b90508181036060830152620005fc818462000533565b905095945050505050565b600081519050919050565b600081905092915050565b60006200062a8262000607565b62000636818562000612565b9350620006488185602086016200041d565b80840191505092915050565b60006200066282846200061d565b915081905092915050565b612062806200067d6000396000f3fe60806040526004361061012e5760003560e01c80635c60da1b116100ab5780639e9fcffc1161006f5780639e9fcffc146103b7578063a0712d68146103e0578063b95e165e146103fc578063e2c674a414610427578063e985e9c514610452578063f73c814b1461048f57610138565b80635c60da1b146102e25780636817c76c1461030d5780636ad1fe02146103385780638971e6f51461036357806391b7f5ed1461038e57610138565b80633ccfd60b116100f25780633ccfd60b1461022057806352ef17281461023757806355f804b31461026057806358891a37146102895780635bab26e2146102a557610138565b806313a0f88d1461014f5780631d2e5a3a1461017857806332cb6b0c146101a15780633abc1a44146101cc5780633b4c4b25146101f757610138565b3661013857600080fd5b34801561014457600080fd5b5061014d6104b8565b005b34801561015b57600080fd5b5061017660048036038101906101719190611667565b6104ea565b005b34801561018457600080fd5b5061019f600480360381019061019a91906116cc565b610622565b005b3480156101ad57600080fd5b506101b6610733565b6040516101c39190611712565b60405180910390f35b3480156101d857600080fd5b506101e161073b565b6040516101ee9190611712565b60405180910390f35b34801561020357600080fd5b5061021e60048036038101906102199190611759565b610743565b005b34801561022c57600080fd5b50610235610841565b005b34801561024357600080fd5b5061025e600480360381019061025991906116cc565b6109e8565b005b34801561026c57600080fd5b50610287600480360381019061028291906118cc565b610af9565b005b6102a3600480360381019061029e9190611915565b610c07565b005b3480156102b157600080fd5b506102cc60048036038101906102c79190611667565b610dd6565b6040516102d99190611964565b60405180910390f35b3480156102ee57600080fd5b506102f7610df8565b604051610304919061198e565b60405180910390f35b34801561031957600080fd5b50610322610e4f565b60405161032f9190611712565b60405180910390f35b34801561034457600080fd5b5061034d610e57565b60405161035a9190611964565b60405180910390f35b34801561036f57600080fd5b50610378610e6c565b6040516103859190611712565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190611759565b610e74565b005b3480156103c357600080fd5b506103de60048036038101906103d99190611759565b610f72565b005b6103fa60048036038101906103f59190611759565b611070565b005b34801561040857600080fd5b506104116111f3565b60405161041e9190611964565b60405180910390f35b34801561043357600080fd5b5061043c611208565b604051610449919061198e565b60405180910390f35b34801561045e57600080fd5b50610479600480360381019061047491906119a9565b611230565b6040516104869190611964565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190611667565b6112ba565b005b60006104c2610df8565b90503660008037600080366000845af43d6000803e80600081146104e5573d6000f35b3d6000fd5b6104f2611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561053757600080fd5b505afa15801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f91906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d390611a88565b60405180910390fd5b80620186a460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61062a611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561066f57600080fd5b505afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a791906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070b90611a88565b60405180910390fd5b80620186a460146101000a81548160ff02191690831515021790555050565b620186a05481565b620186a15481565b61074b611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561079057600080fd5b505afa1580156107a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c891906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082c90611a88565b60405180910390fd5b80620186a08190555050565b610849611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561088e57600080fd5b505afa1580156108a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c691906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90611a88565b60405180910390fd5b600047905060003373ffffffffffffffffffffffffffffffffffffffff168260405161095e90611ad9565b60006040518083038185875af1925050503d806000811461099b576040519150601f19603f3d011682016040523d82523d6000602084013e6109a0565b606091505b50509050806109e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109db90611b3a565b60405180910390fd5b5050565b6109f0611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3557600080fd5b505afa158015610a49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6d91906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190611a88565b60405180910390fd5b80620186a460156101000a81548160ff02191690831515021790555050565b610b01611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4657600080fd5b505afa158015610b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7e91906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be290611a88565b60405180910390fd5b610c048160405180602001604052806000815250611469565b50565b620186a460149054906101000a900460ff16610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90611ba6565b60405180910390fd5b620186a05481620186a254610c6d9190611bf5565b1115610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca590611c97565b60405180910390fd5b80620186a354610cbe9190611cb7565b3414610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf690611d5d565b60405180910390fd5b620186a460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8890611def565b60405180910390fd5b60005b81811015610dd157610dbe83620186a26000815480929190610db590611e0f565b919050556114e1565b8080610dc990611e0f565b915050610d94565b505050565b620186a56020528060005260406000206000915054906101000a900460ff1681565b6000610e267f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b611457565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620186a35481565b620186a460149054906101000a900460ff1681565b620186a25481565b610e7c611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ec157600080fd5b505afa158015610ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef991906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90611a88565b60405180910390fd5b80620186a38190555050565b610f7a611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fbf57600080fd5b505afa158015610fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff791906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b90611a88565b60405180910390fd5b80620186a18190555050565b620186a460149054906101000a900460ff166110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b890611ba6565b60405180910390fd5b620186a05481620186a2546110d69190611bf5565b1115611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e90611c97565b60405180910390fd5b80620186a3546111279190611cb7565b3414611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90611d5d565b60405180910390fd5b620186a1548111156111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690611eca565b60405180910390fd5b60005b818110156111ef576111dc33620186a260008154809291906111d390611e0f565b919050556114e1565b80806111e790611e0f565b9150506111b2565b5050565b620186a460159054906101000a900460ff1681565b620186a460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000620186a460159054906101000a900460ff16156112a757620186a560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156112a657600190506112b4565b5b6112b18383611559565b90505b92915050565b6112c2611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561130757600080fd5b505afa15801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f91906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390611a88565b60405180910390fd5b620186a560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615620186a560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000819050919050565b600030905090565b611471611461565b73ffffffffffffffffffffffffffffffffffffffff166301278b0283836040518363ffffffff1660e01b81526004016114ab929190611f61565b600060405180830381600087803b1580156114c557600080fd5b505af11580156114d9573d6000803e3d6000fd5b505050505050565b6114e9611461565b73ffffffffffffffffffffffffffffffffffffffff16633dc8ded783836040518363ffffffff1660e01b8152600401611523929190611f98565b600060405180830381600087803b15801561153d57600080fd5b505af1158015611551573d6000803e3d6000fd5b505050505050565b6000611563611461565b73ffffffffffffffffffffffffffffffffffffffff1663087ff61884846040518363ffffffff1660e01b815260040161159d929190611fc1565b60206040518083038186803b1580156115b557600080fd5b505afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed9190611fff565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061163482611609565b9050919050565b61164481611629565b811461164f57600080fd5b50565b6000813590506116618161163b565b92915050565b60006020828403121561167d5761167c6115ff565b5b600061168b84828501611652565b91505092915050565b60008115159050919050565b6116a981611694565b81146116b457600080fd5b50565b6000813590506116c6816116a0565b92915050565b6000602082840312156116e2576116e16115ff565b5b60006116f0848285016116b7565b91505092915050565b6000819050919050565b61170c816116f9565b82525050565b60006020820190506117276000830184611703565b92915050565b611736816116f9565b811461174157600080fd5b50565b6000813590506117538161172d565b92915050565b60006020828403121561176f5761176e6115ff565b5b600061177d84828501611744565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6117d982611790565b810181811067ffffffffffffffff821117156117f8576117f76117a1565b5b80604052505050565b600061180b6115f5565b905061181782826117d0565b919050565b600067ffffffffffffffff821115611837576118366117a1565b5b61184082611790565b9050602081019050919050565b82818337600083830152505050565b600061186f61186a8461181c565b611801565b90508281526020810184848401111561188b5761188a61178b565b5b61189684828561184d565b509392505050565b600082601f8301126118b3576118b2611786565b5b81356118c384826020860161185c565b91505092915050565b6000602082840312156118e2576118e16115ff565b5b600082013567ffffffffffffffff811115611900576118ff611604565b5b61190c8482850161189e565b91505092915050565b6000806040838503121561192c5761192b6115ff565b5b600061193a85828601611652565b925050602061194b85828601611744565b9150509250929050565b61195e81611694565b82525050565b60006020820190506119796000830184611955565b92915050565b61198881611629565b82525050565b60006020820190506119a3600083018461197f565b92915050565b600080604083850312156119c0576119bf6115ff565b5b60006119ce85828601611652565b92505060206119df85828601611652565b9150509250929050565b6000815190506119f88161163b565b92915050565b600060208284031215611a1457611a136115ff565b5b6000611a22848285016119e9565b91505092915050565b600082825260208201905092915050565b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b6000611a72600983611a2b565b9150611a7d82611a3c565b602082019050919050565b60006020820190508181036000830152611aa181611a65565b9050919050565b600081905092915050565b50565b6000611ac3600083611aa8565b9150611ace82611ab3565b600082019050919050565b6000611ae482611ab6565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000611b24601083611a2b565b9150611b2f82611aee565b602082019050919050565b60006020820190508181036000830152611b5381611b17565b9050919050565b7f53616c65206e6f7420796574206f70656e000000000000000000000000000000600082015250565b6000611b90601183611a2b565b9150611b9b82611b5a565b602082019050919050565b60006020820190508181036000830152611bbf81611b83565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611c00826116f9565b9150611c0b836116f9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611c4057611c3f611bc6565b5b828201905092915050565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b6000611c81600883611a2b565b9150611c8c82611c4b565b602082019050919050565b60006020820190508181036000830152611cb081611c74565b9050919050565b6000611cc2826116f9565b9150611ccd836116f9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611d0657611d05611bc6565b5b828202905092915050565b7f50757263686173653a207061796d656e7420696e636f72726563740000000000600082015250565b6000611d47601b83611a2b565b9150611d5282611d11565b602082019050919050565b60006020820190508181036000830152611d7681611d3a565b9050919050565b7f546869732066756e6374696f6e20697320666f722043726f73736d696e74206f60008201527f6e6c792e00000000000000000000000000000000000000000000000000000000602082015250565b6000611dd9602483611a2b565b9150611de482611d7d565b604082019050919050565b60006020820190508181036000830152611e0881611dcc565b9050919050565b6000611e1a826116f9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e4d57611e4c611bc6565b5b600182019050919050565b7f50757263686173653a206d617820707572636861736520616d6f756e7420657860008201527f6365656465640000000000000000000000000000000000000000000000000000602082015250565b6000611eb4602683611a2b565b9150611ebf82611e58565b604082019050919050565b60006020820190508181036000830152611ee381611ea7565b9050919050565b600081519050919050565b60005b83811015611f13578082015181840152602081019050611ef8565b83811115611f22576000848401525b50505050565b6000611f3382611eea565b611f3d8185611a2b565b9350611f4d818560208601611ef5565b611f5681611790565b840191505092915050565b60006040820190508181036000830152611f7b8185611f28565b90508181036020830152611f8f8184611f28565b90509392505050565b6000604082019050611fad600083018561197f565b611fba6020830184611703565b9392505050565b6000604082019050611fd6600083018561197f565b611fe3602083018461197f565b9392505050565b600081519050611ff9816116a0565b92915050565b600060208284031215612015576120146115ff565b5b600061202384828501611fea565b9150509291505056fea2646970667358221220e4d1459ee9aee5bae888df99d03d4b35305c762814e05a745e3bac8e5909b68f64736f6c6343000809003300000000000000000000000043955024b1985e2b933a59021500ae5f55b04091
Deployed Bytecode
0x60806040526004361061012e5760003560e01c80635c60da1b116100ab5780639e9fcffc1161006f5780639e9fcffc146103b7578063a0712d68146103e0578063b95e165e146103fc578063e2c674a414610427578063e985e9c514610452578063f73c814b1461048f57610138565b80635c60da1b146102e25780636817c76c1461030d5780636ad1fe02146103385780638971e6f51461036357806391b7f5ed1461038e57610138565b80633ccfd60b116100f25780633ccfd60b1461022057806352ef17281461023757806355f804b31461026057806358891a37146102895780635bab26e2146102a557610138565b806313a0f88d1461014f5780631d2e5a3a1461017857806332cb6b0c146101a15780633abc1a44146101cc5780633b4c4b25146101f757610138565b3661013857600080fd5b34801561014457600080fd5b5061014d6104b8565b005b34801561015b57600080fd5b5061017660048036038101906101719190611667565b6104ea565b005b34801561018457600080fd5b5061019f600480360381019061019a91906116cc565b610622565b005b3480156101ad57600080fd5b506101b6610733565b6040516101c39190611712565b60405180910390f35b3480156101d857600080fd5b506101e161073b565b6040516101ee9190611712565b60405180910390f35b34801561020357600080fd5b5061021e60048036038101906102199190611759565b610743565b005b34801561022c57600080fd5b50610235610841565b005b34801561024357600080fd5b5061025e600480360381019061025991906116cc565b6109e8565b005b34801561026c57600080fd5b50610287600480360381019061028291906118cc565b610af9565b005b6102a3600480360381019061029e9190611915565b610c07565b005b3480156102b157600080fd5b506102cc60048036038101906102c79190611667565b610dd6565b6040516102d99190611964565b60405180910390f35b3480156102ee57600080fd5b506102f7610df8565b604051610304919061198e565b60405180910390f35b34801561031957600080fd5b50610322610e4f565b60405161032f9190611712565b60405180910390f35b34801561034457600080fd5b5061034d610e57565b60405161035a9190611964565b60405180910390f35b34801561036f57600080fd5b50610378610e6c565b6040516103859190611712565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190611759565b610e74565b005b3480156103c357600080fd5b506103de60048036038101906103d99190611759565b610f72565b005b6103fa60048036038101906103f59190611759565b611070565b005b34801561040857600080fd5b506104116111f3565b60405161041e9190611964565b60405180910390f35b34801561043357600080fd5b5061043c611208565b604051610449919061198e565b60405180910390f35b34801561045e57600080fd5b50610479600480360381019061047491906119a9565b611230565b6040516104869190611964565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190611667565b6112ba565b005b60006104c2610df8565b90503660008037600080366000845af43d6000803e80600081146104e5573d6000f35b3d6000fd5b6104f2611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561053757600080fd5b505afa15801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f91906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d390611a88565b60405180910390fd5b80620186a460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61062a611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561066f57600080fd5b505afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a791906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070b90611a88565b60405180910390fd5b80620186a460146101000a81548160ff02191690831515021790555050565b620186a05481565b620186a15481565b61074b611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561079057600080fd5b505afa1580156107a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c891906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082c90611a88565b60405180910390fd5b80620186a08190555050565b610849611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561088e57600080fd5b505afa1580156108a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c691906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90611a88565b60405180910390fd5b600047905060003373ffffffffffffffffffffffffffffffffffffffff168260405161095e90611ad9565b60006040518083038185875af1925050503d806000811461099b576040519150601f19603f3d011682016040523d82523d6000602084013e6109a0565b606091505b50509050806109e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109db90611b3a565b60405180910390fd5b5050565b6109f0611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3557600080fd5b505afa158015610a49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6d91906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190611a88565b60405180910390fd5b80620186a460156101000a81548160ff02191690831515021790555050565b610b01611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4657600080fd5b505afa158015610b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7e91906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be290611a88565b60405180910390fd5b610c048160405180602001604052806000815250611469565b50565b620186a460149054906101000a900460ff16610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90611ba6565b60405180910390fd5b620186a05481620186a254610c6d9190611bf5565b1115610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca590611c97565b60405180910390fd5b80620186a354610cbe9190611cb7565b3414610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf690611d5d565b60405180910390fd5b620186a460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8890611def565b60405180910390fd5b60005b81811015610dd157610dbe83620186a26000815480929190610db590611e0f565b919050556114e1565b8080610dc990611e0f565b915050610d94565b505050565b620186a56020528060005260406000206000915054906101000a900460ff1681565b6000610e267f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b611457565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620186a35481565b620186a460149054906101000a900460ff1681565b620186a25481565b610e7c611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ec157600080fd5b505afa158015610ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef991906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90611a88565b60405180910390fd5b80620186a38190555050565b610f7a611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fbf57600080fd5b505afa158015610fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff791906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b90611a88565b60405180910390fd5b80620186a18190555050565b620186a460149054906101000a900460ff166110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b890611ba6565b60405180910390fd5b620186a05481620186a2546110d69190611bf5565b1115611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e90611c97565b60405180910390fd5b80620186a3546111279190611cb7565b3414611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90611d5d565b60405180910390fd5b620186a1548111156111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690611eca565b60405180910390fd5b60005b818110156111ef576111dc33620186a260008154809291906111d390611e0f565b919050556114e1565b80806111e790611e0f565b9150506111b2565b5050565b620186a460159054906101000a900460ff1681565b620186a460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000620186a460159054906101000a900460ff16156112a757620186a560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156112a657600190506112b4565b5b6112b18383611559565b90505b92915050565b6112c2611461565b73ffffffffffffffffffffffffffffffffffffffff166313effa0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561130757600080fd5b505afa15801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f91906119fe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390611a88565b60405180910390fd5b620186a560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615620186a560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000819050919050565b600030905090565b611471611461565b73ffffffffffffffffffffffffffffffffffffffff166301278b0283836040518363ffffffff1660e01b81526004016114ab929190611f61565b600060405180830381600087803b1580156114c557600080fd5b505af11580156114d9573d6000803e3d6000fd5b505050505050565b6114e9611461565b73ffffffffffffffffffffffffffffffffffffffff16633dc8ded783836040518363ffffffff1660e01b8152600401611523929190611f98565b600060405180830381600087803b15801561153d57600080fd5b505af1158015611551573d6000803e3d6000fd5b505050505050565b6000611563611461565b73ffffffffffffffffffffffffffffffffffffffff1663087ff61884846040518363ffffffff1660e01b815260040161159d929190611fc1565b60206040518083038186803b1580156115b557600080fd5b505afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed9190611fff565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061163482611609565b9050919050565b61164481611629565b811461164f57600080fd5b50565b6000813590506116618161163b565b92915050565b60006020828403121561167d5761167c6115ff565b5b600061168b84828501611652565b91505092915050565b60008115159050919050565b6116a981611694565b81146116b457600080fd5b50565b6000813590506116c6816116a0565b92915050565b6000602082840312156116e2576116e16115ff565b5b60006116f0848285016116b7565b91505092915050565b6000819050919050565b61170c816116f9565b82525050565b60006020820190506117276000830184611703565b92915050565b611736816116f9565b811461174157600080fd5b50565b6000813590506117538161172d565b92915050565b60006020828403121561176f5761176e6115ff565b5b600061177d84828501611744565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6117d982611790565b810181811067ffffffffffffffff821117156117f8576117f76117a1565b5b80604052505050565b600061180b6115f5565b905061181782826117d0565b919050565b600067ffffffffffffffff821115611837576118366117a1565b5b61184082611790565b9050602081019050919050565b82818337600083830152505050565b600061186f61186a8461181c565b611801565b90508281526020810184848401111561188b5761188a61178b565b5b61189684828561184d565b509392505050565b600082601f8301126118b3576118b2611786565b5b81356118c384826020860161185c565b91505092915050565b6000602082840312156118e2576118e16115ff565b5b600082013567ffffffffffffffff811115611900576118ff611604565b5b61190c8482850161189e565b91505092915050565b6000806040838503121561192c5761192b6115ff565b5b600061193a85828601611652565b925050602061194b85828601611744565b9150509250929050565b61195e81611694565b82525050565b60006020820190506119796000830184611955565b92915050565b61198881611629565b82525050565b60006020820190506119a3600083018461197f565b92915050565b600080604083850312156119c0576119bf6115ff565b5b60006119ce85828601611652565b92505060206119df85828601611652565b9150509250929050565b6000815190506119f88161163b565b92915050565b600060208284031215611a1457611a136115ff565b5b6000611a22848285016119e9565b91505092915050565b600082825260208201905092915050565b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b6000611a72600983611a2b565b9150611a7d82611a3c565b602082019050919050565b60006020820190508181036000830152611aa181611a65565b9050919050565b600081905092915050565b50565b6000611ac3600083611aa8565b9150611ace82611ab3565b600082019050919050565b6000611ae482611ab6565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000611b24601083611a2b565b9150611b2f82611aee565b602082019050919050565b60006020820190508181036000830152611b5381611b17565b9050919050565b7f53616c65206e6f7420796574206f70656e000000000000000000000000000000600082015250565b6000611b90601183611a2b565b9150611b9b82611b5a565b602082019050919050565b60006020820190508181036000830152611bbf81611b83565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611c00826116f9565b9150611c0b836116f9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611c4057611c3f611bc6565b5b828201905092915050565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b6000611c81600883611a2b565b9150611c8c82611c4b565b602082019050919050565b60006020820190508181036000830152611cb081611c74565b9050919050565b6000611cc2826116f9565b9150611ccd836116f9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611d0657611d05611bc6565b5b828202905092915050565b7f50757263686173653a207061796d656e7420696e636f72726563740000000000600082015250565b6000611d47601b83611a2b565b9150611d5282611d11565b602082019050919050565b60006020820190508181036000830152611d7681611d3a565b9050919050565b7f546869732066756e6374696f6e20697320666f722043726f73736d696e74206f60008201527f6e6c792e00000000000000000000000000000000000000000000000000000000602082015250565b6000611dd9602483611a2b565b9150611de482611d7d565b604082019050919050565b60006020820190508181036000830152611e0881611dcc565b9050919050565b6000611e1a826116f9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e4d57611e4c611bc6565b5b600182019050919050565b7f50757263686173653a206d617820707572636861736520616d6f756e7420657860008201527f6365656465640000000000000000000000000000000000000000000000000000602082015250565b6000611eb4602683611a2b565b9150611ebf82611e58565b604082019050919050565b60006020820190508181036000830152611ee381611ea7565b9050919050565b600081519050919050565b60005b83811015611f13578082015181840152602081019050611ef8565b83811115611f22576000848401525b50505050565b6000611f3382611eea565b611f3d8185611a2b565b9350611f4d818560208601611ef5565b611f5681611790565b840191505092915050565b60006040820190508181036000830152611f7b8185611f28565b90508181036020830152611f8f8184611f28565b90509392505050565b6000604082019050611fad600083018561197f565b611fba6020830184611703565b9392505050565b6000604082019050611fd6600083018561197f565b611fe3602083018461197f565b9392505050565b600081519050611ff9816116a0565b92915050565b600060208284031215612015576120146115ff565b5b600061202384828501611fea565b9150509291505056fea2646970667358221220e4d1459ee9aee5bae888df99d03d4b35305c762814e05a745e3bac8e5909b68f64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000043955024b1985e2b933a59021500ae5f55b04091
-----Decoded View---------------
Arg [0] : baseFactory (address): 0x43955024b1985E2b933A59021500aE5f55b04091
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000043955024b1985e2b933a59021500ae5f55b04091
Loading...
Loading
Loading...
Loading
OVERVIEW
10,000 Mecha Pilots in the Ethereum blockchain, preparing for war in our future videogame!Next Reveal this Monday!Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.