Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 125 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 19248124 | 231 days ago | IN | 0 ETH | 0.00097431 | ||||
Approve | 19247967 | 232 days ago | IN | 0 ETH | 0.00062935 | ||||
Approve | 19247962 | 232 days ago | IN | 0 ETH | 0.00108006 | ||||
Approve | 19247954 | 232 days ago | IN | 0 ETH | 0.00106381 | ||||
Approve | 19247945 | 232 days ago | IN | 0 ETH | 0.00132694 | ||||
Approve | 19247942 | 232 days ago | IN | 0 ETH | 0.00118537 | ||||
Approve | 19247929 | 232 days ago | IN | 0 ETH | 0.00124857 | ||||
Approve | 19247929 | 232 days ago | IN | 0 ETH | 0.00125601 | ||||
Approve | 19247929 | 232 days ago | IN | 0 ETH | 0.00124857 | ||||
Approve | 19247929 | 232 days ago | IN | 0 ETH | 0.00132942 | ||||
Approve | 19247929 | 232 days ago | IN | 0 ETH | 0.00198463 | ||||
Approve | 19247927 | 232 days ago | IN | 0 ETH | 0.00139451 | ||||
Approve | 19247926 | 232 days ago | IN | 0 ETH | 0.00124562 | ||||
Approve | 19247926 | 232 days ago | IN | 0 ETH | 0.00132712 | ||||
Approve | 19247925 | 232 days ago | IN | 0 ETH | 0.0013127 | ||||
Approve | 19247925 | 232 days ago | IN | 0 ETH | 0.0013825 | ||||
Approve | 19247920 | 232 days ago | IN | 0 ETH | 0.00154098 | ||||
Transfer | 19247902 | 232 days ago | IN | 0 ETH | 0.00128083 | ||||
Approve | 19247879 | 232 days ago | IN | 0 ETH | 0.00100973 | ||||
Approve | 19247879 | 232 days ago | IN | 0 ETH | 0.00093238 | ||||
Approve | 19247869 | 232 days ago | IN | 0 ETH | 0.00097807 | ||||
Approve | 19247868 | 232 days ago | IN | 0 ETH | 0.00102072 | ||||
Transfer | 19247863 | 232 days ago | IN | 0 ETH | 0.00107211 | ||||
Approve | 19247861 | 232 days ago | IN | 0 ETH | 0.0008664 | ||||
Approve | 19247856 | 232 days ago | IN | 0 ETH | 0.00082461 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
XBOX404
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /* https://t.me/XBOX404 https://twitter.com/XBOX_ERC404 https://xbox404.com/ */ pragma solidity ^0.8.24; interface Callable { function tokenCallback(address _from, uint256 _tokens, bytes calldata _data) external returns (bool); } interface ERC20Interface { function balanceOf(address) external view returns (uint256); function allowance(address, address) external view returns (uint256); function transfer(address, uint256) external returns (bool); function transferFrom(address, address, uint256) external returns (bool); } 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); } } } /** * @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; } } /** * @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)); } } abstract contract Ownable { event OwnershipTransferred(address indexed user, address indexed newOwner); error Unauthorized(); error InvalidOwner(); address public owner; modifier onlyOwner() virtual { if (msg.sender != owner) revert Unauthorized(); _; } constructor(address _owner) { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(address(0), _owner); } function transferOwnership(address _owner) public virtual onlyOwner { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(msg.sender, _owner); } function revokeOwnership() public virtual onlyOwner { owner = address(0); emit OwnershipTransferred(msg.sender, address(0)); } } abstract contract ERC721Receiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721Receiver.onERC721Received.selector; } } /// @notice ERC404 /// A gas-efficient, mixed ERC20 / ERC721 implementation /// with native liquidity and fractionalization. /// /// This is an experimental standard designed to integrate /// with pre-existing ERC20 / ERC721 support as smoothly as /// possible. /// /// @dev In order to support full functionality of ERC20 and ERC721 /// supply assumptions are made that slightly constraint usage. /// Ensure decimals are sufficiently large (standard 18 recommended) /// as ids are effectively encoded in the lowest range of amounts. /// /// NFTs are spent on ERC20 functions in a FILO queue, this is by /// design. /// abstract contract ERC404 is Ownable { // Events event ERC20Transfer( address indexed from, address indexed to, uint256 amount ); event Approval( address indexed owner, address indexed spender, uint256 amount ); event Transfer( address indexed from, address indexed to, uint256 indexed id ); event ERC721Approval( address indexed owner, address indexed spender, uint256 indexed id ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); // Errors error NotFound(); error AlreadyExists(); error InvalidRecipient(); error InvalidSender(); error UnsafeRecipient(); // Metadata /// @dev Token name string public name; /// @dev Token symbol string public symbol; /// @dev Decimals for fractional representation uint8 public immutable decimals; /// @dev Total supply in fractionalized representation uint256 public immutable totalSupply; /// @dev Current mint counter, monotonically increasing to ensure accurate ownership uint256 public minted; // Mappings /// @dev Balance of user in fractional representation mapping(address => uint256) public balanceOf; /// @dev Allowance of user in fractional representation mapping(address => mapping(address => uint256)) public allowance; /// @dev Approval in native representaion mapping(uint256 => address) public getApproved; /// @dev Approval for all in native representation mapping(address => mapping(address => bool)) public isApprovedForAll; /// @dev Owner of id in native representation mapping(uint256 => address) internal _ownerOf; /// @dev Array of owned ids in native representation mapping(address => uint256[]) private _owned; function getLastOwnedTokenId(address owner) internal view returns (uint256) { require(_owned[owner].length > 0, "Owner has no tokens"); return _owned[owner][_owned[owner].length - 1]; } function getOwnedTokens(address owner) internal view returns(uint[] memory){ return _owned[owner]; } /// @dev Tracks indices for the _owned mapping mapping(uint256 => uint256) internal _ownedIndex; /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc) mapping(address => bool) public whitelist; // Constructor constructor( string memory _name, string memory _symbol, uint8 _decimals, uint256 _totalNativeSupply, address _owner ) Ownable(_owner) { name = _name; symbol = _symbol; decimals = _decimals; totalSupply = _totalNativeSupply * (10 ** decimals); setWhitelist(_owner,true); } /// @notice Initialization function to set pairs / etc /// saving gas by avoiding mint / burn on unnecessary targets function setWhitelist(address target, bool state) public onlyOwner { whitelist[target] = state; } /// @notice Allows a user to ignore gas cost of NFT transfers permanently. function setWhitelist() public { if(balanceOf[msg.sender]==0) whitelist[msg.sender] = true; } /// @notice Function to find owner of a given native token function ownerOf(uint256 id) public view virtual returns (address owner) { owner = _ownerOf[id]; if (owner == address(0)) { revert NotFound(); } } /// @notice tokenURI must be implemented by child contract function tokenURI(uint256 id) public view virtual returns (string memory); /// @notice Function for token approvals /// @dev This function assumes id / native if amount less than or equal to current max id function approve( address spender, uint256 amountOrId ) public virtual returns (bool) { if (amountOrId <= minted && amountOrId > 0) { address owner = _ownerOf[amountOrId]; if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) { revert Unauthorized(); } getApproved[amountOrId] = spender; emit Approval(owner, spender, amountOrId); } else { allowance[msg.sender][spender] = amountOrId; emit Approval(msg.sender, spender, amountOrId); } return true; } /// @notice Function native approvals function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } /// @notice Function for mixed transfers /// @dev This function assumes id / native if amount less than or equal to current max id function transferFrom( address from, address to, uint256 amountOrId ) public virtual { if (amountOrId <= minted) { if (from != _ownerOf[amountOrId]) { revert InvalidSender(); } if (to == address(0)) { revert InvalidRecipient(); } if ( msg.sender != from && !isApprovedForAll[from][msg.sender] && msg.sender != getApproved[amountOrId] ) { revert Unauthorized(); } balanceOf[from] -= _getUnit(); unchecked { balanceOf[to] += _getUnit(); } _ownerOf[amountOrId] = to; delete getApproved[amountOrId]; // update _owned for sender uint256 updatedId = _owned[from][_owned[from].length - 1]; _owned[from][_ownedIndex[amountOrId]] = updatedId; // pop _owned[from].pop(); // update index for the moved id _ownedIndex[updatedId] = _ownedIndex[amountOrId]; // push token to to owned _owned[to].push(amountOrId); // update index for to owned _ownedIndex[amountOrId] = _owned[to].length - 1; emit Transfer(from, to, amountOrId); emit ERC20Transfer(from, to, _getUnit()); } else { uint256 allowed = allowance[from][msg.sender]; if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amountOrId; _transfer(from, to, amountOrId); } } /// @notice Function for fractional transfers function transfer( address to, uint256 amount ) public virtual returns (bool) { return _transfer(msg.sender, to, amount); } /// @notice Function for native transfers with contract support function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Function for native transfers with contract support and callback data function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public virtual { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Internal function for fractional transfers function _transfer( address from, address to, uint256 amount ) internal returns (bool) { uint256 unit = _getUnit(); uint256 balanceBeforeSender = balanceOf[from]; uint256 balanceBeforeReceiver = balanceOf[to]; balanceOf[from] -= amount; unchecked { balanceOf[to] += amount; } // Skip burn for certain addresses to save gas if (!whitelist[from]) { uint256 tokens_to_burn = (balanceBeforeSender / unit) - (balanceOf[from] / unit); for (uint256 i = 0; i < tokens_to_burn; i++) { _burn(from); } } // Skip minting for certain addresses to save gas if (!whitelist[to]) { uint256 tokens_to_mint = (balanceOf[to] / unit) - (balanceBeforeReceiver / unit); for (uint256 i = 0; i < tokens_to_mint; i++) { _mint(to); } } emit ERC20Transfer(from, to, amount); return true; } // Internal utility logic function _getUnit() internal view returns (uint256) { return 10 ** decimals; } function _mint(address to) internal virtual { if (to == address(0)) { revert InvalidRecipient(); } unchecked { minted++; } uint256 id = minted; if (_ownerOf[id] != address(0)) { revert AlreadyExists(); } _ownerOf[id] = to; _owned[to].push(id); _ownedIndex[id] = _owned[to].length - 1; emit Transfer(address(0), to, id); } function _burn(address from) internal virtual { if (from == address(0)) { revert InvalidSender(); } uint256 id = _owned[from][_owned[from].length - 1]; _owned[from].pop(); delete _ownedIndex[id]; delete _ownerOf[id]; delete getApproved[id]; emit Transfer(from, address(0), id); } function _setNameSymbol( string memory _name, string memory _symbol ) internal { name = _name; symbol = _symbol; } } contract XBOX404 is ERC404 { string public dataURI; string public baseTokenURI; uint deckSize = 100; constructor() ERC404("XBOX404", "XBOX404", 18, deckSize, msg.sender) { balanceOf[msg.sender] = deckSize * 10 ** 18; } function setDataURI(string memory _dataURI) public onlyOwner { dataURI = _dataURI; } function setTokenURI(string memory _tokenURI) public onlyOwner { baseTokenURI = _tokenURI; } function setNameSymbol( string memory _name, string memory _symbol ) public onlyOwner { _setNameSymbol(_name, _symbol); } uint slots = deckSize; mapping(uint=>uint) slot; mapping(uint=>bool) usedSlot; mapping(uint=>uint) public card_used_by_ID; event MintExtended(address indexed to, uint indexed card); function _mint(address to) internal override { super._mint(to); uint id = this.minted(); uint slotID = uint(keccak256(abi.encodePacked(id,blockhash(block.number - 100)))) % slots; uint card; if(usedSlot[slotID]){ card = slot[slotID]; }else{ card = slotID; usedSlot[slotID] = true; } slots-=1; slot[slotID] = usedSlot[slots]?slot[slots]:slots; usedSlot[slots] = true; card_used_by_ID[id] = card; emit MintExtended(to,card); } function _burn(address from) internal override { uint id = getLastOwnedTokenId(from); slot[slots] = card_used_by_ID[id]; slots+=1; super._burn(from); } function deck()public view returns(uint[] memory slot_cardIDs,bool[] memory slotsUsed){ slot_cardIDs = new uint[](slots); slotsUsed = new bool[](slots); for(uint i;i<slots;i++){ slot_cardIDs[i] = usedSlot[i]?slot[i]:i; slotsUsed[i] = usedSlot[i]; } } function tokenURI(uint256 id) public view override returns (string memory) { if (bytes(baseTokenURI).length > 0) { return string.concat(baseTokenURI, Strings.toString(card_used_by_ID[id]) ); } else { return string.concat( "data:application/json;utf8,", json(id) ); } } function json(uint256 id) public view returns(string memory){ uint cardID = card_used_by_ID[id]; string memory _cardID = Strings.toString( cardID ); string[] memory attributes = new string[](20); attributes[0] = "Strength"; attributes[1] = "Dexterity"; attributes[2] = "Constitution"; attributes[3] = "Intelligence"; attributes[4] = "Wisdom"; attributes[5] = "Charisma"; attributes[6] = "Speed"; attributes[7] = "Luck"; attributes[8] = "Armor Class"; attributes[9] = "Hit Points"; attributes[10] = "Courage"; attributes[11] = "Moral Alignment"; attributes[12] = "Ambition"; attributes[13] = "Sense of Humor"; attributes[14] = "Loyalty"; attributes[15] = "Adventurousness"; attributes[16] = "Discipline"; attributes[17] = "Curiosity"; attributes[18] = "Resilience"; attributes[19] = "Creativity"; string memory attrString = ''; string memory _str = ''; string memory _str2 = ''; string memory _str3 = ''; uint stat; uint batchBonus; // Iterate through the attributes array and concatenate two strings at a time for (uint256 i = 0; i < attributes.length; i += 1){ //Batch Bonus & Rare stat rolls batchBonus = Math.sqrt(uint(keccak256(abi.encodePacked( "Never Gonna Give You Up",cardID,i)))% (cardID<339?80000:160000)); stat = 20 - Math.sqrt(uint(keccak256(abi.encodePacked( "Decentralized Public Infrastructure."/*rng seed*/, cardID/*unique to each card in deck*/, i/*to differentiate on each attribute*/))) % (400-batchBonus) ); _str = string.concat(i==0?'':',', '{"trait_type":"'); _str2 = string.concat(attributes[i], '","value":'); _str3 = string.concat( Strings.toString(stat), '}'); attrString = string.concat(attrString, string.concat(_str, string.concat(_str2, _str3) ) ); } string memory jsonPreImage = string.concat( string.concat( string.concat('{"name": "XBOX404 #', string.concat( _cardID, string.concat('", "id":', Strings.toString(id) ) ) ), ',"description":"$XBOX is another type of magicbox project similar to #Pandora. It also adopts the recently popular ERC404 protocol. A total of 100 XBOX boxes means 100 surprises for this crypto world.","external_url":"https://xbox404.com/","image":"' ), string.concat(dataURI, _cardID) ); string memory jsonPostImage = string.concat( '.mp4","attributes":[',attrString ); jsonPostImage = string.concat( jsonPostImage, ']}' ); return string.concat(jsonPreImage,jsonPostImage); } function gallery(address addr) public view returns(string memory galleryJson ){ galleryJson = '['; uint[] memory IDs = getOwnedTokens(addr); for(uint i;i<IDs.length;i++){ galleryJson = string.concat(galleryJson,json(IDs[i]) ); if(i!=IDs.length-1){ galleryJson = string.concat(galleryJson,','); } } galleryJson = string.concat(galleryJson,']'); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"card","type":"uint256"}],"name":"MintExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"card_used_by_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deck","outputs":[{"internalType":"uint256[]","name":"slot_cardIDs","type":"uint256[]"},{"internalType":"bool[]","name":"slotsUsed","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"gallery","outputs":[{"internalType":"string","name":"galleryJson","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"json","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","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":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040526064600e55600e54600f553480156200001b575f80fd5b50604080518082018252600780825266161093d60d0c0d60ca1b6020808401829052845180860190955291845290830152600e5490919060129033808062000076576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001620000cc868262000232565b506002620000db858262000232565b5060ff83166080819052620000f290600a6200040d565b620000fe908362000424565b60a0526200010e81600162000140565b5050505050600e54670de0b6b3a76400006200012b919062000424565b335f908152600460205260409020556200043e565b5f546001600160a01b031633146200016a576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620001bd57607f821691505b602082108103620001dc57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200022d57805f5260205f20601f840160051c81016020851015620002095750805b601f840160051c820191505b818110156200022a575f815560010162000215565b50505b505050565b81516001600160401b038111156200024e576200024e62000194565b62000266816200025f8454620001a8565b84620001e2565b602080601f8311600181146200029c575f8415620002845750858301515b5f19600386901b1c1916600185901b178555620002f6565b5f85815260208120601f198616915b82811015620002cc57888601518255948401946001909101908401620002ab565b5085821015620002ea57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200035257815f1904821115620003365762000336620002fe565b808516156200034457918102915b93841c939080029062000317565b509250929050565b5f826200036a5750600162000407565b816200037857505f62000407565b81600181146200039157600281146200039c57620003bc565b600191505062000407565b60ff841115620003b057620003b0620002fe565b50506001821b62000407565b5060208310610133831016604e8410600b8410161715620003e1575081810a62000407565b620003ed838362000312565b805f1904821115620004035762000403620002fe565b0290505b92915050565b5f6200041d60ff8416836200035a565b9392505050565b8082028115828204841417620004075762000407620002fe565b60805160a051612f77620004675f395f61027101525f81816102d60152611a560152612f775ff3fe608060405234801561000f575f80fd5b50600436106101e7575f3560e01c80638da5cb5b11610109578063c87b56dd1161009e578063e0df5b6f1161006e578063e0df5b6f1461049b578063e985e9c5146104ae578063f28ca1dd146104db578063f2fde38b146104e3575f80fd5b8063c87b56dd14610443578063d547cfb714610456578063d57d56af1461045e578063dd62ed3e14610471575f80fd5b8063a22cb465116100d9578063a22cb46514610402578063a9059cbb14610415578063b88d4fde14610428578063b923b2051461043b575f80fd5b80638da5cb5b146103a75780638ed8d032146103b957806395d89b41146103d85780639b19251a146103e0575f80fd5b806342842e0e1161017f5780636352211e1161014f5780636352211e1461034c57806365c3175b1461035f57806370a082311461037557806374e18e9614610394575f80fd5b806342842e0e1461030a5780634f02c4201461031d578063504334c21461032657806353d6fd5914610339575f80fd5b806318d217c3116101ba57806318d217c3146102a157806323b872dd146102b65780632b968958146102c9578063313ce567146102d1575f80fd5b806306fdde03146101eb578063081812fc14610209578063095ea7b31461024957806318160ddd1461026c575b5f80fd5b6101f36104f6565b6040516102009190612496565b60405180910390f35b6102316102173660046124c8565b60066020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610200565b61025c6102573660046124f5565b610582565b6040519015158152602001610200565b6102937f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610200565b6102b46102af3660046125ba565b6106cd565b005b6102b46102c43660046125f4565b610706565b6102b4610a82565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610200565b6102b46103183660046125f4565b610ae6565b61029360035481565b6102b461033436600461262d565b610bb7565b6102b461034736600461268d565b610bea565b61023161035a3660046124c8565b610c3d565b610367610c77565b6040516102009291906126c6565b610293610383366004612741565b60046020525f908152604090205481565b6101f36103a23660046124c8565b610da4565b5f54610231906001600160a01b031681565b6102936103c73660046124c8565b60126020525f908152604090205481565b6101f361169d565b61025c6103ee366004612741565b600b6020525f908152604090205460ff1681565b6102b461041036600461268d565b6116aa565b61025c6104233660046124f5565b611715565b6102b461043636600461275a565b611728565b6102b46117e8565b6101f36104513660046124c8565b611819565b6101f361188b565b6101f361046c366004612741565b611898565b61029361047f3660046127ed565b600560209081525f928352604080842090915290825290205481565b6102b46104a93660046125ba565b611974565b61025c6104bc3660046127ed565b600760209081525f928352604080842090915290825290205460ff1681565b6101f36119a9565b6102b46104f1366004612741565b6119b6565b600180546105039061281e565b80601f016020809104026020016040519081016040528092919081815260200182805461052f9061281e565b801561057a5780601f106105515761010080835404028352916020019161057a565b820191905f5260205f20905b81548152906001019060200180831161055d57829003601f168201915b505050505081565b5f600354821115801561059457505f82115b15610668575f828152600860205260409020546001600160a01b03163381148015906105e357506001600160a01b0381165f90815260076020908152604080832033845290915290205460ff16155b15610600576040516282b42960e81b815260040160405180910390fd5b5f8381526006602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506106c3565b335f8181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b5f546001600160a01b031633146106f6576040516282b42960e81b815260040160405180910390fd5b600c610702828261289a565b5050565b6003548111610a16575f818152600860205260409020546001600160a01b0384811691161461074857604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b03821661076f57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b038416148015906107ab57506001600160a01b0383165f90815260076020908152604080832033845290915290205460ff16155b80156107cd57505f818152600660205260409020546001600160a01b03163314155b156107ea576040516282b42960e81b815260040160405180910390fd5b6107f2611a50565b6001600160a01b0384165f908152600460205260408120805490919061081990849061296e565b909155506108279050611a50565b6001600160a01b038084165f81815260046020908152604080832080549096019095558582526008815284822080546001600160a01b0319908116909417905560068152848220805490931690925591861682526009905290812080546108909060019061296e565b815481106108a0576108a0612981565b5f9182526020808320909101546001600160a01b0387168352600982526040808420868552600a909352909220548154929350839281106108e3576108e3612981565b5f9182526020808320909101929092556001600160a01b038616815260099091526040902080548061091757610917612995565b5f828152602080822083015f19908101839055909201909255838252600a8152604080832054848452818420556001600160a01b038616808452600983529083208054600181810183558286529385200186905592529054610979919061296e565b5f838152600a602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876109ff611a50565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526005602090815260408083203384529091529020545f198114610a6f57610a4b828261296e565b6001600160a01b0385165f9081526005602090815260408083203384529091529020555b610a7a848484611a81565b50505b505050565b5f546001600160a01b03163314610aab576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610af1838383610706565b6001600160a01b0382163b15801590610b995750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610b68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8c91906129a9565b6001600160e01b03191614155b15610a7d57604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610be0576040516282b42960e81b815260040160405180910390fd5b6107028282611c26565b5f546001600160a01b03163314610c13576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f818152600860205260409020546001600160a01b031680610c725760405163c5723b5160e01b815260040160405180910390fd5b919050565b606080600f5467ffffffffffffffff811115610c9557610c9561251d565b604051908082528060200260200182016040528015610cbe578160200160208202803683370190505b509150600f5467ffffffffffffffff811115610cdc57610cdc61251d565b604051908082528060200260200182016040528015610d05578160200160208202803683370190505b5090505f5b600f54811015610d9f575f8181526011602052604090205460ff16610d2f5780610d3e565b5f818152601060205260409020545b838281518110610d5057610d50612981565b6020908102919091018101919091525f82815260119091526040902054825160ff90911690839083908110610d8757610d87612981565b91151560209283029190910190910152600101610d0a565b509091565b5f81815260126020526040812054606091610dbe82611c3f565b6040805160148082526102a082019092529192505f9190816020015b6060815260200190600190039081610dda579050509050604051806040016040528060088152602001670a6e8e4cadccee8d60c31b815250815f81518110610e2457610e24612981565b60200260200101819052506040518060400160405280600981526020016844657874657269747960b81b81525081600181518110610e6457610e64612981565b60200260200101819052506040518060400160405280600c81526020016b21b7b739ba34ba3aba34b7b760a11b81525081600281518110610ea757610ea7612981565b60200260200101819052506040518060400160405280600c81526020016b496e74656c6c6967656e636560a01b81525081600381518110610eea57610eea612981565b602002602001018190525060405180604001604052806006815260200165576973646f6d60d01b81525081600481518110610f2757610f27612981565b6020026020010181905250604051806040016040528060088152602001674368617269736d6160c01b81525081600581518110610f6657610f66612981565b60200260200101819052506040518060400160405280600581526020016414dc19595960da1b81525081600681518110610fa257610fa2612981565b6020026020010181905250604051806040016040528060048152602001634c75636b60e01b81525081600781518110610fdd57610fdd612981565b60200260200101819052506040518060400160405280600b81526020016a41726d6f7220436c61737360a81b8152508160088151811061101f5761101f612981565b60200260200101819052506040518060400160405280600a81526020016948697420506f696e747360b01b8152508160098151811061106057611060612981565b602002602001018190525060405180604001604052806007815260200166436f757261676560c81b81525081600a8151811061109e5761109e612981565b60200260200101819052506040518060400160405280600f81526020016e135bdc985b08105b1a59db9b595b9d608a1b81525081600b815181106110e4576110e4612981565b60200260200101819052506040518060400160405280600881526020016720b6b134ba34b7b760c11b81525081600c8151811061112357611123612981565b60200260200101819052506040518060400160405280600e81526020016d29b2b739b29037b310243ab6b7b960911b81525081600d8151811061116857611168612981565b6020026020010181905250604051806040016040528060078152602001664c6f79616c747960c81b81525081600e815181106111a6576111a6612981565b60200260200101819052506040518060400160405280600f81526020016e416476656e7475726f75736e65737360881b81525081600f815181106111ec576111ec612981565b60200260200101819052506040518060400160405280600a8152602001694469736369706c696e6560b01b8152508160108151811061122d5761122d612981565b602002602001018190525060405180604001604052806009815260200168437572696f7369747960b81b8152508160118151811061126d5761126d612981565b60200260200101819052506040518060400160405280600a815260200169526573696c69656e636560b01b815250816012815181106112ae576112ae612981565b60200260200101819052506040518060400160405280600a8152602001694372656174697669747960b01b815250816013815181106112ef576112ef612981565b6020908102919091018101919091526040805180830182525f8082528251808501845281815283518086018552828152845195860190945281855291939192919080805b875181101561155e576113c16101538b106113515762027100611356565b620138805b6040517f4e6576657220476f6e6e61204769766520596f752055700000000000000000006020820152603781018d90526057810184905262ffffff91909116906077015b604051602081830303815290604052805190602001205f1c6113bc91906129e4565b611ccf565b91506114216113d28361019061296e565b604080517f446563656e7472616c697a6564205075626c696320496e6672617374727563746020820152633ab9329760e11b91810191909152604481018d90526064810184905260840161139a565b61142c90601461296e565b9250801561145357604051806040016040528060018152602001600b60fa1b815250611463565b60405180602001604052805f8152505b60405160200161147391906129f7565b604051602081830303815290604052955087818151811061149657611496612981565b60200260200101516040516020016114ae9190612a29565b60405160208183030381529060405294506114c883611c3f565b6040516020016114d89190612a56565b6040516020818303038152906040529350868686866040516020016114fe929190612a7a565b60408051601f198184030181529082905261151c9291602001612a7a565b60408051601f198184030181529082905261153a9291602001612a7a565b60408051601f198184030181529190529650611557600182612aa8565b9050611333565b505f8861156a8d611c3f565b60405160200161157a9190612abb565b60408051601f19818403018152908290526115989291602001612a7a565b60408051601f19818403018152908290526115b591602001612aeb565b60408051601f19818403018152908290526115d291602001612b26565b604051602081830303815290604052600c8a6040516020016115f5929190612c70565b60408051601f19818403018152908290526116139291602001612a7a565b60405160208183030381529060405290505f876040516020016116369190612cea565b6040516020818303038152906040529050806040516020016116589190612d26565b6040516020818303038152906040529050818160405160200161167c929190612a7a565b6040516020818303038152906040529b505050505050505050505050919050565b600280546105039061281e565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f611721338484611a81565b9392505050565b611733858585610706565b6001600160a01b0384163b158015906117ca5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a029061177d9033908a90899089908990600401612d4b565b6020604051808303815f875af1158015611799573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117bd91906129a9565b6001600160e01b03191614155b15610a7a57604051633da6393160e01b815260040160405180910390fd5b335f90815260046020526040812054900361181757335f908152600b60205260409020805460ff191660011790555b565b60605f600d80546118299061281e565b90501115611872575f82815260126020526040902054600d9061184b90611c3f565b60405160200161185c929190612c70565b6040516020818303038152906040529050919050565b61187b82610da4565b60405160200161185c9190612d9d565b600d80546105039061281e565b6040805180820190915260018152605b60f81b60208201525f6118ba83611db3565b90505f5b815181101561194b57826118ea8383815181106118dd576118dd612981565b6020026020010151610da4565b6040516020016118fb929190612a7a565b60405160208183030381529060405292506001825161191a919061296e565b811461194357826040516020016119319190612de1565b60405160208183030381529060405292505b6001016118be565b508160405160200161195d9190612e05565b604051602081830303815290604052915050919050565b5f546001600160a01b0316331461199d576040516282b42960e81b815260040160405180910390fd5b600d610702828261289a565b600c80546105039061281e565b5f546001600160a01b031633146119df576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116611a06576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f611a7c7f0000000000000000000000000000000000000000000000000000000000000000600a612f09565b905090565b5f80611a8b611a50565b6001600160a01b038087165f818152600460205260408082208054948a1683529082205492825293945091929091869190611ac6838661296e565b90915550506001600160a01b038087165f90815260046020908152604080832080548a019055928a168252600b9052205460ff16611b55576001600160a01b0387165f90815260046020526040812054611b21908590612f17565b611b2b8585612f17565b611b35919061296e565b90505f5b81811015611b5257611b4a89611e1c565b600101611b39565b50505b6001600160a01b0386165f908152600b602052604090205460ff16611bcc575f611b7f8483612f17565b6001600160a01b0388165f90815260046020526040902054611ba2908690612f17565b611bac919061296e565b90505f5b81811015611bc957611bc188611e6b565b600101611bb0565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148787604051611c1191815260200190565b60405180910390a35060019695505050505050565b6001611c32838261289a565b506002610a7d828261289a565b60605f611c4b83612029565b60010190505f8167ffffffffffffffff811115611c6a57611c6a61251d565b6040519080825280601f01601f191660200182016040528015611c94576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c9e57509392505050565b5f815f03611cde57505f919050565b5f6001611cea84612100565b901c6001901b90506001818481611d0357611d036129d0565b048201901c90506001818481611d1b57611d1b6129d0565b048201901c90506001818481611d3357611d336129d0565b048201901c90506001818481611d4b57611d4b6129d0565b048201901c90506001818481611d6357611d636129d0565b048201901c90506001818481611d7b57611d7b6129d0565b048201901c90506001818481611d9357611d936129d0565b048201901c905061172181828581611dad57611dad6129d0565b04612193565b6001600160a01b0381165f90815260096020908152604091829020805483518184028101840190945280845260609392830182828015611e1057602002820191905f5260205f20905b815481526020019060010190808311611dfc575b50505050509050919050565b5f611e26826121a8565b5f81815260126020908152604080832054600f805485526010909352908320558054929350600192909190611e5c908490612aa8565b9091555061070290508261224b565b611e748161236c565b5f306001600160a01b0316634f02c4206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611eb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ed59190612f2a565b90505f600f5482606443611ee9919061296e565b40604051602001611f04929190918252602082015260400190565b604051602081830303815290604052805190602001205f1c611f2691906129e4565b5f818152601160205260408120549192509060ff1615611f5457505f81815260106020526040902054611f6f565b505f818152601160205260409020805460ff19166001179055805b6001600f5f828254611f81919061296e565b9091555050600f545f9081526011602052604090205460ff16611fa657600f54611fb8565b600f545f908152601060205260409020545b5f83815260106020908152604080832093909355600f54825260118152828220805460ff1916600117905585825260129052818120839055905182916001600160a01b038716917f792daa4b2623ba70e38af40290b50417d8a1620a7deee03ad74ed721bf9c897f9190a350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106120675772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612093576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106120b157662386f26fc10000830492506010015b6305f5e10083106120c9576305f5e100830492506008015b61271083106120dd57612710830492506004015b606483106120ef576064830492506002015b600a83106106c75760010192915050565b5f80608083901c1561211457608092831c92015b604083901c1561212657604092831c92015b602083901c1561213857602092831c92015b601083901c1561214a57601092831c92015b600883901c1561215c57600892831c92015b600483901c1561216e57600492831c92015b600283901c1561218057600292831c92015b600183901c156106c75760010192915050565b5f8183106121a15781611721565b5090919050565b6001600160a01b0381165f908152600960205260408120546122065760405162461bcd60e51b81526020600482015260136024820152724f776e657220686173206e6f20746f6b656e7360681b604482015260640160405180910390fd5b6001600160a01b0382165f908152600960205260409020805461222b9060019061296e565b8154811061223b5761223b612981565b905f5260205f2001549050919050565b6001600160a01b03811661227257604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f90815260096020526040812080546122979060019061296e565b815481106122a7576122a7612981565b905f5260205f200154905060095f836001600160a01b03166001600160a01b031681526020019081526020015f208054806122e4576122e4612995565b5f828152602080822083015f19908101839055909201909255828252600a815260408083208390556008825280832080546001600160a01b031990811690915560069092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b03811661239357604051634e46966960e11b815260040160405180910390fd5b60038054600101908190555f818152600860205260409020546001600160a01b0316156123d35760405163119b4fd360e11b815260040160405180910390fd5b5f81815260086020908152604080832080546001600160a01b0319166001600160a01b03871690811790915580845260098352908320805460018181018355828652938520018590559252905461242a919061296e565b5f828152600a602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f5b8381101561248e578181015183820152602001612476565b50505f910152565b602081525f82518060208401526124b4816040850160208701612474565b601f01601f19169190910160400192915050565b5f602082840312156124d8575f80fd5b5035919050565b80356001600160a01b0381168114610c72575f80fd5b5f8060408385031215612506575f80fd5b61250f836124df565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612540575f80fd5b813567ffffffffffffffff8082111561255b5761255b61251d565b604051601f8301601f19908116603f011681019082821181831017156125835761258361251d565b8160405283815286602085880101111561259b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f602082840312156125ca575f80fd5b813567ffffffffffffffff8111156125e0575f80fd5b6125ec84828501612531565b949350505050565b5f805f60608486031215612606575f80fd5b61260f846124df565b925061261d602085016124df565b9150604084013590509250925092565b5f806040838503121561263e575f80fd5b823567ffffffffffffffff80821115612655575f80fd5b61266186838701612531565b93506020850135915080821115612676575f80fd5b5061268385828601612531565b9150509250929050565b5f806040838503121561269e575f80fd5b6126a7836124df565b9150602083013580151581146126bb575f80fd5b809150509250929050565b604080825283519082018190525f906020906060840190828701845b828110156126fe578151845292840192908401906001016126e2565b505050838103828501528451808252858301918301905f5b81811015612734578351151583529284019291840191600101612716565b5090979650505050505050565b5f60208284031215612751575f80fd5b611721826124df565b5f805f805f6080868803121561276e575f80fd5b612777866124df565b9450612785602087016124df565b935060408601359250606086013567ffffffffffffffff808211156127a8575f80fd5b818801915088601f8301126127bb575f80fd5b8135818111156127c9575f80fd5b8960208285010111156127da575f80fd5b9699959850939650602001949392505050565b5f80604083850312156127fe575f80fd5b612807836124df565b9150612815602084016124df565b90509250929050565b600181811c9082168061283257607f821691505b60208210810361285057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a7d57805f5260205f20601f840160051c8101602085101561287b5750805b601f840160051c820191505b81811015610a7a575f8155600101612887565b815167ffffffffffffffff8111156128b4576128b461251d565b6128c8816128c2845461281e565b84612856565b602080601f8311600181146128fb575f84156128e45750858301515b5f19600386901b1c1916600185901b178555612952565b5f85815260208120601f198616915b828110156129295788860151825594840194600190910190840161290a565b508582101561294657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156106c7576106c761295a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f602082840312156129b9575f80fd5b81516001600160e01b031981168114611721575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f826129f2576129f26129d0565b500690565b5f8251612a08818460208701612474565b6e3d913a3930b4ba2fba3cb832911d1160891b920191825250600f01919050565b5f8251612a3a818460208701612474565b691116113b30b63ab2911d60b11b920191825250600a01919050565b5f8251612a67818460208701612474565b607d60f81b920191825250600101919050565b5f8351612a8b818460208801612474565b835190830190612a9f818360208801612474565b01949350505050565b808201808211156106c7576106c761295a565b671116101134b2111d60c11b815281515f90612ade816008850160208701612474565b9190910160080192915050565b727b226e616d65223a202258424f58343034202360681b815281515f90612b19816013850160208701612474565b9190910160130192915050565b5f8251612b37818460208701612474565b7f2c226465736372697074696f6e223a222458424f5820697320616e6f746865729201918252507f2074797065206f66206d61676963626f782070726f6a6563742073696d696c6160208201527f7220746f202350616e646f72612e20497420616c736f2061646f70747320746860408201527f6520726563656e746c7920706f70756c6172204552433430342070726f746f6360608201527f6f6c2e204120746f74616c206f66203130302058424f5820626f786573206d6560808201527f616e73203130302073757270726973657320666f72207468697320637279707460a08201527f6f20776f726c642e222c2265787465726e616c5f75726c223a2268747470733a60c08201527f2f2f78626f783430342e636f6d2f222c22696d616765223a220000000000000060e082015260f901919050565b5f808454612c7d8161281e565b60018281168015612c955760018114612caa57612cd6565b60ff1984168752821515830287019450612cd6565b885f526020805f205f5b85811015612ccd5781548a820152908401908201612cb4565b50505082870194505b505050508351612a9f818360208801612474565b732e6d7034222c2261747472696275746573223a5b60601b815281515f90612d19816014850160208701612474565b9190910160140192915050565b5f8251612d37818460208701612474565b615d7d60f01b920191825250600201919050565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081525f8251612dd481601b850160208701612474565b91909101601b0192915050565b5f8251612df2818460208701612474565b600b60fa1b920191825250600101919050565b5f8251612e16818460208701612474565b605d60f81b920191825250600101919050565b600181815b80851115612e6357815f1904821115612e4957612e4961295a565b80851615612e5657918102915b93841c9390800290612e2e565b509250929050565b5f82612e79575060016106c7565b81612e8557505f6106c7565b8160018114612e9b5760028114612ea557612ec1565b60019150506106c7565b60ff841115612eb657612eb661295a565b50506001821b6106c7565b5060208310610133831016604e8410600b8410161715612ee4575081810a6106c7565b612eee8383612e29565b805f1904821115612f0157612f0161295a565b029392505050565b5f61172160ff841683612e6b565b5f82612f2557612f256129d0565b500490565b5f60208284031215612f3a575f80fd5b505191905056fea2646970667358221220e9ac73089a0c37d5e1d24dd605f5cbe40c7d3683eb97d7f8c0dc1844db0c7b3c64736f6c63430008180033
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101e7575f3560e01c80638da5cb5b11610109578063c87b56dd1161009e578063e0df5b6f1161006e578063e0df5b6f1461049b578063e985e9c5146104ae578063f28ca1dd146104db578063f2fde38b146104e3575f80fd5b8063c87b56dd14610443578063d547cfb714610456578063d57d56af1461045e578063dd62ed3e14610471575f80fd5b8063a22cb465116100d9578063a22cb46514610402578063a9059cbb14610415578063b88d4fde14610428578063b923b2051461043b575f80fd5b80638da5cb5b146103a75780638ed8d032146103b957806395d89b41146103d85780639b19251a146103e0575f80fd5b806342842e0e1161017f5780636352211e1161014f5780636352211e1461034c57806365c3175b1461035f57806370a082311461037557806374e18e9614610394575f80fd5b806342842e0e1461030a5780634f02c4201461031d578063504334c21461032657806353d6fd5914610339575f80fd5b806318d217c3116101ba57806318d217c3146102a157806323b872dd146102b65780632b968958146102c9578063313ce567146102d1575f80fd5b806306fdde03146101eb578063081812fc14610209578063095ea7b31461024957806318160ddd1461026c575b5f80fd5b6101f36104f6565b6040516102009190612496565b60405180910390f35b6102316102173660046124c8565b60066020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610200565b61025c6102573660046124f5565b610582565b6040519015158152602001610200565b6102937f0000000000000000000000000000000000000000000000056bc75e2d6310000081565b604051908152602001610200565b6102b46102af3660046125ba565b6106cd565b005b6102b46102c43660046125f4565b610706565b6102b4610a82565b6102f87f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610200565b6102b46103183660046125f4565b610ae6565b61029360035481565b6102b461033436600461262d565b610bb7565b6102b461034736600461268d565b610bea565b61023161035a3660046124c8565b610c3d565b610367610c77565b6040516102009291906126c6565b610293610383366004612741565b60046020525f908152604090205481565b6101f36103a23660046124c8565b610da4565b5f54610231906001600160a01b031681565b6102936103c73660046124c8565b60126020525f908152604090205481565b6101f361169d565b61025c6103ee366004612741565b600b6020525f908152604090205460ff1681565b6102b461041036600461268d565b6116aa565b61025c6104233660046124f5565b611715565b6102b461043636600461275a565b611728565b6102b46117e8565b6101f36104513660046124c8565b611819565b6101f361188b565b6101f361046c366004612741565b611898565b61029361047f3660046127ed565b600560209081525f928352604080842090915290825290205481565b6102b46104a93660046125ba565b611974565b61025c6104bc3660046127ed565b600760209081525f928352604080842090915290825290205460ff1681565b6101f36119a9565b6102b46104f1366004612741565b6119b6565b600180546105039061281e565b80601f016020809104026020016040519081016040528092919081815260200182805461052f9061281e565b801561057a5780601f106105515761010080835404028352916020019161057a565b820191905f5260205f20905b81548152906001019060200180831161055d57829003601f168201915b505050505081565b5f600354821115801561059457505f82115b15610668575f828152600860205260409020546001600160a01b03163381148015906105e357506001600160a01b0381165f90815260076020908152604080832033845290915290205460ff16155b15610600576040516282b42960e81b815260040160405180910390fd5b5f8381526006602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506106c3565b335f8181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b5f546001600160a01b031633146106f6576040516282b42960e81b815260040160405180910390fd5b600c610702828261289a565b5050565b6003548111610a16575f818152600860205260409020546001600160a01b0384811691161461074857604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b03821661076f57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b038416148015906107ab57506001600160a01b0383165f90815260076020908152604080832033845290915290205460ff16155b80156107cd57505f818152600660205260409020546001600160a01b03163314155b156107ea576040516282b42960e81b815260040160405180910390fd5b6107f2611a50565b6001600160a01b0384165f908152600460205260408120805490919061081990849061296e565b909155506108279050611a50565b6001600160a01b038084165f81815260046020908152604080832080549096019095558582526008815284822080546001600160a01b0319908116909417905560068152848220805490931690925591861682526009905290812080546108909060019061296e565b815481106108a0576108a0612981565b5f9182526020808320909101546001600160a01b0387168352600982526040808420868552600a909352909220548154929350839281106108e3576108e3612981565b5f9182526020808320909101929092556001600160a01b038616815260099091526040902080548061091757610917612995565b5f828152602080822083015f19908101839055909201909255838252600a8152604080832054848452818420556001600160a01b038616808452600983529083208054600181810183558286529385200186905592529054610979919061296e565b5f838152600a602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876109ff611a50565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526005602090815260408083203384529091529020545f198114610a6f57610a4b828261296e565b6001600160a01b0385165f9081526005602090815260408083203384529091529020555b610a7a848484611a81565b50505b505050565b5f546001600160a01b03163314610aab576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610af1838383610706565b6001600160a01b0382163b15801590610b995750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610b68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8c91906129a9565b6001600160e01b03191614155b15610a7d57604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610be0576040516282b42960e81b815260040160405180910390fd5b6107028282611c26565b5f546001600160a01b03163314610c13576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f818152600860205260409020546001600160a01b031680610c725760405163c5723b5160e01b815260040160405180910390fd5b919050565b606080600f5467ffffffffffffffff811115610c9557610c9561251d565b604051908082528060200260200182016040528015610cbe578160200160208202803683370190505b509150600f5467ffffffffffffffff811115610cdc57610cdc61251d565b604051908082528060200260200182016040528015610d05578160200160208202803683370190505b5090505f5b600f54811015610d9f575f8181526011602052604090205460ff16610d2f5780610d3e565b5f818152601060205260409020545b838281518110610d5057610d50612981565b6020908102919091018101919091525f82815260119091526040902054825160ff90911690839083908110610d8757610d87612981565b91151560209283029190910190910152600101610d0a565b509091565b5f81815260126020526040812054606091610dbe82611c3f565b6040805160148082526102a082019092529192505f9190816020015b6060815260200190600190039081610dda579050509050604051806040016040528060088152602001670a6e8e4cadccee8d60c31b815250815f81518110610e2457610e24612981565b60200260200101819052506040518060400160405280600981526020016844657874657269747960b81b81525081600181518110610e6457610e64612981565b60200260200101819052506040518060400160405280600c81526020016b21b7b739ba34ba3aba34b7b760a11b81525081600281518110610ea757610ea7612981565b60200260200101819052506040518060400160405280600c81526020016b496e74656c6c6967656e636560a01b81525081600381518110610eea57610eea612981565b602002602001018190525060405180604001604052806006815260200165576973646f6d60d01b81525081600481518110610f2757610f27612981565b6020026020010181905250604051806040016040528060088152602001674368617269736d6160c01b81525081600581518110610f6657610f66612981565b60200260200101819052506040518060400160405280600581526020016414dc19595960da1b81525081600681518110610fa257610fa2612981565b6020026020010181905250604051806040016040528060048152602001634c75636b60e01b81525081600781518110610fdd57610fdd612981565b60200260200101819052506040518060400160405280600b81526020016a41726d6f7220436c61737360a81b8152508160088151811061101f5761101f612981565b60200260200101819052506040518060400160405280600a81526020016948697420506f696e747360b01b8152508160098151811061106057611060612981565b602002602001018190525060405180604001604052806007815260200166436f757261676560c81b81525081600a8151811061109e5761109e612981565b60200260200101819052506040518060400160405280600f81526020016e135bdc985b08105b1a59db9b595b9d608a1b81525081600b815181106110e4576110e4612981565b60200260200101819052506040518060400160405280600881526020016720b6b134ba34b7b760c11b81525081600c8151811061112357611123612981565b60200260200101819052506040518060400160405280600e81526020016d29b2b739b29037b310243ab6b7b960911b81525081600d8151811061116857611168612981565b6020026020010181905250604051806040016040528060078152602001664c6f79616c747960c81b81525081600e815181106111a6576111a6612981565b60200260200101819052506040518060400160405280600f81526020016e416476656e7475726f75736e65737360881b81525081600f815181106111ec576111ec612981565b60200260200101819052506040518060400160405280600a8152602001694469736369706c696e6560b01b8152508160108151811061122d5761122d612981565b602002602001018190525060405180604001604052806009815260200168437572696f7369747960b81b8152508160118151811061126d5761126d612981565b60200260200101819052506040518060400160405280600a815260200169526573696c69656e636560b01b815250816012815181106112ae576112ae612981565b60200260200101819052506040518060400160405280600a8152602001694372656174697669747960b01b815250816013815181106112ef576112ef612981565b6020908102919091018101919091526040805180830182525f8082528251808501845281815283518086018552828152845195860190945281855291939192919080805b875181101561155e576113c16101538b106113515762027100611356565b620138805b6040517f4e6576657220476f6e6e61204769766520596f752055700000000000000000006020820152603781018d90526057810184905262ffffff91909116906077015b604051602081830303815290604052805190602001205f1c6113bc91906129e4565b611ccf565b91506114216113d28361019061296e565b604080517f446563656e7472616c697a6564205075626c696320496e6672617374727563746020820152633ab9329760e11b91810191909152604481018d90526064810184905260840161139a565b61142c90601461296e565b9250801561145357604051806040016040528060018152602001600b60fa1b815250611463565b60405180602001604052805f8152505b60405160200161147391906129f7565b604051602081830303815290604052955087818151811061149657611496612981565b60200260200101516040516020016114ae9190612a29565b60405160208183030381529060405294506114c883611c3f565b6040516020016114d89190612a56565b6040516020818303038152906040529350868686866040516020016114fe929190612a7a565b60408051601f198184030181529082905261151c9291602001612a7a565b60408051601f198184030181529082905261153a9291602001612a7a565b60408051601f198184030181529190529650611557600182612aa8565b9050611333565b505f8861156a8d611c3f565b60405160200161157a9190612abb565b60408051601f19818403018152908290526115989291602001612a7a565b60408051601f19818403018152908290526115b591602001612aeb565b60408051601f19818403018152908290526115d291602001612b26565b604051602081830303815290604052600c8a6040516020016115f5929190612c70565b60408051601f19818403018152908290526116139291602001612a7a565b60405160208183030381529060405290505f876040516020016116369190612cea565b6040516020818303038152906040529050806040516020016116589190612d26565b6040516020818303038152906040529050818160405160200161167c929190612a7a565b6040516020818303038152906040529b505050505050505050505050919050565b600280546105039061281e565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f611721338484611a81565b9392505050565b611733858585610706565b6001600160a01b0384163b158015906117ca5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a029061177d9033908a90899089908990600401612d4b565b6020604051808303815f875af1158015611799573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117bd91906129a9565b6001600160e01b03191614155b15610a7a57604051633da6393160e01b815260040160405180910390fd5b335f90815260046020526040812054900361181757335f908152600b60205260409020805460ff191660011790555b565b60605f600d80546118299061281e565b90501115611872575f82815260126020526040902054600d9061184b90611c3f565b60405160200161185c929190612c70565b6040516020818303038152906040529050919050565b61187b82610da4565b60405160200161185c9190612d9d565b600d80546105039061281e565b6040805180820190915260018152605b60f81b60208201525f6118ba83611db3565b90505f5b815181101561194b57826118ea8383815181106118dd576118dd612981565b6020026020010151610da4565b6040516020016118fb929190612a7a565b60405160208183030381529060405292506001825161191a919061296e565b811461194357826040516020016119319190612de1565b60405160208183030381529060405292505b6001016118be565b508160405160200161195d9190612e05565b604051602081830303815290604052915050919050565b5f546001600160a01b0316331461199d576040516282b42960e81b815260040160405180910390fd5b600d610702828261289a565b600c80546105039061281e565b5f546001600160a01b031633146119df576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116611a06576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f611a7c7f0000000000000000000000000000000000000000000000000000000000000012600a612f09565b905090565b5f80611a8b611a50565b6001600160a01b038087165f818152600460205260408082208054948a1683529082205492825293945091929091869190611ac6838661296e565b90915550506001600160a01b038087165f90815260046020908152604080832080548a019055928a168252600b9052205460ff16611b55576001600160a01b0387165f90815260046020526040812054611b21908590612f17565b611b2b8585612f17565b611b35919061296e565b90505f5b81811015611b5257611b4a89611e1c565b600101611b39565b50505b6001600160a01b0386165f908152600b602052604090205460ff16611bcc575f611b7f8483612f17565b6001600160a01b0388165f90815260046020526040902054611ba2908690612f17565b611bac919061296e565b90505f5b81811015611bc957611bc188611e6b565b600101611bb0565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148787604051611c1191815260200190565b60405180910390a35060019695505050505050565b6001611c32838261289a565b506002610a7d828261289a565b60605f611c4b83612029565b60010190505f8167ffffffffffffffff811115611c6a57611c6a61251d565b6040519080825280601f01601f191660200182016040528015611c94576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c9e57509392505050565b5f815f03611cde57505f919050565b5f6001611cea84612100565b901c6001901b90506001818481611d0357611d036129d0565b048201901c90506001818481611d1b57611d1b6129d0565b048201901c90506001818481611d3357611d336129d0565b048201901c90506001818481611d4b57611d4b6129d0565b048201901c90506001818481611d6357611d636129d0565b048201901c90506001818481611d7b57611d7b6129d0565b048201901c90506001818481611d9357611d936129d0565b048201901c905061172181828581611dad57611dad6129d0565b04612193565b6001600160a01b0381165f90815260096020908152604091829020805483518184028101840190945280845260609392830182828015611e1057602002820191905f5260205f20905b815481526020019060010190808311611dfc575b50505050509050919050565b5f611e26826121a8565b5f81815260126020908152604080832054600f805485526010909352908320558054929350600192909190611e5c908490612aa8565b9091555061070290508261224b565b611e748161236c565b5f306001600160a01b0316634f02c4206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611eb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ed59190612f2a565b90505f600f5482606443611ee9919061296e565b40604051602001611f04929190918252602082015260400190565b604051602081830303815290604052805190602001205f1c611f2691906129e4565b5f818152601160205260408120549192509060ff1615611f5457505f81815260106020526040902054611f6f565b505f818152601160205260409020805460ff19166001179055805b6001600f5f828254611f81919061296e565b9091555050600f545f9081526011602052604090205460ff16611fa657600f54611fb8565b600f545f908152601060205260409020545b5f83815260106020908152604080832093909355600f54825260118152828220805460ff1916600117905585825260129052818120839055905182916001600160a01b038716917f792daa4b2623ba70e38af40290b50417d8a1620a7deee03ad74ed721bf9c897f9190a350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106120675772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612093576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106120b157662386f26fc10000830492506010015b6305f5e10083106120c9576305f5e100830492506008015b61271083106120dd57612710830492506004015b606483106120ef576064830492506002015b600a83106106c75760010192915050565b5f80608083901c1561211457608092831c92015b604083901c1561212657604092831c92015b602083901c1561213857602092831c92015b601083901c1561214a57601092831c92015b600883901c1561215c57600892831c92015b600483901c1561216e57600492831c92015b600283901c1561218057600292831c92015b600183901c156106c75760010192915050565b5f8183106121a15781611721565b5090919050565b6001600160a01b0381165f908152600960205260408120546122065760405162461bcd60e51b81526020600482015260136024820152724f776e657220686173206e6f20746f6b656e7360681b604482015260640160405180910390fd5b6001600160a01b0382165f908152600960205260409020805461222b9060019061296e565b8154811061223b5761223b612981565b905f5260205f2001549050919050565b6001600160a01b03811661227257604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f90815260096020526040812080546122979060019061296e565b815481106122a7576122a7612981565b905f5260205f200154905060095f836001600160a01b03166001600160a01b031681526020019081526020015f208054806122e4576122e4612995565b5f828152602080822083015f19908101839055909201909255828252600a815260408083208390556008825280832080546001600160a01b031990811690915560069092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b03811661239357604051634e46966960e11b815260040160405180910390fd5b60038054600101908190555f818152600860205260409020546001600160a01b0316156123d35760405163119b4fd360e11b815260040160405180910390fd5b5f81815260086020908152604080832080546001600160a01b0319166001600160a01b03871690811790915580845260098352908320805460018181018355828652938520018590559252905461242a919061296e565b5f828152600a602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f5b8381101561248e578181015183820152602001612476565b50505f910152565b602081525f82518060208401526124b4816040850160208701612474565b601f01601f19169190910160400192915050565b5f602082840312156124d8575f80fd5b5035919050565b80356001600160a01b0381168114610c72575f80fd5b5f8060408385031215612506575f80fd5b61250f836124df565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612540575f80fd5b813567ffffffffffffffff8082111561255b5761255b61251d565b604051601f8301601f19908116603f011681019082821181831017156125835761258361251d565b8160405283815286602085880101111561259b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f602082840312156125ca575f80fd5b813567ffffffffffffffff8111156125e0575f80fd5b6125ec84828501612531565b949350505050565b5f805f60608486031215612606575f80fd5b61260f846124df565b925061261d602085016124df565b9150604084013590509250925092565b5f806040838503121561263e575f80fd5b823567ffffffffffffffff80821115612655575f80fd5b61266186838701612531565b93506020850135915080821115612676575f80fd5b5061268385828601612531565b9150509250929050565b5f806040838503121561269e575f80fd5b6126a7836124df565b9150602083013580151581146126bb575f80fd5b809150509250929050565b604080825283519082018190525f906020906060840190828701845b828110156126fe578151845292840192908401906001016126e2565b505050838103828501528451808252858301918301905f5b81811015612734578351151583529284019291840191600101612716565b5090979650505050505050565b5f60208284031215612751575f80fd5b611721826124df565b5f805f805f6080868803121561276e575f80fd5b612777866124df565b9450612785602087016124df565b935060408601359250606086013567ffffffffffffffff808211156127a8575f80fd5b818801915088601f8301126127bb575f80fd5b8135818111156127c9575f80fd5b8960208285010111156127da575f80fd5b9699959850939650602001949392505050565b5f80604083850312156127fe575f80fd5b612807836124df565b9150612815602084016124df565b90509250929050565b600181811c9082168061283257607f821691505b60208210810361285057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a7d57805f5260205f20601f840160051c8101602085101561287b5750805b601f840160051c820191505b81811015610a7a575f8155600101612887565b815167ffffffffffffffff8111156128b4576128b461251d565b6128c8816128c2845461281e565b84612856565b602080601f8311600181146128fb575f84156128e45750858301515b5f19600386901b1c1916600185901b178555612952565b5f85815260208120601f198616915b828110156129295788860151825594840194600190910190840161290a565b508582101561294657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156106c7576106c761295a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f602082840312156129b9575f80fd5b81516001600160e01b031981168114611721575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f826129f2576129f26129d0565b500690565b5f8251612a08818460208701612474565b6e3d913a3930b4ba2fba3cb832911d1160891b920191825250600f01919050565b5f8251612a3a818460208701612474565b691116113b30b63ab2911d60b11b920191825250600a01919050565b5f8251612a67818460208701612474565b607d60f81b920191825250600101919050565b5f8351612a8b818460208801612474565b835190830190612a9f818360208801612474565b01949350505050565b808201808211156106c7576106c761295a565b671116101134b2111d60c11b815281515f90612ade816008850160208701612474565b9190910160080192915050565b727b226e616d65223a202258424f58343034202360681b815281515f90612b19816013850160208701612474565b9190910160130192915050565b5f8251612b37818460208701612474565b7f2c226465736372697074696f6e223a222458424f5820697320616e6f746865729201918252507f2074797065206f66206d61676963626f782070726f6a6563742073696d696c6160208201527f7220746f202350616e646f72612e20497420616c736f2061646f70747320746860408201527f6520726563656e746c7920706f70756c6172204552433430342070726f746f6360608201527f6f6c2e204120746f74616c206f66203130302058424f5820626f786573206d6560808201527f616e73203130302073757270726973657320666f72207468697320637279707460a08201527f6f20776f726c642e222c2265787465726e616c5f75726c223a2268747470733a60c08201527f2f2f78626f783430342e636f6d2f222c22696d616765223a220000000000000060e082015260f901919050565b5f808454612c7d8161281e565b60018281168015612c955760018114612caa57612cd6565b60ff1984168752821515830287019450612cd6565b885f526020805f205f5b85811015612ccd5781548a820152908401908201612cb4565b50505082870194505b505050508351612a9f818360208801612474565b732e6d7034222c2261747472696275746573223a5b60601b815281515f90612d19816014850160208701612474565b9190910160140192915050565b5f8251612d37818460208701612474565b615d7d60f01b920191825250600201919050565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081525f8251612dd481601b850160208701612474565b91909101601b0192915050565b5f8251612df2818460208701612474565b600b60fa1b920191825250600101919050565b5f8251612e16818460208701612474565b605d60f81b920191825250600101919050565b600181815b80851115612e6357815f1904821115612e4957612e4961295a565b80851615612e5657918102915b93841c9390800290612e2e565b509250929050565b5f82612e79575060016106c7565b81612e8557505f6106c7565b8160018114612e9b5760028114612ea557612ec1565b60019150506106c7565b60ff841115612eb657612eb661295a565b50506001821b6106c7565b5060208310610133831016604e8410600b8410161715612ee4575081810a6106c7565b612eee8383612e29565b805f1904821115612f0157612f0161295a565b029392505050565b5f61172160ff841683612e6b565b5f82612f2557612f256129d0565b500490565b5f60208284031215612f3a575f80fd5b505191905056fea2646970667358221220e9ac73089a0c37d5e1d24dd605f5cbe40c7d3683eb97d7f8c0dc1844db0c7b3c64736f6c63430008180033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.