Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 50 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 19190541 | 747 days ago | IN | 0 ETH | 0.00346722 | ||||
| Approve | 19188835 | 748 days ago | IN | 0 ETH | 0.00241282 | ||||
| Approve | 19188101 | 748 days ago | IN | 0 ETH | 0.00324238 | ||||
| Approve | 19188092 | 748 days ago | IN | 0 ETH | 0.00281799 | ||||
| Approve | 19188088 | 748 days ago | IN | 0 ETH | 0.00313491 | ||||
| Approve | 19188085 | 748 days ago | IN | 0 ETH | 0.00254719 | ||||
| Approve | 19188082 | 748 days ago | IN | 0 ETH | 0.00156614 | ||||
| Approve | 19188081 | 748 days ago | IN | 0 ETH | 0.00276157 | ||||
| Set Whitelist | 19188070 | 748 days ago | IN | 0 ETH | 0.00305199 | ||||
| Set Whitelist | 19188069 | 748 days ago | IN | 0 ETH | 0.00291105 | ||||
| Approve | 19188057 | 748 days ago | IN | 0 ETH | 0.00361564 | ||||
| Approve | 19188055 | 748 days ago | IN | 0 ETH | 0.00343249 | ||||
| Approve | 19188054 | 748 days ago | IN | 0 ETH | 0.00409589 | ||||
| Approve | 19188050 | 748 days ago | IN | 0 ETH | 0.00362083 | ||||
| Approve | 19188047 | 748 days ago | IN | 0 ETH | 0.00378517 | ||||
| Approve | 19188044 | 748 days ago | IN | 0 ETH | 0.00403974 | ||||
| Approve | 19188043 | 748 days ago | IN | 0 ETH | 0.00402055 | ||||
| Approve | 19188042 | 748 days ago | IN | 0 ETH | 0.00411329 | ||||
| Approve | 19188040 | 748 days ago | IN | 0 ETH | 0.00441603 | ||||
| Approve | 19188039 | 748 days ago | IN | 0 ETH | 0.00426349 | ||||
| Approve | 19188037 | 748 days ago | IN | 0 ETH | 0.00417114 | ||||
| Approve | 19188037 | 748 days ago | IN | 0 ETH | 0.00426464 | ||||
| Approve | 19188036 | 748 days ago | IN | 0 ETH | 0.00401366 | ||||
| Approve | 19188034 | 748 days ago | IN | 0 ETH | 0.00409936 | ||||
| Approve | 19188034 | 748 days ago | IN | 0 ETH | 0.00434021 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
NOVA
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
/*
The first ERC-404 Onchain Galaxy PVP Game
Telegram: https://t.me/Nova404Portal
Twitter: https://x.com/novagamefi/
Medium: https://medium.com/@nova404
Website: https://nova404.com
*/
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
import "./ERC404.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
interface ISecondGen {
function lookup(uint256 id) external view returns (string memory);
}
contract NOVA is ERC404 {
string public dataURI;
string public baseTokenURI;
address public secondGen;
constructor(
) ERC404("Nova 404", "NOVA", 18, 10000, msg.sender) {
balanceOf[msg.sender] = 10000 * 10 ** 18;
}
function setDataURI(string memory _dataURI) public onlyOwner {
dataURI = _dataURI;
}
function setTokenURI(string memory _tokenURI) public onlyOwner {
baseTokenURI = _tokenURI;
}
function setSecondGen(address _secondGen) public onlyOwner {
secondGen = _secondGen;
}
function setNameSymbol(
string memory _name,
string memory _symbol
) public onlyOwner {
_setNameSymbol(_name, _symbol);
}
function tokenURI(uint256 id) public view override returns (string memory) {
if (secondGen != address(0)) return ISecondGen(secondGen).lookup(id);
if (bytes(baseTokenURI).length > 0) {
return string.concat(baseTokenURI, Strings.toString(id));
} else {
uint8 seed = uint8(bytes1(keccak256(abi.encodePacked(id))));
string memory image;
string memory color;
if (seed <= 100) {
image = "1.jpg";
color = "Red";
} else if (seed <= 160) {
image = "2.jpg";
color = "Purple";
} else if (seed <= 210) {
image = "3.jpg";
color = "Yellow";
} else if (seed <= 240) {
image = "4.jpg";
color = "Orange";
} else if (seed <= 255) {
image = "5.jpg";
color = "Blue";
}
string memory jsonPreImage = string.concat(
string.concat(
string.concat('{"name": "Nova Planet #', Strings.toString(id)),
'","description":"A collection of 10,000 Planets enabled by ERC404, an experimental token standard.","external_url":"https://nova404.com","image":"'
),
string.concat(dataURI, image)
);
string memory jsonPostImage = string.concat(
'","attributes":[{"trait_type":"Color","value":"',
color
);
string memory jsonPostTraits = '"}]}';
return
string.concat(
"data:application/json;utf8,",
string.concat(
string.concat(jsonPreImage, jsonPostImage),
jsonPostTraits
)
);
}
}
}// SPDX-License-Identifier: MIT
// 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;
}
}// SPDX-License-Identifier: MIT
// 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);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)
pragma solidity ^0.8.20;
import {Math} from "./math/Math.sol";
import {SignedMath} from "./math/SignedMath.sol";
/**
* @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));
}
}//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
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[]) internal _owned;
/// @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);
}
/// @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 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;
}
}{
"evmVersion": "paris",
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"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":"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":[],"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":[{"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":[],"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":[],"name":"secondGen","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"address","name":"_secondGen","type":"address"}],"name":"setSecondGen","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":"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
60c06040523480156200001157600080fd5b506040518060400160405280600881526020017f4e6f7661203430340000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e4f56410000000000000000000000000000000000000000000000000000000081525060126127103380600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000ec576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508460019081620001999190620004b2565b508360029081620001ab9190620004b2565b508260ff1660808160ff1681525050608051600a620001cb919062000729565b82620001d891906200077a565b60a08181525050505050505069021e19e0c9bab2400000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620007c5565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ba57607f821691505b602082108103620002d057620002cf62000272565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200033a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002fb565b620003468683620002fb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003936200038d62000387846200035e565b62000368565b6200035e565b9050919050565b6000819050919050565b620003af8362000372565b620003c7620003be826200039a565b84845462000308565b825550505050565b600090565b620003de620003cf565b620003eb818484620003a4565b505050565b5b81811015620004135762000407600082620003d4565b600181019050620003f1565b5050565b601f82111562000462576200042c81620002d6565b6200043784620002eb565b8101602085101562000447578190505b6200045f6200045685620002eb565b830182620003f0565b50505b505050565b600082821c905092915050565b6000620004876000198460080262000467565b1980831691505092915050565b6000620004a2838362000474565b9150826002028217905092915050565b620004bd8262000238565b67ffffffffffffffff811115620004d957620004d862000243565b5b620004e58254620002a1565b620004f282828562000417565b600060209050601f8311600181146200052a576000841562000515578287015190505b62000521858262000494565b86555062000591565b601f1984166200053a86620002d6565b60005b8281101562000564578489015182556001820191506020850194506020810190506200053d565b8683101562000584578489015162000580601f89168262000474565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200062757808604811115620005ff57620005fe62000599565b5b60018516156200060f5780820291505b80810290506200061f85620005c8565b9450620005df565b94509492505050565b60008262000642576001905062000715565b8162000652576000905062000715565b81600181146200066b57600281146200067657620006ac565b600191505062000715565b60ff8411156200068b576200068a62000599565b5b8360020a915084821115620006a557620006a462000599565b5b5062000715565b5060208310610133831016604e8410600b8410161715620006e65782820a905083811115620006e057620006df62000599565b5b62000715565b620006f58484846001620005d5565b925090508184048111156200070f576200070e62000599565b5b81810290505b9392505050565b600060ff82169050919050565b600062000736826200035e565b915062000743836200071c565b9250620007727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000630565b905092915050565b600062000787826200035e565b915062000794836200035e565b9250828202620007a4816200035e565b91508282048414831517620007be57620007bd62000599565b5b5092915050565b60805160a051614113620007f26000396000610970015260008181611386015261240501526141136000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063754ab64b11610104578063c87b56dd116100a2578063e985e9c511610071578063e985e9c51461052c578063f28ca1dd1461055c578063f2fde38b1461057a578063f5ad530b14610596576101cf565b8063c87b56dd14610492578063d547cfb7146104c2578063dd62ed3e146104e0578063e0df5b6f14610510576101cf565b80639b19251a116100de5780639b19251a146103fa578063a22cb4651461042a578063a9059cbb14610446578063b88d4fde14610476576101cf565b8063754ab64b146103a25780638da5cb5b146103be57806395d89b41146103dc576101cf565b8063313ce56711610171578063504334c21161014b578063504334c21461030a57806353d6fd59146103265780636352211e1461034257806370a0823114610372576101cf565b8063313ce567146102b257806342842e0e146102d05780634f02c420146102ec576101cf565b806318160ddd116101ad57806318160ddd1461025257806318d217c31461027057806323b872dd1461028c5780632b968958146102a8576101cf565b806306fdde03146101d4578063081812fc146101f2578063095ea7b314610222575b600080fd5b6101dc6105b4565b6040516101e99190612f67565b60405180910390f35b61020c60048036038101906102079190612fd3565b610642565b6040516102199190613041565b60405180910390f35b61023c60048036038101906102379190613088565b610675565b60405161024991906130e3565b60405180910390f35b61025a61096e565b604051610267919061310d565b60405180910390f35b61028a6004803603810190610285919061325d565b610992565b005b6102a660048036038101906102a191906132a6565b610a2a565b005b6102b0611261565b005b6102ba611384565b6040516102c79190613315565b60405180910390f35b6102ea60048036038101906102e591906132a6565b6113a8565b005b6102f46114db565b604051610301919061310d565b60405180910390f35b610324600480360381019061031f9190613330565b6114e1565b005b610340600480360381019061033b91906133d4565b611574565b005b61035c60048036038101906103579190612fd3565b611654565b6040516103699190613041565b60405180910390f35b61038c60048036038101906103879190613414565b6116f7565b604051610399919061310d565b60405180910390f35b6103bc60048036038101906103b79190613414565b61170f565b005b6103c66117d8565b6040516103d39190613041565b60405180910390f35b6103e46117fc565b6040516103f19190612f67565b60405180910390f35b610414600480360381019061040f9190613414565b61188a565b60405161042191906130e3565b60405180910390f35b610444600480360381019061043f91906133d4565b6118aa565b005b610460600480360381019061045b9190613088565b6119a7565b60405161046d91906130e3565b60405180910390f35b610490600480360381019061048b91906134a1565b6119bc565b005b6104ac60048036038101906104a79190612fd3565b611af5565b6040516104b99190612f67565b60405180910390f35b6104ca61204b565b6040516104d79190612f67565b60405180910390f35b6104fa60048036038101906104f59190613529565b6120d9565b604051610507919061310d565b60405180910390f35b61052a6004803603810190610525919061325d565b6120fe565b005b61054660048036038101906105419190613529565b612196565b60405161055391906130e3565b60405180910390f35b6105646121c5565b6040516105719190612f67565b60405180910390f35b610594600480360381019061058f9190613414565b612253565b005b61059e6123db565b6040516105ab9190613041565b60405180910390f35b600180546105c190613598565b80601f01602080910402602001604051908101604052809291908181526020018280546105ed90613598565b801561063a5780601f1061060f5761010080835404028352916020019161063a565b820191906000526020600020905b81548152906001019060200180831161061d57829003601f168201915b505050505081565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060035482111580156106895750600082115b1561087d5760006008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156107895750600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156107c0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836006600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161086f919061310d565b60405180910390a350610964565b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161095b919061310d565b60405180910390a35b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a17576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c9081610a269190613775565b5050565b6003548111611119576008600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610acb576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b31576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610bf45750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015610c5f57506006600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610c96576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c9e612401565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610cec9190613876565b92505081905550610cfb612401565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506006600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050610e5f9190613876565b81548110610e7057610e6f6138aa565b5b9060005260206000200154905080600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600a60008581526020019081526020016000205481548110610ee257610ee16138aa565b5b9060005260206000200181905550600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480610f3f57610f3e6138d9565b5b60019003818190600052602060002001600090559055600a600083815260200190815260200160002054600a600083815260200190815260200160002081905550600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150506001900390600052602060002001600090919091909150556001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506110359190613876565b600a600084815260200190815260200160002081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876110fe612401565b60405161110b919061310d565b60405180910390a35061125c565b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461124e5781816111cd9190613876565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b611259848484612435565b50505b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112e6576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000000081565b6113b3838383610a2a565b60008273ffffffffffffffffffffffffffffffffffffffff163b1415801561149f575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161143a9392919061393f565b6020604051808303816000875af1158015611459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147d91906139e1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156114d6576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60035481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611566576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61157082826127a0565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115f9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116f2576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60046020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611794576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002805461180990613598565b80601f016020809104026020016040519081016040528092919081815260200182805461183590613598565b80156118825780601f1061185757610100808354040283529160200191611882565b820191906000526020600020905b81548152906001019060200180831161186557829003601f168201915b505050505081565b600b6020528060005260406000206000915054906101000a900460ff1681565b80600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161199b91906130e3565b60405180910390a35050565b60006119b4338484612435565b905092915050565b6119c7858585610a2a565b60008473ffffffffffffffffffffffffffffffffffffffff163b14158015611ab7575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b8152600401611a52959493929190613a3b565b6020604051808303816000875af1158015611a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9591906139e1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611aee576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b6060600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bf557600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630a874df6836040518263ffffffff1660e01b8152600401611ba8919061310d565b600060405180830381865afa158015611bc5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bee9190613af9565b9050612046565b6000600d8054611c0490613598565b90501115611c3e57600d611c17836127c4565b604051602001611c28929190613c01565b6040516020818303038152906040529050612046565b600082604051602001611c519190613c46565b6040516020818303038152906040528051906020012060f81c905060608060648360ff1611611cef576040518060400160405280600581526020017f312e6a706700000000000000000000000000000000000000000000000000000081525091506040518060400160405280600381526020017f52656400000000000000000000000000000000000000000000000000000000008152509050611eef565b60a08360ff1611611d6f576040518060400160405280600581526020017f322e6a706700000000000000000000000000000000000000000000000000000081525091506040518060400160405280600681526020017f507572706c6500000000000000000000000000000000000000000000000000008152509050611eee565b60d28360ff1611611def576040518060400160405280600581526020017f332e6a706700000000000000000000000000000000000000000000000000000081525091506040518060400160405280600681526020017f59656c6c6f7700000000000000000000000000000000000000000000000000008152509050611eed565b60f08360ff1611611e6f576040518060400160405280600581526020017f342e6a706700000000000000000000000000000000000000000000000000000081525091506040518060400160405280600681526020017f4f72616e676500000000000000000000000000000000000000000000000000008152509050611eec565b60ff8360ff1611611eeb576040518060400160405280600581526020017f352e6a706700000000000000000000000000000000000000000000000000000081525091506040518060400160405280600481526020017f426c75650000000000000000000000000000000000000000000000000000000081525090505b5b5b5b5b6000611efa866127c4565b604051602001611f0a9190613c87565b604051602081830303815290604052604051602001611f299190613d91565b604051602081830303815290604052600c84604051602001611f4c929190613c01565b604051602081830303815290604052604051602001611f6c929190613db3565b6040516020818303038152906040529050600082604051602001611f909190613e49565b604051602081830303815290604052905060006040518060400160405280600481526020017f227d5d7d0000000000000000000000000000000000000000000000000000000081525090508282604051602001611fee929190613db3565b6040516020818303038152906040528160405160200161200f929190613db3565b60405160208183030381529060405260405160200161202e9190613e91565b60405160208183030381529060405296505050505050505b919050565b600d805461205890613598565b80601f016020809104026020016040519081016040528092919081815260200182805461208490613598565b80156120d15780601f106120a6576101008083540402835291602001916120d1565b820191906000526020600020905b8154815290600101906020018083116120b457829003601f168201915b505050505081565b6005602052816000526040600020602052806000526040600020600091509150505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612183576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d90816121929190613775565b5050565b60076020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600c80546121d290613598565b80601f01602080910402602001604051908101604052809291908181526020018280546121fe90613598565b801561224b5780601f106122205761010080835404028352916020019161224b565b820191906000526020600020905b81548152906001019060200180831161222e57829003601f168201915b505050505081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122d8576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361233e576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f0000000000000000000000000000000000000000000000000000000000000000600a6124309190613fea565b905090565b600080612440612401565b90506000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125199190613876565b9250508190555084600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661264d57600083600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260b9190614064565b84846126179190614064565b6126219190613876565b905060005b8181101561264a5761263789612892565b808061264290614095565b915050612626565b50505b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661272d57600083826126ac9190614064565b84600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126f79190614064565b6127019190613876565b905060005b8181101561272a5761271788612aee565b808061272290614095565b915050612706565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161278a919061310d565b60405180910390a3600193505050509392505050565b81600190816127af9190613775565b5080600290816127bf9190613775565b505050565b6060600060016127d384612d84565b01905060008167ffffffffffffffff8111156127f2576127f1613132565b5b6040519080825280601f01601f1916602001820160405280156128245781602001600182028036833780820191505090505b509050600082602001820190505b600115612887578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161287b5761287a614035565b5b04945060008503612832575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036128f8576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506129889190613876565b81548110612999576129986138aa565b5b90600052602060002001549050600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806129f5576129f46138d9565b5b60019003818190600052602060002001600090559055600a6000828152602001908152602001600020600090556008600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556006600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905580600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b54576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036000815480929190600101919050555060006003549050600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c06576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050612d0d9190613876565b600a600083815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612de2577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612dd857612dd7614035565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612e1f576d04ee2d6d415b85acef81000000008381612e1557612e14614035565b5b0492506020810190505b662386f26fc100008310612e4e57662386f26fc100008381612e4457612e43614035565b5b0492506010810190505b6305f5e1008310612e77576305f5e1008381612e6d57612e6c614035565b5b0492506008810190505b6127108310612e9c576127108381612e9257612e91614035565b5b0492506004810190505b60648310612ebf5760648381612eb557612eb4614035565b5b0492506002810190505b600a8310612ece576001810190505b80915050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f11578082015181840152602081019050612ef6565b60008484015250505050565b6000601f19601f8301169050919050565b6000612f3982612ed7565b612f438185612ee2565b9350612f53818560208601612ef3565b612f5c81612f1d565b840191505092915050565b60006020820190508181036000830152612f818184612f2e565b905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b612fb081612f9d565b8114612fbb57600080fd5b50565b600081359050612fcd81612fa7565b92915050565b600060208284031215612fe957612fe8612f93565b5b6000612ff784828501612fbe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061302b82613000565b9050919050565b61303b81613020565b82525050565b60006020820190506130566000830184613032565b92915050565b61306581613020565b811461307057600080fd5b50565b6000813590506130828161305c565b92915050565b6000806040838503121561309f5761309e612f93565b5b60006130ad85828601613073565b92505060206130be85828601612fbe565b9150509250929050565b60008115159050919050565b6130dd816130c8565b82525050565b60006020820190506130f860008301846130d4565b92915050565b61310781612f9d565b82525050565b600060208201905061312260008301846130fe565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61316a82612f1d565b810181811067ffffffffffffffff8211171561318957613188613132565b5b80604052505050565b600061319c612f89565b90506131a88282613161565b919050565b600067ffffffffffffffff8211156131c8576131c7613132565b5b6131d182612f1d565b9050602081019050919050565b82818337600083830152505050565b60006132006131fb846131ad565b613192565b90508281526020810184848401111561321c5761321b61312d565b5b6132278482856131de565b509392505050565b600082601f83011261324457613243613128565b5b81356132548482602086016131ed565b91505092915050565b60006020828403121561327357613272612f93565b5b600082013567ffffffffffffffff81111561329157613290612f98565b5b61329d8482850161322f565b91505092915050565b6000806000606084860312156132bf576132be612f93565b5b60006132cd86828701613073565b93505060206132de86828701613073565b92505060406132ef86828701612fbe565b9150509250925092565b600060ff82169050919050565b61330f816132f9565b82525050565b600060208201905061332a6000830184613306565b92915050565b6000806040838503121561334757613346612f93565b5b600083013567ffffffffffffffff81111561336557613364612f98565b5b6133718582860161322f565b925050602083013567ffffffffffffffff81111561339257613391612f98565b5b61339e8582860161322f565b9150509250929050565b6133b1816130c8565b81146133bc57600080fd5b50565b6000813590506133ce816133a8565b92915050565b600080604083850312156133eb576133ea612f93565b5b60006133f985828601613073565b925050602061340a858286016133bf565b9150509250929050565b60006020828403121561342a57613429612f93565b5b600061343884828501613073565b91505092915050565b600080fd5b600080fd5b60008083601f84011261346157613460613128565b5b8235905067ffffffffffffffff81111561347e5761347d613441565b5b60208301915083600182028301111561349a57613499613446565b5b9250929050565b6000806000806000608086880312156134bd576134bc612f93565b5b60006134cb88828901613073565b95505060206134dc88828901613073565b94505060406134ed88828901612fbe565b935050606086013567ffffffffffffffff81111561350e5761350d612f98565b5b61351a8882890161344b565b92509250509295509295909350565b600080604083850312156135405761353f612f93565b5b600061354e85828601613073565b925050602061355f85828601613073565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135b057607f821691505b6020821081036135c3576135c2613569565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261362b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135ee565b61363586836135ee565b95508019841693508086168417925050509392505050565b6000819050919050565b600061367261366d61366884612f9d565b61364d565b612f9d565b9050919050565b6000819050919050565b61368c83613657565b6136a061369882613679565b8484546135fb565b825550505050565b600090565b6136b56136a8565b6136c0818484613683565b505050565b5b818110156136e4576136d96000826136ad565b6001810190506136c6565b5050565b601f821115613729576136fa816135c9565b613703846135de565b81016020851015613712578190505b61372661371e856135de565b8301826136c5565b50505b505050565b600082821c905092915050565b600061374c6000198460080261372e565b1980831691505092915050565b6000613765838361373b565b9150826002028217905092915050565b61377e82612ed7565b67ffffffffffffffff81111561379757613796613132565b5b6137a18254613598565b6137ac8282856136e8565b600060209050601f8311600181146137df57600084156137cd578287015190505b6137d78582613759565b86555061383f565b601f1984166137ed866135c9565b60005b82811015613815578489015182556001820191506020850194506020810190506137f0565b86831015613832578489015161382e601f89168261373b565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061388182612f9d565b915061388c83612f9d565b92508282039050818111156138a4576138a3613847565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082825260208201905092915050565b50565b6000613929600083613908565b915061393482613919565b600082019050919050565b60006080820190506139546000830186613032565b6139616020830185613032565b61396e60408301846130fe565b818103606083015261397f8161391c565b9050949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139be81613989565b81146139c957600080fd5b50565b6000815190506139db816139b5565b92915050565b6000602082840312156139f7576139f6612f93565b5b6000613a05848285016139cc565b91505092915050565b6000613a1a8385613908565b9350613a278385846131de565b613a3083612f1d565b840190509392505050565b6000608082019050613a506000830188613032565b613a5d6020830187613032565b613a6a60408301866130fe565b8181036060830152613a7d818486613a0e565b90509695505050505050565b6000613a9c613a97846131ad565b613192565b905082815260208101848484011115613ab857613ab761312d565b5b613ac3848285612ef3565b509392505050565b600082601f830112613ae057613adf613128565b5b8151613af0848260208601613a89565b91505092915050565b600060208284031215613b0f57613b0e612f93565b5b600082015167ffffffffffffffff811115613b2d57613b2c612f98565b5b613b3984828501613acb565b91505092915050565b600081905092915050565b60008154613b5a81613598565b613b648186613b42565b94506001821660008114613b7f5760018114613b9457613bc7565b60ff1983168652811515820286019350613bc7565b613b9d856135c9565b60005b83811015613bbf57815481890152600182019150602081019050613ba0565b838801955050505b50505092915050565b6000613bdb82612ed7565b613be58185613b42565b9350613bf5818560208601612ef3565b80840191505092915050565b6000613c0d8285613b4d565b9150613c198284613bd0565b91508190509392505050565b6000819050919050565b613c40613c3b82612f9d565b613c25565b82525050565b6000613c528284613c2f565b60208201915081905092915050565b7f7b226e616d65223a20224e6f766120506c616e65742023000000000000000000815250565b6000613c9282613c61565b601782019150613ca28284613bd0565b915081905092915050565b7f222c226465736372697074696f6e223a224120636f6c6c656374696f6e206f6660008201527f2031302c30303020506c616e65747320656e61626c656420627920455243343060208201527f342c20616e206578706572696d656e74616c20746f6b656e207374616e64617260408201527f642e222c2265787465726e616c5f75726c223a2268747470733a2f2f6e6f766160608201527f3430342e636f6d222c22696d616765223a220000000000000000000000000000608082015250565b6000613d7b609283613b42565b9150613d8682613cad565b609282019050919050565b6000613d9d8284613bd0565b9150613da882613d6e565b915081905092915050565b6000613dbf8285613bd0565b9150613dcb8284613bd0565b91508190509392505050565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a224360008201527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015250565b6000613e33602f83613b42565b9150613e3e82613dd7565b602f82019050919050565b6000613e5482613e26565b9150613e608284613bd0565b915081905092915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000815250565b6000613e9c82613e6b565b601b82019150613eac8284613bd0565b915081905092915050565b60008160011c9050919050565b6000808291508390505b6001851115613f0e57808604811115613eea57613ee9613847565b5b6001851615613ef95780820291505b8081029050613f0785613eb7565b9450613ece565b94509492505050565b600082613f275760019050613fe3565b81613f355760009050613fe3565b8160018114613f4b5760028114613f5557613f84565b6001915050613fe3565b60ff841115613f6757613f66613847565b5b8360020a915084821115613f7e57613f7d613847565b5b50613fe3565b5060208310610133831016604e8410600b8410161715613fb95782820a905083811115613fb457613fb3613847565b5b613fe3565b613fc68484846001613ec4565b92509050818404811115613fdd57613fdc613847565b5b81810290505b9392505050565b6000613ff582612f9d565b9150614000836132f9565b925061402d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613f17565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061406f82612f9d565b915061407a83612f9d565b92508261408a57614089614035565b5b828204905092915050565b60006140a082612f9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140d2576140d1613847565b5b60018201905091905056fea264697066735822122072f13e0b4c4f25003acfef2ce7eb3027f43db1ad552669d50ccfb9caa925afd764736f6c63430008140033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063754ab64b11610104578063c87b56dd116100a2578063e985e9c511610071578063e985e9c51461052c578063f28ca1dd1461055c578063f2fde38b1461057a578063f5ad530b14610596576101cf565b8063c87b56dd14610492578063d547cfb7146104c2578063dd62ed3e146104e0578063e0df5b6f14610510576101cf565b80639b19251a116100de5780639b19251a146103fa578063a22cb4651461042a578063a9059cbb14610446578063b88d4fde14610476576101cf565b8063754ab64b146103a25780638da5cb5b146103be57806395d89b41146103dc576101cf565b8063313ce56711610171578063504334c21161014b578063504334c21461030a57806353d6fd59146103265780636352211e1461034257806370a0823114610372576101cf565b8063313ce567146102b257806342842e0e146102d05780634f02c420146102ec576101cf565b806318160ddd116101ad57806318160ddd1461025257806318d217c31461027057806323b872dd1461028c5780632b968958146102a8576101cf565b806306fdde03146101d4578063081812fc146101f2578063095ea7b314610222575b600080fd5b6101dc6105b4565b6040516101e99190612f67565b60405180910390f35b61020c60048036038101906102079190612fd3565b610642565b6040516102199190613041565b60405180910390f35b61023c60048036038101906102379190613088565b610675565b60405161024991906130e3565b60405180910390f35b61025a61096e565b604051610267919061310d565b60405180910390f35b61028a6004803603810190610285919061325d565b610992565b005b6102a660048036038101906102a191906132a6565b610a2a565b005b6102b0611261565b005b6102ba611384565b6040516102c79190613315565b60405180910390f35b6102ea60048036038101906102e591906132a6565b6113a8565b005b6102f46114db565b604051610301919061310d565b60405180910390f35b610324600480360381019061031f9190613330565b6114e1565b005b610340600480360381019061033b91906133d4565b611574565b005b61035c60048036038101906103579190612fd3565b611654565b6040516103699190613041565b60405180910390f35b61038c60048036038101906103879190613414565b6116f7565b604051610399919061310d565b60405180910390f35b6103bc60048036038101906103b79190613414565b61170f565b005b6103c66117d8565b6040516103d39190613041565b60405180910390f35b6103e46117fc565b6040516103f19190612f67565b60405180910390f35b610414600480360381019061040f9190613414565b61188a565b60405161042191906130e3565b60405180910390f35b610444600480360381019061043f91906133d4565b6118aa565b005b610460600480360381019061045b9190613088565b6119a7565b60405161046d91906130e3565b60405180910390f35b610490600480360381019061048b91906134a1565b6119bc565b005b6104ac60048036038101906104a79190612fd3565b611af5565b6040516104b99190612f67565b60405180910390f35b6104ca61204b565b6040516104d79190612f67565b60405180910390f35b6104fa60048036038101906104f59190613529565b6120d9565b604051610507919061310d565b60405180910390f35b61052a6004803603810190610525919061325d565b6120fe565b005b61054660048036038101906105419190613529565b612196565b60405161055391906130e3565b60405180910390f35b6105646121c5565b6040516105719190612f67565b60405180910390f35b610594600480360381019061058f9190613414565b612253565b005b61059e6123db565b6040516105ab9190613041565b60405180910390f35b600180546105c190613598565b80601f01602080910402602001604051908101604052809291908181526020018280546105ed90613598565b801561063a5780601f1061060f5761010080835404028352916020019161063a565b820191906000526020600020905b81548152906001019060200180831161061d57829003601f168201915b505050505081565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060035482111580156106895750600082115b1561087d5760006008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156107895750600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156107c0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836006600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161086f919061310d565b60405180910390a350610964565b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161095b919061310d565b60405180910390a35b6001905092915050565b7f00000000000000000000000000000000000000000000021e19e0c9bab240000081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a17576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c9081610a269190613775565b5050565b6003548111611119576008600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610acb576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b31576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610bf45750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015610c5f57506006600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610c96576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c9e612401565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610cec9190613876565b92505081905550610cfb612401565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506006600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050610e5f9190613876565b81548110610e7057610e6f6138aa565b5b9060005260206000200154905080600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600a60008581526020019081526020016000205481548110610ee257610ee16138aa565b5b9060005260206000200181905550600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480610f3f57610f3e6138d9565b5b60019003818190600052602060002001600090559055600a600083815260200190815260200160002054600a600083815260200190815260200160002081905550600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150506001900390600052602060002001600090919091909150556001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506110359190613876565b600a600084815260200190815260200160002081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876110fe612401565b60405161110b919061310d565b60405180910390a35061125c565b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461124e5781816111cd9190613876565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b611259848484612435565b50505b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112e6576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000001281565b6113b3838383610a2a565b60008273ffffffffffffffffffffffffffffffffffffffff163b1415801561149f575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161143a9392919061393f565b6020604051808303816000875af1158015611459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147d91906139e1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156114d6576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60035481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611566576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61157082826127a0565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115f9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116f2576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60046020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611794576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002805461180990613598565b80601f016020809104026020016040519081016040528092919081815260200182805461183590613598565b80156118825780601f1061185757610100808354040283529160200191611882565b820191906000526020600020905b81548152906001019060200180831161186557829003601f168201915b505050505081565b600b6020528060005260406000206000915054906101000a900460ff1681565b80600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161199b91906130e3565b60405180910390a35050565b60006119b4338484612435565b905092915050565b6119c7858585610a2a565b60008473ffffffffffffffffffffffffffffffffffffffff163b14158015611ab7575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b8152600401611a52959493929190613a3b565b6020604051808303816000875af1158015611a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9591906139e1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611aee576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b6060600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bf557600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630a874df6836040518263ffffffff1660e01b8152600401611ba8919061310d565b600060405180830381865afa158015611bc5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bee9190613af9565b9050612046565b6000600d8054611c0490613598565b90501115611c3e57600d611c17836127c4565b604051602001611c28929190613c01565b6040516020818303038152906040529050612046565b600082604051602001611c519190613c46565b6040516020818303038152906040528051906020012060f81c905060608060648360ff1611611cef576040518060400160405280600581526020017f312e6a706700000000000000000000000000000000000000000000000000000081525091506040518060400160405280600381526020017f52656400000000000000000000000000000000000000000000000000000000008152509050611eef565b60a08360ff1611611d6f576040518060400160405280600581526020017f322e6a706700000000000000000000000000000000000000000000000000000081525091506040518060400160405280600681526020017f507572706c6500000000000000000000000000000000000000000000000000008152509050611eee565b60d28360ff1611611def576040518060400160405280600581526020017f332e6a706700000000000000000000000000000000000000000000000000000081525091506040518060400160405280600681526020017f59656c6c6f7700000000000000000000000000000000000000000000000000008152509050611eed565b60f08360ff1611611e6f576040518060400160405280600581526020017f342e6a706700000000000000000000000000000000000000000000000000000081525091506040518060400160405280600681526020017f4f72616e676500000000000000000000000000000000000000000000000000008152509050611eec565b60ff8360ff1611611eeb576040518060400160405280600581526020017f352e6a706700000000000000000000000000000000000000000000000000000081525091506040518060400160405280600481526020017f426c75650000000000000000000000000000000000000000000000000000000081525090505b5b5b5b5b6000611efa866127c4565b604051602001611f0a9190613c87565b604051602081830303815290604052604051602001611f299190613d91565b604051602081830303815290604052600c84604051602001611f4c929190613c01565b604051602081830303815290604052604051602001611f6c929190613db3565b6040516020818303038152906040529050600082604051602001611f909190613e49565b604051602081830303815290604052905060006040518060400160405280600481526020017f227d5d7d0000000000000000000000000000000000000000000000000000000081525090508282604051602001611fee929190613db3565b6040516020818303038152906040528160405160200161200f929190613db3565b60405160208183030381529060405260405160200161202e9190613e91565b60405160208183030381529060405296505050505050505b919050565b600d805461205890613598565b80601f016020809104026020016040519081016040528092919081815260200182805461208490613598565b80156120d15780601f106120a6576101008083540402835291602001916120d1565b820191906000526020600020905b8154815290600101906020018083116120b457829003601f168201915b505050505081565b6005602052816000526040600020602052806000526040600020600091509150505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612183576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d90816121929190613775565b5050565b60076020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600c80546121d290613598565b80601f01602080910402602001604051908101604052809291908181526020018280546121fe90613598565b801561224b5780601f106122205761010080835404028352916020019161224b565b820191906000526020600020905b81548152906001019060200180831161222e57829003601f168201915b505050505081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122d8576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361233e576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f0000000000000000000000000000000000000000000000000000000000000012600a6124309190613fea565b905090565b600080612440612401565b90506000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125199190613876565b9250508190555084600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661264d57600083600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260b9190614064565b84846126179190614064565b6126219190613876565b905060005b8181101561264a5761263789612892565b808061264290614095565b915050612626565b50505b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661272d57600083826126ac9190614064565b84600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126f79190614064565b6127019190613876565b905060005b8181101561272a5761271788612aee565b808061272290614095565b915050612706565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161278a919061310d565b60405180910390a3600193505050509392505050565b81600190816127af9190613775565b5080600290816127bf9190613775565b505050565b6060600060016127d384612d84565b01905060008167ffffffffffffffff8111156127f2576127f1613132565b5b6040519080825280601f01601f1916602001820160405280156128245781602001600182028036833780820191505090505b509050600082602001820190505b600115612887578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161287b5761287a614035565b5b04945060008503612832575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036128f8576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506129889190613876565b81548110612999576129986138aa565b5b90600052602060002001549050600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806129f5576129f46138d9565b5b60019003818190600052602060002001600090559055600a6000828152602001908152602001600020600090556008600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556006600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905580600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b54576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036000815480929190600101919050555060006003549050600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c06576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050612d0d9190613876565b600a600083815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612de2577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612dd857612dd7614035565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612e1f576d04ee2d6d415b85acef81000000008381612e1557612e14614035565b5b0492506020810190505b662386f26fc100008310612e4e57662386f26fc100008381612e4457612e43614035565b5b0492506010810190505b6305f5e1008310612e77576305f5e1008381612e6d57612e6c614035565b5b0492506008810190505b6127108310612e9c576127108381612e9257612e91614035565b5b0492506004810190505b60648310612ebf5760648381612eb557612eb4614035565b5b0492506002810190505b600a8310612ece576001810190505b80915050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f11578082015181840152602081019050612ef6565b60008484015250505050565b6000601f19601f8301169050919050565b6000612f3982612ed7565b612f438185612ee2565b9350612f53818560208601612ef3565b612f5c81612f1d565b840191505092915050565b60006020820190508181036000830152612f818184612f2e565b905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b612fb081612f9d565b8114612fbb57600080fd5b50565b600081359050612fcd81612fa7565b92915050565b600060208284031215612fe957612fe8612f93565b5b6000612ff784828501612fbe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061302b82613000565b9050919050565b61303b81613020565b82525050565b60006020820190506130566000830184613032565b92915050565b61306581613020565b811461307057600080fd5b50565b6000813590506130828161305c565b92915050565b6000806040838503121561309f5761309e612f93565b5b60006130ad85828601613073565b92505060206130be85828601612fbe565b9150509250929050565b60008115159050919050565b6130dd816130c8565b82525050565b60006020820190506130f860008301846130d4565b92915050565b61310781612f9d565b82525050565b600060208201905061312260008301846130fe565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61316a82612f1d565b810181811067ffffffffffffffff8211171561318957613188613132565b5b80604052505050565b600061319c612f89565b90506131a88282613161565b919050565b600067ffffffffffffffff8211156131c8576131c7613132565b5b6131d182612f1d565b9050602081019050919050565b82818337600083830152505050565b60006132006131fb846131ad565b613192565b90508281526020810184848401111561321c5761321b61312d565b5b6132278482856131de565b509392505050565b600082601f83011261324457613243613128565b5b81356132548482602086016131ed565b91505092915050565b60006020828403121561327357613272612f93565b5b600082013567ffffffffffffffff81111561329157613290612f98565b5b61329d8482850161322f565b91505092915050565b6000806000606084860312156132bf576132be612f93565b5b60006132cd86828701613073565b93505060206132de86828701613073565b92505060406132ef86828701612fbe565b9150509250925092565b600060ff82169050919050565b61330f816132f9565b82525050565b600060208201905061332a6000830184613306565b92915050565b6000806040838503121561334757613346612f93565b5b600083013567ffffffffffffffff81111561336557613364612f98565b5b6133718582860161322f565b925050602083013567ffffffffffffffff81111561339257613391612f98565b5b61339e8582860161322f565b9150509250929050565b6133b1816130c8565b81146133bc57600080fd5b50565b6000813590506133ce816133a8565b92915050565b600080604083850312156133eb576133ea612f93565b5b60006133f985828601613073565b925050602061340a858286016133bf565b9150509250929050565b60006020828403121561342a57613429612f93565b5b600061343884828501613073565b91505092915050565b600080fd5b600080fd5b60008083601f84011261346157613460613128565b5b8235905067ffffffffffffffff81111561347e5761347d613441565b5b60208301915083600182028301111561349a57613499613446565b5b9250929050565b6000806000806000608086880312156134bd576134bc612f93565b5b60006134cb88828901613073565b95505060206134dc88828901613073565b94505060406134ed88828901612fbe565b935050606086013567ffffffffffffffff81111561350e5761350d612f98565b5b61351a8882890161344b565b92509250509295509295909350565b600080604083850312156135405761353f612f93565b5b600061354e85828601613073565b925050602061355f85828601613073565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135b057607f821691505b6020821081036135c3576135c2613569565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261362b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135ee565b61363586836135ee565b95508019841693508086168417925050509392505050565b6000819050919050565b600061367261366d61366884612f9d565b61364d565b612f9d565b9050919050565b6000819050919050565b61368c83613657565b6136a061369882613679565b8484546135fb565b825550505050565b600090565b6136b56136a8565b6136c0818484613683565b505050565b5b818110156136e4576136d96000826136ad565b6001810190506136c6565b5050565b601f821115613729576136fa816135c9565b613703846135de565b81016020851015613712578190505b61372661371e856135de565b8301826136c5565b50505b505050565b600082821c905092915050565b600061374c6000198460080261372e565b1980831691505092915050565b6000613765838361373b565b9150826002028217905092915050565b61377e82612ed7565b67ffffffffffffffff81111561379757613796613132565b5b6137a18254613598565b6137ac8282856136e8565b600060209050601f8311600181146137df57600084156137cd578287015190505b6137d78582613759565b86555061383f565b601f1984166137ed866135c9565b60005b82811015613815578489015182556001820191506020850194506020810190506137f0565b86831015613832578489015161382e601f89168261373b565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061388182612f9d565b915061388c83612f9d565b92508282039050818111156138a4576138a3613847565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082825260208201905092915050565b50565b6000613929600083613908565b915061393482613919565b600082019050919050565b60006080820190506139546000830186613032565b6139616020830185613032565b61396e60408301846130fe565b818103606083015261397f8161391c565b9050949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139be81613989565b81146139c957600080fd5b50565b6000815190506139db816139b5565b92915050565b6000602082840312156139f7576139f6612f93565b5b6000613a05848285016139cc565b91505092915050565b6000613a1a8385613908565b9350613a278385846131de565b613a3083612f1d565b840190509392505050565b6000608082019050613a506000830188613032565b613a5d6020830187613032565b613a6a60408301866130fe565b8181036060830152613a7d818486613a0e565b90509695505050505050565b6000613a9c613a97846131ad565b613192565b905082815260208101848484011115613ab857613ab761312d565b5b613ac3848285612ef3565b509392505050565b600082601f830112613ae057613adf613128565b5b8151613af0848260208601613a89565b91505092915050565b600060208284031215613b0f57613b0e612f93565b5b600082015167ffffffffffffffff811115613b2d57613b2c612f98565b5b613b3984828501613acb565b91505092915050565b600081905092915050565b60008154613b5a81613598565b613b648186613b42565b94506001821660008114613b7f5760018114613b9457613bc7565b60ff1983168652811515820286019350613bc7565b613b9d856135c9565b60005b83811015613bbf57815481890152600182019150602081019050613ba0565b838801955050505b50505092915050565b6000613bdb82612ed7565b613be58185613b42565b9350613bf5818560208601612ef3565b80840191505092915050565b6000613c0d8285613b4d565b9150613c198284613bd0565b91508190509392505050565b6000819050919050565b613c40613c3b82612f9d565b613c25565b82525050565b6000613c528284613c2f565b60208201915081905092915050565b7f7b226e616d65223a20224e6f766120506c616e65742023000000000000000000815250565b6000613c9282613c61565b601782019150613ca28284613bd0565b915081905092915050565b7f222c226465736372697074696f6e223a224120636f6c6c656374696f6e206f6660008201527f2031302c30303020506c616e65747320656e61626c656420627920455243343060208201527f342c20616e206578706572696d656e74616c20746f6b656e207374616e64617260408201527f642e222c2265787465726e616c5f75726c223a2268747470733a2f2f6e6f766160608201527f3430342e636f6d222c22696d616765223a220000000000000000000000000000608082015250565b6000613d7b609283613b42565b9150613d8682613cad565b609282019050919050565b6000613d9d8284613bd0565b9150613da882613d6e565b915081905092915050565b6000613dbf8285613bd0565b9150613dcb8284613bd0565b91508190509392505050565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a224360008201527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015250565b6000613e33602f83613b42565b9150613e3e82613dd7565b602f82019050919050565b6000613e5482613e26565b9150613e608284613bd0565b915081905092915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000815250565b6000613e9c82613e6b565b601b82019150613eac8284613bd0565b915081905092915050565b60008160011c9050919050565b6000808291508390505b6001851115613f0e57808604811115613eea57613ee9613847565b5b6001851615613ef95780820291505b8081029050613f0785613eb7565b9450613ece565b94509492505050565b600082613f275760019050613fe3565b81613f355760009050613fe3565b8160018114613f4b5760028114613f5557613f84565b6001915050613fe3565b60ff841115613f6757613f66613847565b5b8360020a915084821115613f7e57613f7d613847565b5b50613fe3565b5060208310610133831016604e8410600b8410161715613fb95782820a905083811115613fb457613fb3613847565b5b613fe3565b613fc68484846001613ec4565b92509050818404811115613fdd57613fdc613847565b5b81810290505b9392505050565b6000613ff582612f9d565b9150614000836132f9565b925061402d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613f17565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061406f82612f9d565b915061407a83612f9d565b92508261408a57614089614035565b5b828204905092915050565b60006140a082612f9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140d2576140d1613847565b5b60018201905091905056fea264697066735822122072f13e0b4c4f25003acfef2ce7eb3027f43db1ad552669d50ccfb9caa925afd764736f6c63430008140033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
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.