Source Code
Overview
ETH Balance
ETH Value
$0.98 (@ $3,001.27/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 44 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Safe Mint | 10269041 | 467 days ago | IN | 0.00001 ETH | 0.00001021 | ||||
| Safe Mint | 10268499 | 467 days ago | IN | 0.00001 ETH | 0.00000991 | ||||
| Safe Mint | 10267118 | 467 days ago | IN | 0.00001 ETH | 0.00000962 | ||||
| Safe Mint | 10243181 | 467 days ago | IN | 0.00001 ETH | 0.00001923 | ||||
| Safe Mint | 10242240 | 468 days ago | IN | 0.00001 ETH | 0.00001068 | ||||
| Safe Mint | 10238906 | 468 days ago | IN | 0.00001 ETH | 0.00000785 | ||||
| Safe Mint | 10236729 | 468 days ago | IN | 0.00001 ETH | 0.00000816 | ||||
| Safe Mint | 10236130 | 468 days ago | IN | 0.00001 ETH | 0.00000759 | ||||
| Safe Mint | 10235023 | 468 days ago | IN | 0.00001 ETH | 0.00000768 | ||||
| Safe Mint | 10212177 | 468 days ago | IN | 0.00001 ETH | 0.00000896 | ||||
| Safe Mint | 10202792 | 469 days ago | IN | 0.00001 ETH | 0.0000084 | ||||
| Safe Mint | 10179176 | 469 days ago | IN | 0.00001 ETH | 0.00000957 | ||||
| Safe Mint | 10179175 | 469 days ago | IN | 0.00001 ETH | 0.00000957 | ||||
| Safe Mint | 10173976 | 470 days ago | IN | 0.00001 ETH | 0.00001011 | ||||
| Safe Mint | 10172578 | 470 days ago | IN | 0.00001 ETH | 0.00001241 | ||||
| Safe Mint | 10172262 | 470 days ago | IN | 0.00001 ETH | 0.00001086 | ||||
| Safe Mint | 10172020 | 470 days ago | IN | 0.00001 ETH | 0.00001112 | ||||
| Safe Mint | 10171997 | 470 days ago | IN | 0.00001 ETH | 0.0000105 | ||||
| Safe Mint | 10171154 | 470 days ago | IN | 0.00001 ETH | 0.00001123 | ||||
| Safe Mint | 10170929 | 470 days ago | IN | 0.00001 ETH | 0.000011 | ||||
| Safe Mint | 10170673 | 470 days ago | IN | 0.00001 ETH | 0.00001097 | ||||
| Safe Mint | 10170534 | 470 days ago | IN | 0.00001 ETH | 0.00001067 | ||||
| Safe Mint | 10170413 | 470 days ago | IN | 0.00001 ETH | 0.00001197 | ||||
| Safe Mint | 10170390 | 470 days ago | IN | 0.00001 ETH | 0.00001103 | ||||
| Safe Mint | 10170260 | 470 days ago | IN | 0.00001 ETH | 0.00001078 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 10269041 | 467 days ago | 0.000002 ETH | ||||
| 10268499 | 467 days ago | 0.000002 ETH | ||||
| 10267118 | 467 days ago | 0.000002 ETH | ||||
| 10243181 | 467 days ago | 0.000002 ETH | ||||
| 10242240 | 468 days ago | 0.000002 ETH | ||||
| 10238906 | 468 days ago | 0.000002 ETH | ||||
| 10236729 | 468 days ago | 0.000002 ETH | ||||
| 10236130 | 468 days ago | 0.000002 ETH | ||||
| 10235023 | 468 days ago | 0.000002 ETH | ||||
| 10212177 | 468 days ago | 0.000002 ETH | ||||
| 10202792 | 469 days ago | 0.000002 ETH | ||||
| 10179176 | 469 days ago | 0.000002 ETH | ||||
| 10179175 | 469 days ago | 0.000002 ETH | ||||
| 10173976 | 470 days ago | 0.000002 ETH | ||||
| 10172578 | 470 days ago | 0.000002 ETH | ||||
| 10172262 | 470 days ago | 0.000002 ETH | ||||
| 10172020 | 470 days ago | 0.000002 ETH | ||||
| 10171997 | 470 days ago | 0.000002 ETH | ||||
| 10171154 | 470 days ago | 0.000002 ETH | ||||
| 10170929 | 470 days ago | 0.000002 ETH | ||||
| 10170673 | 470 days ago | 0.000002 ETH | ||||
| 10170534 | 470 days ago | 0.000002 ETH | ||||
| 10170413 | 470 days ago | 0.000002 ETH | ||||
| 10170390 | 470 days ago | 0.000002 ETH | ||||
| 10170260 | 470 days ago | 0.000002 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
AGZeus
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/**
*Submitted for verification at scrollscan.com on 2024-10-15
*/
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.20;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.20;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be
* reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.20;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @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/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts/utils/math/Math.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Muldiv operation overflow.
*/
error MathOverflowedMulDiv();
enum Rounding {
Floor, // Toward negative infinity
Ceil, // Toward positive infinity
Trunc, // Toward zero
Expand // Away from zero
}
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds towards infinity instead
* of rounding towards zero.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
if (b == 0) {
// Guarantee the same behavior as in a regular Solidity division.
return a / b;
}
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
* denominator == 0.
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
* Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0 = x * y; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
if (denominator <= prod1) {
revert MathOverflowedMulDiv();
}
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator.
// Always >= 1. See https://cs.stackexchange.com/q/138556/92363.
uint256 twos = denominator & (0 - denominator);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
// works in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
* towards zero.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256 of a positive value rounded towards zero.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
}
}
/**
* @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
*/
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}
// File: @openzeppelin/contracts/utils/math/SignedMath.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)
pragma solidity ^0.8.20;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant HEX_DIGITS = "0123456789abcdef";
uint8 private constant ADDRESS_LENGTH = 20;
/**
* @dev The `value` string doesn't fit in the specified `length`.
*/
error StringsInsufficientHexLength(uint256 value, uint256 length);
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toStringSigned(int256 value) internal pure returns (string memory) {
return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
uint256 localValue = value;
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_DIGITS[localValue & 0xf];
localValue >>= 4;
}
if (localValue != 0) {
revert StringsInsufficientHexLength(value, length);
}
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
* representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
}
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
/**
* @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);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.20;
/**
* @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}.
*/
abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
mapping(uint256 tokenId => address) private _owners;
mapping(address owner => uint256) private _balances;
mapping(uint256 tokenId => address) private _tokenApprovals;
mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual returns (uint256) {
if (owner == address(0)) {
revert ERC721InvalidOwner(address(0));
}
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual returns (address) {
return _requireOwned(tokenId);
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
_requireOwned(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string.concat(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 overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual {
_approve(to, tokenId, _msgSender());
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual returns (address) {
_requireOwned(tokenId);
return _getApproved(tokenId);
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(address from, address to, uint256 tokenId) public virtual {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
// Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists
// (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.
address previousOwner = _update(to, tokenId, _msgSender());
if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) public {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {
transferFrom(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
*
* IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the
* core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances
* consistent with ownership. The invariant to preserve is that for any address `a` the value returned by
* `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
/**
* @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.
*/
function _getApproved(uint256 tokenId) internal view virtual returns (address) {
return _tokenApprovals[tokenId];
}
/**
* @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in
* particular (ignoring whether it is owned by `owner`).
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/
function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {
return
spender != address(0) &&
(owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);
}
/**
* @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.
* Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets
* the `spender` for the specific `tokenId`.
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/
function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {
if (!_isAuthorized(owner, spender, tokenId)) {
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else {
revert ERC721InsufficientApproval(spender, tokenId);
}
}
}
/**
* @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
*
* NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that
* a uint256 would ever overflow from increments when these increments are bounded to uint128 values.
*
* WARNING: Increasing an account's balance using this function tends to be paired with an override of the
* {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership
* remain consistent with one another.
*/
function _increaseBalance(address account, uint128 value) internal virtual {
unchecked {
_balances[account] += value;
}
}
/**
* @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner
* (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that
* `auth` is either the owner of the token, or approved to operate on the token (by the owner).
*
* Emits a {Transfer} event.
*
* NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.
*/
function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {
address from = _ownerOf(tokenId);
// Perform (optional) operator check
if (auth != address(0)) {
_checkAuthorized(from, auth, tokenId);
}
// Execute the update
if (from != address(0)) {
// Clear approval. No need to re-authorize or emit the Approval event
_approve(address(0), tokenId, address(0), false);
unchecked {
_balances[from] -= 1;
}
}
if (to != address(0)) {
unchecked {
_balances[to] += 1;
}
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
return from;
}
/**
* @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 {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner != address(0)) {
revert ERC721InvalidSender(address(0));
}
}
/**
* @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.
*
* 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 {
_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);
_checkOnERC721Received(address(0), to, tokenId, data);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal {
address previousOwner = _update(address(0), tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(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 {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients
* are aware of the ERC721 standard 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 like {safeTransferFrom} in the sense that it invokes
* {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `tokenId` token must exist and be owned by `from`.
* - `to` cannot be the zero address.
* - `from` cannot be the zero address.
* - 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) internal {
_safeTransfer(from, to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
_transfer(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is
* either the owner of the token, or approved to operate on all tokens held by this owner.
*
* Emits an {Approval} event.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address to, uint256 tokenId, address auth) internal {
_approve(to, tokenId, auth, true);
}
/**
* @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not
* emitted in the context of transfers.
*/
function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {
// Avoid reading the owner unless necessary
if (emitEvent || auth != address(0)) {
address owner = _requireOwned(tokenId);
// We do not use _isAuthorized because single-token approvals should not be able to call approve
if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {
revert ERC721InvalidApprover(auth);
}
if (emitEvent) {
emit Approval(owner, to, tokenId);
}
}
_tokenApprovals[tokenId] = to;
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Requirements:
* - operator can't be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
if (operator == address(0)) {
revert ERC721InvalidOperator(operator);
}
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).
* Returns the owner.
*
* Overrides to ownership logic should be done to {_ownerOf}.
*/
function _requireOwned(uint256 tokenId) internal view returns (address) {
address owner = _ownerOf(tokenId);
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
}
return owner;
}
/**
* @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the
* recipient doesn't accept the token transfer. 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
*/
function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {
if (to.code.length > 0) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
if (retval != IERC721Receiver.onERC721Received.selector) {
revert ERC721InvalidReceiver(to);
}
} catch (bytes memory reason) {
if (reason.length == 0) {
revert ERC721InvalidReceiver(to);
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
}
}
// File: @openzeppelin/contracts/utils/math/SafeMath.sol
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
// File: contracts/scroll_nfts.sol
pragma solidity 0.8.20;
contract AGZeus is ERC721, ReentrancyGuard {
string private _baseuri;
uint256 private _totalsupply;
address private _owner;
uint256 private _price;
uint256 private _ref_precent;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
constructor(address owner, string memory baseURI_, uint256 ref_precent_) ERC721("auralgenius.com", "AGZ") {
require(owner != address(0));
_baseuri = baseURI_;
_ref_precent = ref_precent_;
_owner = owner;
_price = 10000000000000;//0.00001 ETH
}
modifier onlyOwner() {
require(msg.sender == _owner, 'Not owner');
_;
}
function withdraw(address payable to) public onlyOwner {
require(msg.sender != address(0));
uint amount = address(this).balance;
(bool success, ) = to.call{value: amount}("");
require(success, "Failed to send Ether");
}
function safeAdd(uint256 a, uint256 b) internal pure returns(uint256){
(bool success, uint256 res) = SafeMath.tryAdd(a, b);
require(success, "Addition error");
return res;
}
function safeMul(uint256 a, uint256 b) internal pure returns(uint256){
(bool success, uint256 res) = SafeMath.tryMul(a, b);
require(success, "Multiplication error");
return res;
}
function safeDiv(uint256 a, uint256 b) internal pure returns(uint256){
(bool success, uint256 res) = SafeMath.tryDiv(a, b);
require(success, "Division error");
return res;
}
function safeMint(address payable ref) public payable nonReentrant{
require(ref != address(0), "NULL address");
require(msg.sender != address(0), "NULL address");
require(msg.value == _price, "invalid valie");
address to = msg.sender;
uint256 tokenId = safeAdd(_totalsupply, 1);
_safeMint(to, tokenId);
_totalsupply = tokenId;
_owners[tokenId] = to;
uint256 to_ref = safeMul(safeDiv(_price, 100), _ref_precent);
(bool success, ) = ref.call{value: to_ref}("");
require(success, "Failed to send Ether");
}
/**
* @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;
}
function _baseURI() internal view override returns (string memory) {
return _baseuri;
}
function setPrice(uint256 newPrice) public onlyOwner {
require(newPrice != 0);
_price = newPrice;
}
function getPrice() public view returns (uint256) {
return _price;
}
function setRefPercent(uint256 newPercent) public onlyOwner{
require(newPercent < 100);
require(newPercent > 0);
_ref_precent = newPercent;
}
function getRefPercent() public view returns (uint256) {
return _ref_precent;
}
/**
* @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);
}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return baseURI;
}
function totalSupply() public view returns (uint256){
return _totalsupply;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"uint256","name":"ref_precent_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRefPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"ref","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"setRefPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801562000010575f80fd5b506040516200184238038062001842833981016040819052620000339162000108565b6040518060400160405280600f81526020016e617572616c67656e6975732e636f6d60881b8152506040518060400160405280600381526020016220a3ad60e91b815250815f90816200008791906200028a565b5060016200009682826200028a565b50506001600655506001600160a01b038316620000b1575f80fd5b6007620000bf83826200028a565b50600b5550600980546001600160a01b0319166001600160a01b03929092169190911790556509184e72a000600a5562000352565b634e487b7160e01b5f52604160045260245ffd5b5f805f606084860312156200011b575f80fd5b83516001600160a01b038116811462000132575f80fd5b602085810151919450906001600160401b038082111562000151575f80fd5b818701915087601f83011262000165575f80fd5b8151818111156200017a576200017a620000f4565b604051601f8201601f19908116603f01168101908382118183101715620001a557620001a5620000f4565b816040528281528a86848701011115620001bd575f80fd5b5f93505b82841015620001e05784840186015181850187015292850192620001c1565b5f868483010152809750505050505050604084015190509250925092565b600181811c908216806200021357607f821691505b6020821081036200023257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000285575f81815260208120601f850160051c81016020861015620002605750805b601f850160051c820191505b8181101562000281578281556001016200026c565b5050505b505050565b81516001600160401b03811115620002a657620002a6620000f4565b620002be81620002b78454620001fe565b8462000238565b602080601f831160018114620002f4575f8415620002dc5750858301515b5f19600386901b1c1916600185901b17855562000281565b5f85815260208120601f198616915b82811015620003245788860151825594840194600190910190840162000303565b50858210156200034257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6114e280620003605f395ff3fe60806040526004361061011b575f3560e01c80636352211e1161009d57806398d5fdca1161006257806398d5fdca146102fe578063a22cb46514610312578063b88d4fde14610331578063c87b56dd14610350578063e985e9c51461036f575f80fd5b80636352211e1461026e5780636fa4f5f71461028d57806370a08231146102ac57806391b7f5ed146102cb57806395d89b41146102ea575f80fd5b806323b872dd116100e357806323b872dd146101ea578063360c87311461020957806340d097c31461021d57806342842e0e1461023057806351cff8d91461024f575f80fd5b806301ffc9a71461011f57806306fdde0314610153578063081812fc14610174578063095ea7b3146101ab57806318160ddd146101cc575b5f80fd5b34801561012a575f80fd5b5061013e610139366004611174565b61038e565b60405190151581526020015b60405180910390f35b34801561015e575f80fd5b506101676103df565b60405161014a91906111d2565b34801561017f575f80fd5b5061019361018e3660046111e4565b61046e565b6040516001600160a01b03909116815260200161014a565b3480156101b6575f80fd5b506101ca6101c536600461120f565b610495565b005b3480156101d7575f80fd5b506008545b60405190815260200161014a565b3480156101f5575f80fd5b506101ca610204366004611239565b6104a4565b348015610214575f80fd5b50600b546101dc565b6101ca61022b366004611277565b610532565b34801561023b575f80fd5b506101ca61024a366004611239565b610708565b34801561025a575f80fd5b506101ca610269366004611277565b610727565b348015610279575f80fd5b506101936102883660046111e4565b6107f1565b348015610298575f80fd5b506101ca6102a73660046111e4565b610867565b3480156102b7575f80fd5b506101dc6102c6366004611277565b6108ad565b3480156102d6575f80fd5b506101ca6102e53660046111e4565b6108f2565b3480156102f5575f80fd5b5061016761092c565b348015610309575f80fd5b50600a546101dc565b34801561031d575f80fd5b506101ca61032c366004611292565b61093b565b34801561033c575f80fd5b506101ca61034b3660046112e1565b610946565b34801561035b575f80fd5b5061016761036a3660046111e4565b61095d565b34801561037a575f80fd5b5061013e6103893660046113ba565b6109eb565b5f6001600160e01b031982166380ac58cd60e01b14806103be57506001600160e01b03198216635b5e139f60e01b145b806103d957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f80546103ed906113e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610419906113e6565b80156104645780601f1061043b57610100808354040283529160200191610464565b820191905f5260205f20905b81548152906001019060200180831161044757829003601f168201915b5050505050905090565b5f61047882610a18565b505f828152600460205260409020546001600160a01b03166103d9565b6104a0828233610a50565b5050565b6001600160a01b0382166104d257604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f6104de838333610a5d565b9050836001600160a01b0316816001600160a01b03161461052c576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016104c9565b50505050565b61053a610b4f565b6001600160a01b03811661057f5760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c206164647265737360a01b60448201526064016104c9565b336105bb5760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c206164647265737360a01b60448201526064016104c9565b600a5434146105fc5760405162461bcd60e51b815260206004820152600d60248201526c696e76616c69642076616c696560981b60448201526064016104c9565b5f3390505f61060e6008546001610ba8565b905061061a8282610bff565b60088190555f818152600c6020526040812080546001600160a01b0319166001600160a01b038516179055600a5461065f90610657906064610c18565b600b54610c67565b90505f846001600160a01b0316826040515f6040518083038185875af1925050503d805f81146106aa576040519150601f19603f3d011682016040523d82523d5f602084013e6106af565b606091505b50509050806106f75760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016104c9565b505050506107056001600655565b50565b61072283838360405180602001604052805f815250610946565b505050565b6009546001600160a01b031633146107515760405162461bcd60e51b81526004016104c99061141e565b3361075a575f80fd5b60405147905f906001600160a01b0384169083908381818185875af1925050503d805f81146107a4576040519150601f19603f3d011682016040523d82523d5f602084013e6107a9565b606091505b50509050806107225760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016104c9565b5f818152600c60205260408120546001600160a01b0316806103d95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016104c9565b6009546001600160a01b031633146108915760405162461bcd60e51b81526004016104c99061141e565b6064811061089d575f80fd5b5f81116108a8575f80fd5b600b55565b5f6001600160a01b0382166108d7576040516322718ad960e21b81525f60048201526024016104c9565b506001600160a01b03165f9081526003602052604090205490565b6009546001600160a01b0316331461091c5760405162461bcd60e51b81526004016104c99061141e565b805f03610927575f80fd5b600a55565b6060600180546103ed906113e6565b6104a0338383610cbc565b6109518484846104a4565b61052c84848484610d5a565b5f818152600c60205260409020546060906001600160a01b03166109db5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016104c9565b5f6109e4610e80565b9392505050565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b5f818152600260205260408120546001600160a01b0316806103d957604051637e27328960e01b8152600481018490526024016104c9565b6107228383836001610e8f565b5f828152600260205260408120546001600160a01b0390811690831615610a8957610a89818486610f93565b6001600160a01b03811615610ac357610aa45f855f80610e8f565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615610af1576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b600260065403610ba15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c9565b6002600655565b5f805f610bb58585610ff7565b9150915081610bf75760405162461bcd60e51b815260206004820152600e60248201526d20b23234ba34b7b71032b93937b960911b60448201526064016104c9565b949350505050565b6104a0828260405180602001604052805f81525061101e565b5f805f610c258585611034565b9150915081610bf75760405162461bcd60e51b815260206004820152600e60248201526d2234bb34b9b4b7b71032b93937b960911b60448201526064016104c9565b5f805f610c748585611064565b9150915081610bf75760405162461bcd60e51b815260206004820152601460248201527326bab63a34b83634b1b0ba34b7b71032b93937b960611b60448201526064016104c9565b6001600160a01b038216610cee57604051630b61174360e31b81526001600160a01b03831660048201526024016104c9565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561052c57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610d9c903390889087908790600401611441565b6020604051808303815f875af1925050508015610dd6575060408051601f3d908101601f19168201909252610dd39181019061147d565b60015b610e3d573d808015610e03576040519150601f19603f3d011682016040523d82523d5f602084013e610e08565b606091505b5080515f03610e3557604051633250574960e11b81526001600160a01b03851660048201526024016104c9565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14610e7957604051633250574960e11b81526001600160a01b03851660048201526024016104c9565b5050505050565b6060600780546103ed906113e6565b8080610ea357506001600160a01b03821615155b15610f64575f610eb284610a18565b90506001600160a01b03831615801590610ede5750826001600160a01b0316816001600160a01b031614155b8015610ef15750610eef81846109eb565b155b15610f1a5760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016104c9565b8115610f625783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b610f9e83838361109d565b610722576001600160a01b038316610fcc57604051637e27328960e01b8152600481018290526024016104c9565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016104c9565b5f8083830184811015611010575f809250925050611017565b6001925090505b9250929050565b61102883836110fe565b6107225f848484610d5a565b5f80825f0361104757505f905080611017565b600183858161105857611058611498565b04915091509250929050565b5f80835f036110785750600190505f611017565b8383028385828161108b5761108b611498565b0414611010575f809250925050611017565b5f6001600160a01b03831615801590610bf75750826001600160a01b0316846001600160a01b031614806110d657506110d684846109eb565b80610bf75750505f908152600460205260409020546001600160a01b03908116911614919050565b6001600160a01b03821661112757604051633250574960e11b81525f60048201526024016104c9565b5f61113383835f610a5d565b90506001600160a01b03811615610722576040516339e3563760e11b81525f60048201526024016104c9565b6001600160e01b031981168114610705575f80fd5b5f60208284031215611184575f80fd5b81356109e48161115f565b5f81518084525f5b818110156111b357602081850181015186830182015201611197565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6109e4602083018461118f565b5f602082840312156111f4575f80fd5b5035919050565b6001600160a01b0381168114610705575f80fd5b5f8060408385031215611220575f80fd5b823561122b816111fb565b946020939093013593505050565b5f805f6060848603121561124b575f80fd5b8335611256816111fb565b92506020840135611266816111fb565b929592945050506040919091013590565b5f60208284031215611287575f80fd5b81356109e4816111fb565b5f80604083850312156112a3575f80fd5b82356112ae816111fb565b9150602083013580151581146112c2575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f80608085870312156112f4575f80fd5b84356112ff816111fb565b9350602085013561130f816111fb565b925060408501359150606085013567ffffffffffffffff80821115611332575f80fd5b818701915087601f830112611345575f80fd5b813581811115611357576113576112cd565b604051601f8201601f19908116603f0116810190838211818310171561137f5761137f6112cd565b816040528281528a6020848701011115611397575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f80604083850312156113cb575f80fd5b82356113d6816111fb565b915060208301356112c2816111fb565b600181811c908216806113fa57607f821691505b60208210810361141857634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906114739083018461118f565b9695505050505050565b5f6020828403121561148d575f80fd5b81516109e48161115f565b634e487b7160e01b5f52601260045260245ffdfea26469706673582212209ce79263776d6e2942c23d74cb874f40017d5cbfce542328dc027dec1e7fc85a64736f6c63430008140033000000000000000000000000d8a010c840fa18cfbcf613b197dfb09888830a0000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000003168747470733a2f2f7777772e617572616c67656e6975732e636f6d2f696d616765732f62727573682f5a6575732e706e67000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061011b575f3560e01c80636352211e1161009d57806398d5fdca1161006257806398d5fdca146102fe578063a22cb46514610312578063b88d4fde14610331578063c87b56dd14610350578063e985e9c51461036f575f80fd5b80636352211e1461026e5780636fa4f5f71461028d57806370a08231146102ac57806391b7f5ed146102cb57806395d89b41146102ea575f80fd5b806323b872dd116100e357806323b872dd146101ea578063360c87311461020957806340d097c31461021d57806342842e0e1461023057806351cff8d91461024f575f80fd5b806301ffc9a71461011f57806306fdde0314610153578063081812fc14610174578063095ea7b3146101ab57806318160ddd146101cc575b5f80fd5b34801561012a575f80fd5b5061013e610139366004611174565b61038e565b60405190151581526020015b60405180910390f35b34801561015e575f80fd5b506101676103df565b60405161014a91906111d2565b34801561017f575f80fd5b5061019361018e3660046111e4565b61046e565b6040516001600160a01b03909116815260200161014a565b3480156101b6575f80fd5b506101ca6101c536600461120f565b610495565b005b3480156101d7575f80fd5b506008545b60405190815260200161014a565b3480156101f5575f80fd5b506101ca610204366004611239565b6104a4565b348015610214575f80fd5b50600b546101dc565b6101ca61022b366004611277565b610532565b34801561023b575f80fd5b506101ca61024a366004611239565b610708565b34801561025a575f80fd5b506101ca610269366004611277565b610727565b348015610279575f80fd5b506101936102883660046111e4565b6107f1565b348015610298575f80fd5b506101ca6102a73660046111e4565b610867565b3480156102b7575f80fd5b506101dc6102c6366004611277565b6108ad565b3480156102d6575f80fd5b506101ca6102e53660046111e4565b6108f2565b3480156102f5575f80fd5b5061016761092c565b348015610309575f80fd5b50600a546101dc565b34801561031d575f80fd5b506101ca61032c366004611292565b61093b565b34801561033c575f80fd5b506101ca61034b3660046112e1565b610946565b34801561035b575f80fd5b5061016761036a3660046111e4565b61095d565b34801561037a575f80fd5b5061013e6103893660046113ba565b6109eb565b5f6001600160e01b031982166380ac58cd60e01b14806103be57506001600160e01b03198216635b5e139f60e01b145b806103d957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f80546103ed906113e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610419906113e6565b80156104645780601f1061043b57610100808354040283529160200191610464565b820191905f5260205f20905b81548152906001019060200180831161044757829003601f168201915b5050505050905090565b5f61047882610a18565b505f828152600460205260409020546001600160a01b03166103d9565b6104a0828233610a50565b5050565b6001600160a01b0382166104d257604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f6104de838333610a5d565b9050836001600160a01b0316816001600160a01b03161461052c576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016104c9565b50505050565b61053a610b4f565b6001600160a01b03811661057f5760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c206164647265737360a01b60448201526064016104c9565b336105bb5760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c206164647265737360a01b60448201526064016104c9565b600a5434146105fc5760405162461bcd60e51b815260206004820152600d60248201526c696e76616c69642076616c696560981b60448201526064016104c9565b5f3390505f61060e6008546001610ba8565b905061061a8282610bff565b60088190555f818152600c6020526040812080546001600160a01b0319166001600160a01b038516179055600a5461065f90610657906064610c18565b600b54610c67565b90505f846001600160a01b0316826040515f6040518083038185875af1925050503d805f81146106aa576040519150601f19603f3d011682016040523d82523d5f602084013e6106af565b606091505b50509050806106f75760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016104c9565b505050506107056001600655565b50565b61072283838360405180602001604052805f815250610946565b505050565b6009546001600160a01b031633146107515760405162461bcd60e51b81526004016104c99061141e565b3361075a575f80fd5b60405147905f906001600160a01b0384169083908381818185875af1925050503d805f81146107a4576040519150601f19603f3d011682016040523d82523d5f602084013e6107a9565b606091505b50509050806107225760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016104c9565b5f818152600c60205260408120546001600160a01b0316806103d95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016104c9565b6009546001600160a01b031633146108915760405162461bcd60e51b81526004016104c99061141e565b6064811061089d575f80fd5b5f81116108a8575f80fd5b600b55565b5f6001600160a01b0382166108d7576040516322718ad960e21b81525f60048201526024016104c9565b506001600160a01b03165f9081526003602052604090205490565b6009546001600160a01b0316331461091c5760405162461bcd60e51b81526004016104c99061141e565b805f03610927575f80fd5b600a55565b6060600180546103ed906113e6565b6104a0338383610cbc565b6109518484846104a4565b61052c84848484610d5a565b5f818152600c60205260409020546060906001600160a01b03166109db5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016104c9565b5f6109e4610e80565b9392505050565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b5f818152600260205260408120546001600160a01b0316806103d957604051637e27328960e01b8152600481018490526024016104c9565b6107228383836001610e8f565b5f828152600260205260408120546001600160a01b0390811690831615610a8957610a89818486610f93565b6001600160a01b03811615610ac357610aa45f855f80610e8f565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615610af1576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b600260065403610ba15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c9565b6002600655565b5f805f610bb58585610ff7565b9150915081610bf75760405162461bcd60e51b815260206004820152600e60248201526d20b23234ba34b7b71032b93937b960911b60448201526064016104c9565b949350505050565b6104a0828260405180602001604052805f81525061101e565b5f805f610c258585611034565b9150915081610bf75760405162461bcd60e51b815260206004820152600e60248201526d2234bb34b9b4b7b71032b93937b960911b60448201526064016104c9565b5f805f610c748585611064565b9150915081610bf75760405162461bcd60e51b815260206004820152601460248201527326bab63a34b83634b1b0ba34b7b71032b93937b960611b60448201526064016104c9565b6001600160a01b038216610cee57604051630b61174360e31b81526001600160a01b03831660048201526024016104c9565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561052c57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290610d9c903390889087908790600401611441565b6020604051808303815f875af1925050508015610dd6575060408051601f3d908101601f19168201909252610dd39181019061147d565b60015b610e3d573d808015610e03576040519150601f19603f3d011682016040523d82523d5f602084013e610e08565b606091505b5080515f03610e3557604051633250574960e11b81526001600160a01b03851660048201526024016104c9565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14610e7957604051633250574960e11b81526001600160a01b03851660048201526024016104c9565b5050505050565b6060600780546103ed906113e6565b8080610ea357506001600160a01b03821615155b15610f64575f610eb284610a18565b90506001600160a01b03831615801590610ede5750826001600160a01b0316816001600160a01b031614155b8015610ef15750610eef81846109eb565b155b15610f1a5760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016104c9565b8115610f625783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b610f9e83838361109d565b610722576001600160a01b038316610fcc57604051637e27328960e01b8152600481018290526024016104c9565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016104c9565b5f8083830184811015611010575f809250925050611017565b6001925090505b9250929050565b61102883836110fe565b6107225f848484610d5a565b5f80825f0361104757505f905080611017565b600183858161105857611058611498565b04915091509250929050565b5f80835f036110785750600190505f611017565b8383028385828161108b5761108b611498565b0414611010575f809250925050611017565b5f6001600160a01b03831615801590610bf75750826001600160a01b0316846001600160a01b031614806110d657506110d684846109eb565b80610bf75750505f908152600460205260409020546001600160a01b03908116911614919050565b6001600160a01b03821661112757604051633250574960e11b81525f60048201526024016104c9565b5f61113383835f610a5d565b90506001600160a01b03811615610722576040516339e3563760e11b81525f60048201526024016104c9565b6001600160e01b031981168114610705575f80fd5b5f60208284031215611184575f80fd5b81356109e48161115f565b5f81518084525f5b818110156111b357602081850181015186830182015201611197565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6109e4602083018461118f565b5f602082840312156111f4575f80fd5b5035919050565b6001600160a01b0381168114610705575f80fd5b5f8060408385031215611220575f80fd5b823561122b816111fb565b946020939093013593505050565b5f805f6060848603121561124b575f80fd5b8335611256816111fb565b92506020840135611266816111fb565b929592945050506040919091013590565b5f60208284031215611287575f80fd5b81356109e4816111fb565b5f80604083850312156112a3575f80fd5b82356112ae816111fb565b9150602083013580151581146112c2575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f80608085870312156112f4575f80fd5b84356112ff816111fb565b9350602085013561130f816111fb565b925060408501359150606085013567ffffffffffffffff80821115611332575f80fd5b818701915087601f830112611345575f80fd5b813581811115611357576113576112cd565b604051601f8201601f19908116603f0116810190838211818310171561137f5761137f6112cd565b816040528281528a6020848701011115611397575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f80604083850312156113cb575f80fd5b82356113d6816111fb565b915060208301356112c2816111fb565b600181811c908216806113fa57607f821691505b60208210810361141857634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906114739083018461118f565b9695505050505050565b5f6020828403121561148d575f80fd5b81516109e48161115f565b634e487b7160e01b5f52601260045260245ffdfea26469706673582212209ce79263776d6e2942c23d74cb874f40017d5cbfce542328dc027dec1e7fc85a64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d8a010c840fa18cfbcf613b197dfb09888830a0000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000003168747470733a2f2f7777772e617572616c67656e6975732e636f6d2f696d616765732f62727573682f5a6575732e706e67000000000000000000000000000000
-----Decoded View---------------
Arg [0] : owner (address): 0xd8a010c840fa18cFBcF613B197DFb09888830a00
Arg [1] : baseURI_ (string): https://www.auralgenius.com/images/brush/Zeus.png
Arg [2] : ref_precent_ (uint256): 20
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000d8a010c840fa18cfbcf613b197dfb09888830a00
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000031
Arg [4] : 68747470733a2f2f7777772e617572616c67656e6975732e636f6d2f696d6167
Arg [5] : 65732f62727573682f5a6575732e706e67000000000000000000000000000000
Deployed Bytecode Sourcemap
64643:3958:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37812:305;;;;;;;;;;-1:-1:-1;37812:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;37812:305:0;;;;;;;;38643:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39815:158::-;;;;;;;;;;-1:-1:-1;39815:158:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1594:32:1;;;1576:51;;1564:2;1549:18;39815:158:0;1430:203:1;39634:115:0;;;;;;;;;;-1:-1:-1;39634:115:0;;;;;:::i;:::-;;:::i;:::-;;68508:90;;;;;;;;;;-1:-1:-1;68578:12:0;;68508:90;;;2240:25:1;;;2228:2;2213:18;68508:90:0;2094:177:1;40484:588:0;;;;;;;;;;-1:-1:-1;40484:588:0;;;;;:::i;:::-;;:::i;67710:93::-;;;;;;;;;;-1:-1:-1;67783:12:0;;67710:93;;66276:607;;;;;;:::i;:::-;;:::i;41143:134::-;;;;;;;;;;-1:-1:-1;41143:134:0;;;;;:::i;:::-;;:::i;65361:262::-;;;;;;;;;;-1:-1:-1;65361:262:0;;;;;:::i;:::-;;:::i;66949:239::-;;;;;;;;;;-1:-1:-1;66949:239:0;;;;;:::i;:::-;;:::i;67525:173::-;;;;;;;;;;-1:-1:-1;67525:173:0;;;;;:::i;:::-;;:::i;38181:213::-;;;;;;;;;;-1:-1:-1;38181:213:0;;;;;:::i;:::-;;:::i;67305:122::-;;;;;;;;;;-1:-1:-1;67305:122:0;;;;;:::i;:::-;;:::i;38803:95::-;;;;;;;;;;;;;:::i;67435:82::-;;;;;;;;;;-1:-1:-1;67503:6:0;;67435:82;;40045:146;;;;;;;;;;-1:-1:-1;40045:146:0;;;;;:::i;:::-;;:::i;41348:211::-;;;;;;;;;;-1:-1:-1;41348:211:0;;;;;:::i;:::-;;:::i;68251:245::-;;;;;;;;;;-1:-1:-1;68251:245:0;;;;;:::i;:::-;;:::i;40262:155::-;;;;;;;;;;-1:-1:-1;40262:155:0;;;;;:::i;:::-;;:::i;37812:305::-;37914:4;-1:-1:-1;;;;;;37951:40:0;;-1:-1:-1;;;37951:40:0;;:105;;-1:-1:-1;;;;;;;38008:48:0;;-1:-1:-1;;;38008:48:0;37951:105;:158;;;-1:-1:-1;;;;;;;;;;29781:40:0;;;38073:36;37931:178;37812:305;-1:-1:-1;;37812:305:0:o;38643:91::-;38688:13;38721:5;38714:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38643:91;:::o;39815:158::-;39882:7;39902:22;39916:7;39902:13;:22::i;:::-;-1:-1:-1;42391:7:0;42418:24;;;:15;:24;;;;;;-1:-1:-1;;;;;42418:24:0;39944:21;42321:129;39634:115;39706:35;39715:2;39719:7;8629:10;39706:8;:35::i;:::-;39634:115;;:::o;40484:588::-;-1:-1:-1;;;;;40579:16:0;;40575:89;;40619:33;;-1:-1:-1;;;40619:33:0;;40649:1;40619:33;;;1576:51:1;1549:18;;40619:33:0;;;;;;;;40575:89;40885:21;40909:34;40917:2;40921:7;8629:10;40909:7;:34::i;:::-;40885:58;;40975:4;-1:-1:-1;;;;;40958:21:0;:13;-1:-1:-1;;;;;40958:21:0;;40954:111;;41003:50;;-1:-1:-1;;;41003:50:0;;-1:-1:-1;;;;;6109:15:1;;;41003:50:0;;;6091:34:1;6141:18;;;6134:34;;;6204:15;;6184:18;;;6177:43;6026:18;;41003:50:0;5851:375:1;40954:111:0;40564:508;40484:588;;;:::o;66276:607::-;63677:21;:19;:21::i;:::-;-1:-1:-1;;;;;66361:17:0;::::1;66353:42;;;::::0;-1:-1:-1;;;66353:42:0;;6433:2:1;66353:42:0::1;::::0;::::1;6415:21:1::0;6472:2;6452:18;;;6445:30;-1:-1:-1;;;6491:18:1;;;6484:42;6543:18;;66353:42:0::1;6231:336:1::0;66353:42:0::1;66414:10;66406:49;;;::::0;-1:-1:-1;;;66406:49:0;;6433:2:1;66406:49:0::1;::::0;::::1;6415:21:1::0;6472:2;6452:18;;;6445:30;-1:-1:-1;;;6491:18:1;;;6484:42;6543:18;;66406:49:0::1;6231:336:1::0;66406:49:0::1;66487:6;;66474:9;:19;66466:45;;;::::0;-1:-1:-1;;;66466:45:0;;6774:2:1;66466:45:0::1;::::0;::::1;6756:21:1::0;6813:2;6793:18;;;6786:30;-1:-1:-1;;;6832:18:1;;;6825:43;6885:18;;66466:45:0::1;6572:337:1::0;66466:45:0::1;66522:10;66535;66522:23;;66556:15;66574:24;66582:12;;66596:1;66574:7;:24::i;:::-;66556:42;;66609:22;66619:2;66623:7;66609:9;:22::i;:::-;66642:12;:22:::0;;;66675:16:::1;::::0;;;:7:::1;:16;::::0;;;;:21;;-1:-1:-1;;;;;;66675:21:0::1;-1:-1:-1::0;;;;;66675:21:0;::::1;;::::0;;66740:6:::1;::::0;66724:43:::1;::::0;66732:20:::1;::::0;66748:3:::1;66732:7;:20::i;:::-;66754:12;;66724:7;:43::i;:::-;66707:60;;66779:12;66797:3;-1:-1:-1::0;;;;;66797:8:0::1;66813:6;66797:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66778:46;;;66843:7;66835:40;;;::::0;-1:-1:-1;;;66835:40:0;;7326:2:1;66835:40:0::1;::::0;::::1;7308:21:1::0;7365:2;7345:18;;;7338:30;-1:-1:-1;;;7384:18:1;;;7377:50;7444:18;;66835:40:0::1;7124:344:1::0;66835:40:0::1;66342:541;;;;63721:20:::0;63115:1;64241:7;:22;64058:213;63721:20;66276:607;:::o;41143:134::-;41230:39;41247:4;41253:2;41257:7;41230:39;;;;;;;;;;;;:16;:39::i;:::-;41143:134;;;:::o;65361:262::-;65308:6;;-1:-1:-1;;;;;65308:6:0;65294:10;:20;65286:42;;;;-1:-1:-1;;;65286:42:0;;;;;;;:::i;:::-;65435:10:::1;65427:33;;;::::0;::::1;;65538:26;::::0;65485:21:::1;::::0;65471:11:::1;::::0;-1:-1:-1;;;;;65538:7:0;::::1;::::0;65485:21;;65471:11;65538:26;65471:11;65538:26;65485:21;65538:7;:26:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65519:45;;;65583:7;65575:40;;;::::0;-1:-1:-1;;;65575:40:0;;7326:2:1;65575:40:0::1;::::0;::::1;7308:21:1::0;7365:2;7345:18;;;7338:30;-1:-1:-1;;;7384:18:1;;;7377:50;7444:18;;65575:40:0::1;7124:344:1::0;66949:239:0;67021:7;67057:16;;;:7;:16;;;;;;-1:-1:-1;;;;;67057:16:0;;67084:73;;;;-1:-1:-1;;;67084:73:0;;8012:2:1;67084:73:0;;;7994:21:1;8051:2;8031:18;;;8024:30;8090:34;8070:18;;;8063:62;-1:-1:-1;;;8141:18:1;;;8134:39;8190:19;;67084:73:0;7810:405:1;67525:173:0;65308:6;;-1:-1:-1;;;;;65308:6:0;65294:10;:20;65286:42;;;;-1:-1:-1;;;65286:42:0;;;;;;;:::i;:::-;67616:3:::1;67603:10;:16;67595:25;;;::::0;::::1;;67652:1;67639:10;:14;67631:23;;;::::0;::::1;;67665:12;:25:::0;67525:173::o;38181:213::-;38244:7;-1:-1:-1;;;;;38268:19:0;;38264:89;;38311:30;;-1:-1:-1;;;38311:30:0;;38338:1;38311:30;;;1576:51:1;1549:18;;38311:30:0;1430:203:1;38264:89:0;-1:-1:-1;;;;;;38370:16:0;;;;;:9;:16;;;;;;;38181:213::o;67305:122::-;65308:6;;-1:-1:-1;;;;;65308:6:0;65294:10;:20;65286:42;;;;-1:-1:-1;;;65286:42:0;;;;;;;:::i;:::-;67377:8:::1;67389:1;67377:13:::0;67369:22:::1;;;::::0;::::1;;67402:6;:17:::0;67305:122::o;38803:95::-;38850:13;38883:7;38876:14;;;;;:::i;40045:146::-;40131:52;8629:10;40164:8;40174;40131:18;:52::i;41348:211::-;41462:31;41475:4;41481:2;41485:7;41462:12;:31::i;:::-;41504:47;41527:4;41533:2;41537:7;41546:4;41504:22;:47::i;68251:245::-;68181:4;68205:16;;;:7;:16;;;;;;68316:13;;-1:-1:-1;;;;;68205:16:0;68342:76;;;;-1:-1:-1;;;68342:76:0;;8422:2:1;68342:76:0;;;8404:21:1;8461:2;8441:18;;;8434:30;8500:34;8480:18;;;8473:62;-1:-1:-1;;;8551:18:1;;;8544:45;8606:19;;68342:76:0;8220:411:1;68342:76:0;68429:21;68453:10;:8;:10::i;:::-;68429:34;68251:245;-1:-1:-1;;;68251:245:0:o;40262:155::-;-1:-1:-1;;;;;40374:25:0;;;40350:4;40374:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40262:155::o;52790:247::-;52853:7;42176:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42176:16:0;;52917:90;;52964:31;;-1:-1:-1;;;52964:31:0;;;;;2240:25:1;;;2213:18;;52964:31:0;2094:177:1;51022:122:0;51103:33;51112:2;51116:7;51125:4;51131;51103:8;:33::i;45283:824::-;45369:7;42176:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42176:16:0;;;;45484:18;;;45480:88;;45519:37;45536:4;45542;45548:7;45519:16;:37::i;:::-;-1:-1:-1;;;;;45615:18:0;;;45611:263;;45733:48;45750:1;45754:7;45771:1;45775:5;45733:8;:48::i;:::-;-1:-1:-1;;;;;45827:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;45827:20:0;;;45611:263;-1:-1:-1;;;;;45890:16:0;;;45886:111;;-1:-1:-1;;;;;45952:13:0;;;;;;:9;:13;;;;;:18;;45969:1;45952:18;;;45886:111;46009:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;46009:21:0;-1:-1:-1;;;;;46009:21:0;;;;;;;;;46048:27;;46009:16;;46048:27;;;;;;;46095:4;45283:824;-1:-1:-1;;;;45283:824:0:o;63757:293::-;63159:1;63891:7;;:19;63883:63;;;;-1:-1:-1;;;63883:63:0;;8838:2:1;63883:63:0;;;8820:21:1;8877:2;8857:18;;;8850:30;8916:33;8896:18;;;8889:61;8967:18;;63883:63:0;8636:355:1;63883:63:0;63159:1;64024:7;:18;63757:293::o;65631:205::-;65692:7;65712:12;65726:11;65741:21;65757:1;65760;65741:15;:21::i;:::-;65711:51;;;;65781:7;65773:34;;;;-1:-1:-1;;;65773:34:0;;9198:2:1;65773:34:0;;;9180:21:1;9237:2;9217:18;;;9210:30;-1:-1:-1;;;9256:18:1;;;9249:44;9310:18;;65773:34:0;8996:338:1;65773:34:0;65825:3;65631:205;-1:-1:-1;;;;65631:205:0:o;47141:102::-;47209:26;47219:2;47223:7;47209:26;;;;;;;;;;;;:9;:26::i;66063:205::-;66124:7;66144:12;66158:11;66173:21;66189:1;66192;66173:15;:21::i;:::-;66143:51;;;;66213:7;66205:34;;;;-1:-1:-1;;;66205:34:0;;9541:2:1;66205:34:0;;;9523:21:1;9580:2;9560:18;;;9553:30;-1:-1:-1;;;9599:18:1;;;9592:44;9653:18;;66205:34:0;9339:338:1;65844:211:0;65905:7;65925:12;65939:11;65954:21;65970:1;65973;65954:15;:21::i;:::-;65924:51;;;;65994:7;65986:40;;;;-1:-1:-1;;;65986:40:0;;9884:2:1;65986:40:0;;;9866:21:1;9923:2;9903:18;;;9896:30;-1:-1:-1;;;9942:18:1;;;9935:50;10002:18;;65986:40:0;9682:344:1;52229:318:0;-1:-1:-1;;;;;52337:22:0;;52333:93;;52383:31;;-1:-1:-1;;;52383:31:0;;-1:-1:-1;;;;;1594:32:1;;52383:31:0;;;1576:51:1;1549:18;;52383:31:0;1430:203:1;52333:93:0;-1:-1:-1;;;;;52436:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;52436:46:0;;;;;;;;;;52498:41;;540::1;;;52498::0;;513:18:1;52498:41:0;;;;;;;52229:318;;;:::o;53587:799::-;-1:-1:-1;;;;;53704:14:0;;;:18;53700:679;;53743:71;;-1:-1:-1;;;53743:71:0;;-1:-1:-1;;;;;53743:36:0;;;;;:71;;8629:10;;53794:4;;53800:7;;53809:4;;53743:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53743:71:0;;;;;;;;-1:-1:-1;;53743:71:0;;;;;;;;;;;;:::i;:::-;;;53739:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54057:6;:13;54074:1;54057:18;54053:300;;54107:25;;-1:-1:-1;;;54107:25:0;;-1:-1:-1;;;;;1594:32:1;;54107:25:0;;;1576:51:1;1549:18;;54107:25:0;1430:203:1;54053:300:0;54303:6;54297:13;54288:6;54284:2;54280:15;54273:38;53739:629;-1:-1:-1;;;;;;53862:51:0;;-1:-1:-1;;;53862:51:0;53858:132;;53945:25;;-1:-1:-1;;;53945:25:0;;-1:-1:-1;;;;;1594:32:1;;53945:25:0;;;1576:51:1;1549:18;;53945:25:0;1430:203:1;53858:132:0;53815:190;53587:799;;;;:::o;67196:101::-;67248:13;67281:8;67274:15;;;;;:::i;51332:678::-;51494:9;:31;;;-1:-1:-1;;;;;;51507:18:0;;;;51494:31;51490:471;;;51542:13;51558:22;51572:7;51558:13;:22::i;:::-;51542:38;-1:-1:-1;;;;;;51711:18:0;;;;;;:35;;;51742:4;-1:-1:-1;;;;;51733:13:0;:5;-1:-1:-1;;;;;51733:13:0;;;51711:35;:69;;;;;51751:29;51768:5;51775:4;51751:16;:29::i;:::-;51750:30;51711:69;51707:144;;;51808:27;;-1:-1:-1;;;51808:27:0;;-1:-1:-1;;;;;1594:32:1;;51808:27:0;;;1576:51:1;1549:18;;51808:27:0;1430:203:1;51707:144:0;51871:9;51867:83;;;51926:7;51922:2;-1:-1:-1;;;;;51906:28:0;51915:5;-1:-1:-1;;;;;51906:28:0;;;;;;;;;;;51867:83;51527:434;51490:471;-1:-1:-1;;51973:24:0;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;51973:29:0;-1:-1:-1;;;;;51973:29:0;;;;;;;;;;51332:678::o;43490:376::-;43603:38;43617:5;43624:7;43633;43603:13;:38::i;:::-;43598:261;;-1:-1:-1;;;;;43662:19:0;;43658:190;;43709:31;;-1:-1:-1;;;43709:31:0;;;;;2240:25:1;;;2213:18;;43709:31:0;2094:177:1;43658:190:0;43788:44;;-1:-1:-1;;;43788:44:0;;-1:-1:-1;;;;;10971:32:1;;43788:44:0;;;10953:51:1;11020:18;;;11013:34;;;10926:18;;43788:44:0;10779:274:1;55084:222:0;55145:4;;55208:5;;;55232;;;55228:28;;;55247:5;55254:1;55239:17;;;;;;;55228:28;55279:4;;-1:-1:-1;55285:1:0;-1:-1:-1;55084:222:0;;;;;;:::o;47470:185::-;47565:18;47571:2;47575:7;47565:5;:18::i;:::-;47594:53;47625:1;47629:2;47633:7;47642:4;47594:22;:53::i;56466:195::-;56527:4;56533:7;56582:1;56587;56582:6;56578:29;;-1:-1:-1;56598:5:0;;-1:-1:-1;56598:5:0;56590:17;;56578:29;56630:4;56640:1;56636;:5;;;;;:::i;:::-;;56622:20;;;;56466:195;;;;;:::o;55807:503::-;55868:4;55874:7;56156:1;56161;56156:6;56152:28;;-1:-1:-1;56172:4:0;;-1:-1:-1;56178:1:0;56164:16;;56152:28;56207:5;;;56211:1;56207;:5;:1;56231:5;;;;:::i;:::-;;:10;56227:33;;56251:5;56258:1;56243:17;;;;;;;42770:276;42873:4;-1:-1:-1;;;;;42910:21:0;;;;;;:128;;;42958:7;-1:-1:-1;;;;;42949:16:0;:5;-1:-1:-1;;;;;42949:16:0;;:52;;;;42969:32;42986:5;42993:7;42969:16;:32::i;:::-;42949:88;;;-1:-1:-1;;42391:7:0;42418:24;;;:15;:24;;;;;;-1:-1:-1;;;;;42418:24:0;;;43005:32;;;;42890:148;-1:-1:-1;42770:276:0:o;46443:335::-;-1:-1:-1;;;;;46511:16:0;;46507:89;;46551:33;;-1:-1:-1;;;46551:33:0;;46581:1;46551:33;;;1576:51:1;1549:18;;46551:33:0;1430:203:1;46507:89:0;46606:21;46630:32;46638:2;46642:7;46659:1;46630:7;:32::i;:::-;46606:56;-1:-1:-1;;;;;;46677:27:0;;;46673:98;;46728:31;;-1:-1:-1;;;46728:31:0;;46756:1;46728:31;;;1576:51:1;1549:18;;46728:31:0;1430:203:1;14:131;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:423::-;634:3;672:5;666:12;699:6;694:3;687:19;724:1;734:162;748:6;745:1;742:13;734:162;;;810:4;866:13;;;862:22;;856:29;838:11;;;834:20;;827:59;763:12;734:162;;;738:3;941:1;934:4;925:6;920:3;916:16;912:27;905:38;1004:4;997:2;993:7;988:2;980:6;976:15;972:29;967:3;963:39;959:50;952:57;;;592:423;;;;:::o;1020:220::-;1169:2;1158:9;1151:21;1132:4;1189:45;1230:2;1219:9;1215:18;1207:6;1189:45;:::i;1245:180::-;1304:6;1357:2;1345:9;1336:7;1332:23;1328:32;1325:52;;;1373:1;1370;1363:12;1325:52;-1:-1:-1;1396:23:1;;1245:180;-1:-1:-1;1245:180:1:o;1638:131::-;-1:-1:-1;;;;;1713:31:1;;1703:42;;1693:70;;1759:1;1756;1749:12;1774:315;1842:6;1850;1903:2;1891:9;1882:7;1878:23;1874:32;1871:52;;;1919:1;1916;1909:12;1871:52;1958:9;1945:23;1977:31;2002:5;1977:31;:::i;:::-;2027:5;2079:2;2064:18;;;;2051:32;;-1:-1:-1;;;1774:315:1:o;2276:456::-;2353:6;2361;2369;2422:2;2410:9;2401:7;2397:23;2393:32;2390:52;;;2438:1;2435;2428:12;2390:52;2477:9;2464:23;2496:31;2521:5;2496:31;:::i;:::-;2546:5;-1:-1:-1;2603:2:1;2588:18;;2575:32;2616:33;2575:32;2616:33;:::i;:::-;2276:456;;2668:7;;-1:-1:-1;;;2722:2:1;2707:18;;;;2694:32;;2276:456::o;2737:255::-;2804:6;2857:2;2845:9;2836:7;2832:23;2828:32;2825:52;;;2873:1;2870;2863:12;2825:52;2912:9;2899:23;2931:31;2956:5;2931:31;:::i;3249:416::-;3314:6;3322;3375:2;3363:9;3354:7;3350:23;3346:32;3343:52;;;3391:1;3388;3381:12;3343:52;3430:9;3417:23;3449:31;3474:5;3449:31;:::i;:::-;3499:5;-1:-1:-1;3556:2:1;3541:18;;3528:32;3598:15;;3591:23;3579:36;;3569:64;;3629:1;3626;3619:12;3569:64;3652:7;3642:17;;;3249:416;;;;;:::o;3670:127::-;3731:10;3726:3;3722:20;3719:1;3712:31;3762:4;3759:1;3752:15;3786:4;3783:1;3776:15;3802:1266;3897:6;3905;3913;3921;3974:3;3962:9;3953:7;3949:23;3945:33;3942:53;;;3991:1;3988;3981:12;3942:53;4030:9;4017:23;4049:31;4074:5;4049:31;:::i;:::-;4099:5;-1:-1:-1;4156:2:1;4141:18;;4128:32;4169:33;4128:32;4169:33;:::i;:::-;4221:7;-1:-1:-1;4275:2:1;4260:18;;4247:32;;-1:-1:-1;4330:2:1;4315:18;;4302:32;4353:18;4383:14;;;4380:34;;;4410:1;4407;4400:12;4380:34;4448:6;4437:9;4433:22;4423:32;;4493:7;4486:4;4482:2;4478:13;4474:27;4464:55;;4515:1;4512;4505:12;4464:55;4551:2;4538:16;4573:2;4569;4566:10;4563:36;;;4579:18;;:::i;:::-;4654:2;4648:9;4622:2;4708:13;;-1:-1:-1;;4704:22:1;;;4728:2;4700:31;4696:40;4684:53;;;4752:18;;;4772:22;;;4749:46;4746:72;;;4798:18;;:::i;:::-;4838:10;4834:2;4827:22;4873:2;4865:6;4858:18;4913:7;4908:2;4903;4899;4895:11;4891:20;4888:33;4885:53;;;4934:1;4931;4924:12;4885:53;4990:2;4985;4981;4977:11;4972:2;4964:6;4960:15;4947:46;5035:1;5030:2;5025;5017:6;5013:15;5009:24;5002:35;5056:6;5046:16;;;;;;;3802:1266;;;;;;;:::o;5073:388::-;5141:6;5149;5202:2;5190:9;5181:7;5177:23;5173:32;5170:52;;;5218:1;5215;5208:12;5170:52;5257:9;5244:23;5276:31;5301:5;5276:31;:::i;:::-;5326:5;-1:-1:-1;5383:2:1;5368:18;;5355:32;5396:33;5355:32;5396:33;:::i;5466:380::-;5545:1;5541:12;;;;5588;;;5609:61;;5663:4;5655:6;5651:17;5641:27;;5609:61;5716:2;5708:6;5705:14;5685:18;5682:38;5679:161;;5762:10;5757:3;5753:20;5750:1;5743:31;5797:4;5794:1;5787:15;5825:4;5822:1;5815:15;5679:161;;5466:380;;;:::o;7473:332::-;7675:2;7657:21;;;7714:1;7694:18;;;7687:29;-1:-1:-1;;;7747:2:1;7732:18;;7725:39;7796:2;7781:18;;7473:332::o;10031:489::-;-1:-1:-1;;;;;10300:15:1;;;10282:34;;10352:15;;10347:2;10332:18;;10325:43;10399:2;10384:18;;10377:34;;;10447:3;10442:2;10427:18;;10420:31;;;10225:4;;10468:46;;10494:19;;10486:6;10468:46;:::i;:::-;10460:54;10031:489;-1:-1:-1;;;;;;10031:489:1:o;10525:249::-;10594:6;10647:2;10635:9;10626:7;10622:23;10618:32;10615:52;;;10663:1;10660;10653:12;10615:52;10695:9;10689:16;10714:30;10738:5;10714:30;:::i;11058:127::-;11119:10;11114:3;11110:20;11107:1;11100:31;11150:4;11147:1;11140:15;11174:4;11171:1;11164:15
Swarm Source
ipfs://9ce79263776d6e2942c23d74cb874f40017d5cbfce542328dc027dec1e7fc85a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.98
Net Worth in ETH
Token Allocations
ETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| SCROLL | 100.00% | $3,001.27 | 0.000328 | $0.984418 |
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.