ERC-20
Overview
Max Total Supply
300 VEIL
Holders
0
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
VEIL
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-02-12 */ //SPDX-License-Identifier: UNLICENSED /* Wesbite: https://veil.exchange/ X: https://twitter.com/VeilExchange Telegram: https://t.me/VeilExchange */ pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = HEX_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/utils/Pausable.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { bool private _paused; /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/access/Ownable2Step.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable2Step.sol) pragma solidity ^0.8.20; /** * @dev Contract module which provides access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is specified at deployment time in the constructor for `Ownable`. This * can later be changed with {transferOwnership} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2Step is Ownable { address private _pendingOwner; event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() public virtual { address sender = _msgSender(); if (pendingOwner() != sender) { revert OwnableUnauthorizedAccount(sender); } _transferOwnership(sender); } } // File: contracts/ERC404.sol pragma solidity ^0.8.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 Ownable2Step { // 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(); error Unauthorized(); error InvalidOwner(); // 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 virtual 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; } } // File: contracts/veil.sol contract VEIL is ERC404, Pausable, ReentrancyGuard { string public baseTokenURI; uint256 public buyLimit; uint256 public sellLimit; uint256 public txLimit; mapping (address => uint256) public userBuylimit; mapping (address => uint256) public userSelllimit; using Strings for uint256; bool public applyTxLimit; constructor( address _owner, uint256 _initialSupply, uint8 _decimal, uint256 _buylimit, uint256 _selllimit ) ERC404("Veil 404", "VEIL", _decimal, _initialSupply, _owner) { balanceOf[_owner] = _initialSupply * 10 ** _decimal; buyLimit = _buylimit * 10 ** _decimal; sellLimit = _selllimit * 10 ** _decimal; txLimit = 10 * 10 ** _decimal; } function setLimit(uint256 _buylimit, uint256 _selllimit) public onlyOwner{ buyLimit = _buylimit; sellLimit = _selllimit; } function _mint( address to ) internal override whenNotPaused{ return super._mint(to); } function startApplyingLimit() external onlyOwner{ applyTxLimit = true; } function stopApplyingLimit() external onlyOwner{ applyTxLimit = false; } function _transfer( address from, address to, uint256 amount ) internal override virtual whenNotPaused returns (bool){ if(applyTxLimit){ require(amount < txLimit, "exceed tx limit"); } if(!whitelist[from]){ userSelllimit[from] += amount; require(userSelllimit[from] <= sellLimit, "not allowed anymore to sell"); } if(!whitelist[to]){ userBuylimit[to] += amount; require(userBuylimit[to] <= buyLimit, "not allowed anymore to buy"); } return super._transfer(from, to, amount); } function setTokenURI(string memory _tokenURI) public onlyOwner { baseTokenURI = _tokenURI; } function setNameSymbol( string memory _name, string memory _symbol ) public onlyOwner { _setNameSymbol(_name, _symbol); } function tokenURI(uint256 id) public view override returns (string memory) { return bytes(baseTokenURI).length > 0 ? string.concat(baseTokenURI, id.toString(), ".json") : ""; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_initialSupply","type":"uint256"},{"internalType":"uint8","name":"_decimal","type":"uint8"},{"internalType":"uint256","name":"_buylimit","type":"uint256"},{"internalType":"uint256","name":"_selllimit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"applyTxLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"buyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"_buylimit","type":"uint256"},{"internalType":"uint256","name":"_selllimit","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startApplyingLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopApplyingLimit","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"txLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userBuylimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userSelllimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c060405234801562000010575f80fd5b506040516200235338038062002353833981016040819052620000339162000202565b604080518082018252600881526715995a5b080d0c0d60c21b602080830191909152825180840190935260048352631591525360e21b9083015290848688806001600160a01b038116620000a057604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000ab8162000195565b506002620000ba868262000303565b506003620000c9858262000303565b5060ff83166080819052620000e090600a620004de565b620000ec9083620004f5565b60a0525050600d805460ff1916905550506001600e55506200011083600a620004de565b6200011c9085620004f5565b6001600160a01b0386165f908152600560205260409020556200014183600a620004de565b6200014d9083620004f5565b6010556200015d83600a620004de565b620001699082620004f5565b6011556200017983600a620004de565b6200018690600a620004f5565b601255506200050f9350505050565b600180546001600160a01b0319169055620001b081620001b3565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f805f805f60a0868803121562000217575f80fd5b85516001600160a01b03811681146200022e575f80fd5b60208701516040880151919650945060ff811681146200024c575f80fd5b6060870151608090970151959894975095949392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200028e57607f821691505b602082108103620002ad57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002fe57805f5260205f20601f840160051c81016020851015620002da5750805b601f840160051c820191505b81811015620002fb575f8155600101620002e6565b50505b505050565b81516001600160401b038111156200031f576200031f62000265565b620003378162000330845462000279565b84620002b3565b602080601f8311600181146200036d575f8415620003555750858301515b5f19600386901b1c1916600185901b178555620003c7565b5f85815260208120601f198616915b828110156200039d578886015182559484019460019091019084016200037c565b5085821015620003bb57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200042357815f1904821115620004075762000407620003cf565b808516156200041557918102915b93841c9390800290620003e8565b509250929050565b5f826200043b57506001620004d8565b816200044957505f620004d8565b81600181146200046257600281146200046d576200048d565b6001915050620004d8565b60ff841115620004815762000481620003cf565b50506001821b620004d8565b5060208310610133831016604e8410600b8410161715620004b2575081810a620004d8565b620004be8383620003e3565b805f1904821115620004d457620004d4620003cf565b0290505b92915050565b5f620004ee60ff8416836200042b565b9392505050565b8082028115828204841417620004d857620004d8620003cf565b60805160a051611e1b620005385f395f6102a801525f81816103120152610f040152611e1b5ff3fe608060405234801561000f575f80fd5b506004361061021e575f3560e01c8063715018a61161012a578063c87b56dd116100b4578063e30c397811610079578063e30c3978146104e2578063e985e9c5146104f3578063f0306ea414610520578063f2fde38b14610528578063f349b1731461053b575f80fd5b8063c87b56dd1461046b578063d547cfb71461047e578063dd62ed3e14610486578063e0df5b6f146104b0578063e2d6f33a146104c3575f80fd5b80639b19251a116100fa5780639b19251a14610408578063a22cb4651461042a578063a9059cbb1461043d578063b88d4fde14610450578063c6a6035a14610463575f80fd5b8063715018a6146103e057806379ba5097146103e85780638da5cb5b146103f057806395d89b4114610400575f80fd5b80634f02c420116101ab578063589210d91161017b578063589210d9146103915780635c975abb1461039a5780636352211e146103a55780636caae832146103b857806370a08231146103c1575f80fd5b80634f02c420146103595780634f91e48c14610362578063504334c21461036b57806353d6fd591461037e575f80fd5b80631e70b6df116101f15780631e70b6df146102d8578063207add91146102e557806323b872dd146102fa578063313ce5671461030d57806342842e0e14610346575f80fd5b806306fdde0314610222578063081812fc14610240578063095ea7b31461028057806318160ddd146102a3575b5f80fd5b61022a61055a565b6040516102379190611709565b60405180910390f35b61026861024e36600461173b565b60076020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610237565b61029361028e366004611768565b6105e6565b6040519015158152602001610237565b6102ca7f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610237565b6015546102939060ff1681565b6102f86102f3366004611790565b610731565b005b6102f86103083660046117b0565b610744565b6103347f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610237565b6102f86103543660046117b0565b610ac0565b6102ca60045481565b6102ca60115481565b6102f8610379366004611886565b610b91565b6102f861038c3660046118e6565b610ba7565b6102ca60105481565b600d5460ff16610293565b6102686103b336600461173b565b610bd9565b6102ca60125481565b6102ca6103cf36600461191f565b60056020525f908152604090205481565b6102f8610c13565b6102f8610c26565b5f546001600160a01b0316610268565b61022a610c6f565b61029361041636600461191f565b600c6020525f908152604090205460ff1681565b6102f86104383660046118e6565b610c7c565b61029361044b366004611768565b610ce7565b6102f861045e366004611938565b610cfa565b6102f8610dba565b61022a61047936600461173b565b610dd1565b61022a610e2d565b6102ca6104943660046119cb565b600660209081525f928352604080842090915290825290205481565b6102f86104be3660046119fc565b610e3a565b6102ca6104d136600461191f565b60136020525f908152604090205481565b6001546001600160a01b0316610268565b6102936105013660046119cb565b600860209081525f928352604080842090915290825290205460ff1681565b6102f8610e4e565b6102f861053636600461191f565b610e62565b6102ca61054936600461191f565b60146020525f908152604090205481565b6002805461056790611a2e565b80601f016020809104026020016040519081016040528092919081815260200182805461059390611a2e565b80156105de5780601f106105b5576101008083540402835291602001916105de565b820191905f5260205f20905b8154815290600101906020018083116105c157829003601f168201915b505050505081565b5f60045482111580156105f857505f82115b156106cc575f828152600960205260409020546001600160a01b031633811480159061064757506001600160a01b0381165f90815260086020908152604080832033845290915290205460ff16155b15610664576040516282b42960e81b815260040160405180910390fd5b5f8381526007602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610727565b335f8181526006602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b610739610ed2565b601091909155601155565b6004548111610a54575f818152600960205260409020546001600160a01b0384811691161461078657604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0382166107ad57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b038416148015906107e957506001600160a01b0383165f90815260086020908152604080832033845290915290205460ff16155b801561080b57505f818152600760205260409020546001600160a01b03163314155b15610828576040516282b42960e81b815260040160405180910390fd5b610830610efe565b6001600160a01b0384165f9081526005602052604081208054909190610857908490611a7a565b909155506108659050610efe565b6001600160a01b038084165f81815260056020908152604080832080549096019095558582526009815284822080546001600160a01b031990811690941790556007815284822080549093169092559186168252600a905290812080546108ce90600190611a7a565b815481106108de576108de611a8d565b5f9182526020808320909101546001600160a01b0387168352600a82526040808420868552600b9093529092205481549293508392811061092157610921611a8d565b5f9182526020808320909101929092556001600160a01b0386168152600a9091526040902080548061095557610955611aa1565b5f828152602080822083015f19908101839055909201909255838252600b8152604080832054848452818420556001600160a01b038616808452600a835290832080546001818101835582865293852001869055925290546109b79190611a7a565b5f838152600b602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610a3d610efe565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526006602090815260408083203384529091529020545f198114610aad57610a898282611a7a565b6001600160a01b0385165f9081526006602090815260408083203384529091529020555b610ab8848484610f2f565b50505b505050565b610acb838383610744565b6001600160a01b0382163b15801590610b735750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610b42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b669190611ab5565b6001600160e01b03191614155b15610abb57604051633da6393160e01b815260040160405180910390fd5b610b99610ed2565b610ba38282611101565b5050565b610baf610ed2565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b5f818152600960205260409020546001600160a01b031680610c0e5760405163c5723b5160e01b815260040160405180910390fd5b919050565b610c1b610ed2565b610c245f61111a565b565b60015433906001600160a01b03168114610c635760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b610c6c8161111a565b50565b6003805461056790611a2e565b335f8181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610cf3338484610f2f565b9392505050565b610d05858585610744565b6001600160a01b0384163b15801590610d9c5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d4f9033908a90899089908990600401611adc565b6020604051808303815f875af1158015610d6b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8f9190611ab5565b6001600160e01b03191614155b15610ab857604051633da6393160e01b815260040160405180910390fd5b610dc2610ed2565b6015805460ff19166001179055565b60605f600f8054610de190611a2e565b905011610dfc5760405180602001604052805f81525061072b565b600f610e0783611133565b604051602001610e18929190611b2e565b60405160208183030381529060405292915050565b600f805461056790611a2e565b610e42610ed2565b600f610ba38282611c05565b610e56610ed2565b6015805460ff19169055565b610e6a610ed2565b600180546001600160a01b0383166001600160a01b03199091168117909155610e9a5f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b03163314610c245760405163118cdaa760e01b8152336004820152602401610c5a565b5f610f2a7f0000000000000000000000000000000000000000000000000000000000000000600a611da5565b905090565b5f610f386111c3565b60155460ff1615610f86576012548210610f865760405162461bcd60e51b815260206004820152600f60248201526e195e18d95959081d1e081b1a5b5a5d608a1b6044820152606401610c5a565b6001600160a01b0384165f908152600c602052604090205460ff1661103a576001600160a01b0384165f9081526014602052604081208054849290610fcc908490611db3565b90915550506011546001600160a01b0385165f90815260146020526040902054111561103a5760405162461bcd60e51b815260206004820152601b60248201527f6e6f7420616c6c6f77656420616e796d6f726520746f2073656c6c00000000006044820152606401610c5a565b6001600160a01b0383165f908152600c602052604090205460ff166110ee576001600160a01b0383165f9081526013602052604081208054849290611080908490611db3565b90915550506010546001600160a01b0384165f9081526013602052604090205411156110ee5760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420616c6c6f77656420616e796d6f726520746f206275790000000000006044820152606401610c5a565b6110f98484846111e7565b949350505050565b600261110d8382611c05565b506003610abb8282611c05565b600180546001600160a01b0319169055610c6c8161138c565b60605f61113f836113db565b60010190505f8167ffffffffffffffff81111561115e5761115e6117e9565b6040519080825280601f01601f191660200182016040528015611188576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461119257509392505050565b600d5460ff1615610c245760405163d93c066560e01b815260040160405180910390fd5b5f806111f1610efe565b6001600160a01b038087165f818152600560205260408082208054948a168352908220549282529394509192909186919061122c8386611a7a565b90915550506001600160a01b038087165f90815260056020908152604080832080548a019055928a168252600c9052205460ff166112bb576001600160a01b0387165f90815260056020526040812054611287908590611dc6565b6112918585611dc6565b61129b9190611a7a565b90505f5b818110156112b8576112b0896114b2565b60010161129f565b50505b6001600160a01b0386165f908152600c602052604090205460ff16611332575f6112e58483611dc6565b6001600160a01b0388165f90815260056020526040902054611308908690611dc6565b6113129190611a7a565b90505f5b8181101561132f57611327886115d3565b600101611316565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161137791815260200190565b60405180910390a35060019695505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106114195772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611445576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061146357662386f26fc10000830492506010015b6305f5e100831061147b576305f5e100830492506008015b612710831061148f57612710830492506004015b606483106114a1576064830492506002015b600a831061072b5760010192915050565b6001600160a01b0381166114d957604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f908152600a6020526040812080546114fe90600190611a7a565b8154811061150e5761150e611a8d565b905f5260205f2001549050600a5f836001600160a01b03166001600160a01b031681526020019081526020015f2080548061154b5761154b611aa1565b5f828152602080822083015f19908101839055909201909255828252600b815260408083208390556009825280832080546001600160a01b031990811690915560079092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6115db6111c3565b610c6c816001600160a01b03811661160657604051634e46966960e11b815260040160405180910390fd5b60048054600101908190555f818152600960205260409020546001600160a01b0316156116465760405163119b4fd360e11b815260040160405180910390fd5b5f81815260096020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600a8352908320805460018181018355828652938520018590559252905461169d9190611a7a565b5f828152600b602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f5b838110156117015781810151838201526020016116e9565b50505f910152565b602081525f82518060208401526117278160408501602087016116e7565b601f01601f19169190910160400192915050565b5f6020828403121561174b575f80fd5b5035919050565b80356001600160a01b0381168114610c0e575f80fd5b5f8060408385031215611779575f80fd5b61178283611752565b946020939093013593505050565b5f80604083850312156117a1575f80fd5b50508035926020909101359150565b5f805f606084860312156117c2575f80fd5b6117cb84611752565b92506117d960208501611752565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261180c575f80fd5b813567ffffffffffffffff80821115611827576118276117e9565b604051601f8301601f19908116603f0116810190828211818310171561184f5761184f6117e9565b81604052838152866020858801011115611867575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611897575f80fd5b823567ffffffffffffffff808211156118ae575f80fd5b6118ba868387016117fd565b935060208501359150808211156118cf575f80fd5b506118dc858286016117fd565b9150509250929050565b5f80604083850312156118f7575f80fd5b61190083611752565b915060208301358015158114611914575f80fd5b809150509250929050565b5f6020828403121561192f575f80fd5b610cf382611752565b5f805f805f6080868803121561194c575f80fd5b61195586611752565b945061196360208701611752565b935060408601359250606086013567ffffffffffffffff80821115611986575f80fd5b818801915088601f830112611999575f80fd5b8135818111156119a7575f80fd5b8960208285010111156119b8575f80fd5b9699959850939650602001949392505050565b5f80604083850312156119dc575f80fd5b6119e583611752565b91506119f360208401611752565b90509250929050565b5f60208284031215611a0c575f80fd5b813567ffffffffffffffff811115611a22575f80fd5b6110f9848285016117fd565b600181811c90821680611a4257607f821691505b602082108103611a6057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561072b5761072b611a66565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215611ac5575f80fd5b81516001600160e01b031981168114610cf3575f80fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f808454611b3b81611a2e565b60018281168015611b535760018114611b6857611b94565b60ff1984168752821515830287019450611b94565b885f526020805f205f5b85811015611b8b5781548a820152908401908201611b72565b50505082870194505b505050508351611ba88183602088016116e7565b64173539b7b760d91b9101908152600501949350505050565b601f821115610abb57805f5260205f20601f840160051c81016020851015611be65750805b601f840160051c820191505b81811015610ab8575f8155600101611bf2565b815167ffffffffffffffff811115611c1f57611c1f6117e9565b611c3381611c2d8454611a2e565b84611bc1565b602080601f831160018114611c66575f8415611c4f5750858301515b5f19600386901b1c1916600185901b178555611cbd565b5f85815260208120601f198616915b82811015611c9457888601518255948401946001909101908401611c75565b5085821015611cb157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b600181815b80851115611cff57815f1904821115611ce557611ce5611a66565b80851615611cf257918102915b93841c9390800290611cca565b509250929050565b5f82611d155750600161072b565b81611d2157505f61072b565b8160018114611d375760028114611d4157611d5d565b600191505061072b565b60ff841115611d5257611d52611a66565b50506001821b61072b565b5060208310610133831016604e8410600b8410161715611d80575081810a61072b565b611d8a8383611cc5565b805f1904821115611d9d57611d9d611a66565b029392505050565b5f610cf360ff841683611d07565b8082018082111561072b5761072b611a66565b5f82611de057634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212204e3bf2f81c4ec811bcb0e78159f20cc9547e8b049badfd77b9642ee1ab7b211b64736f6c6343000818003300000000000000000000000019df7bc14bfaae60440b917ffbb14c2d1d7357e4000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061021e575f3560e01c8063715018a61161012a578063c87b56dd116100b4578063e30c397811610079578063e30c3978146104e2578063e985e9c5146104f3578063f0306ea414610520578063f2fde38b14610528578063f349b1731461053b575f80fd5b8063c87b56dd1461046b578063d547cfb71461047e578063dd62ed3e14610486578063e0df5b6f146104b0578063e2d6f33a146104c3575f80fd5b80639b19251a116100fa5780639b19251a14610408578063a22cb4651461042a578063a9059cbb1461043d578063b88d4fde14610450578063c6a6035a14610463575f80fd5b8063715018a6146103e057806379ba5097146103e85780638da5cb5b146103f057806395d89b4114610400575f80fd5b80634f02c420116101ab578063589210d91161017b578063589210d9146103915780635c975abb1461039a5780636352211e146103a55780636caae832146103b857806370a08231146103c1575f80fd5b80634f02c420146103595780634f91e48c14610362578063504334c21461036b57806353d6fd591461037e575f80fd5b80631e70b6df116101f15780631e70b6df146102d8578063207add91146102e557806323b872dd146102fa578063313ce5671461030d57806342842e0e14610346575f80fd5b806306fdde0314610222578063081812fc14610240578063095ea7b31461028057806318160ddd146102a3575b5f80fd5b61022a61055a565b6040516102379190611709565b60405180910390f35b61026861024e36600461173b565b60076020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610237565b61029361028e366004611768565b6105e6565b6040519015158152602001610237565b6102ca7f00000000000000000000000000000000000000000000001043561a882930000081565b604051908152602001610237565b6015546102939060ff1681565b6102f86102f3366004611790565b610731565b005b6102f86103083660046117b0565b610744565b6103347f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610237565b6102f86103543660046117b0565b610ac0565b6102ca60045481565b6102ca60115481565b6102f8610379366004611886565b610b91565b6102f861038c3660046118e6565b610ba7565b6102ca60105481565b600d5460ff16610293565b6102686103b336600461173b565b610bd9565b6102ca60125481565b6102ca6103cf36600461191f565b60056020525f908152604090205481565b6102f8610c13565b6102f8610c26565b5f546001600160a01b0316610268565b61022a610c6f565b61029361041636600461191f565b600c6020525f908152604090205460ff1681565b6102f86104383660046118e6565b610c7c565b61029361044b366004611768565b610ce7565b6102f861045e366004611938565b610cfa565b6102f8610dba565b61022a61047936600461173b565b610dd1565b61022a610e2d565b6102ca6104943660046119cb565b600660209081525f928352604080842090915290825290205481565b6102f86104be3660046119fc565b610e3a565b6102ca6104d136600461191f565b60136020525f908152604090205481565b6001546001600160a01b0316610268565b6102936105013660046119cb565b600860209081525f928352604080842090915290825290205460ff1681565b6102f8610e4e565b6102f861053636600461191f565b610e62565b6102ca61054936600461191f565b60146020525f908152604090205481565b6002805461056790611a2e565b80601f016020809104026020016040519081016040528092919081815260200182805461059390611a2e565b80156105de5780601f106105b5576101008083540402835291602001916105de565b820191905f5260205f20905b8154815290600101906020018083116105c157829003601f168201915b505050505081565b5f60045482111580156105f857505f82115b156106cc575f828152600960205260409020546001600160a01b031633811480159061064757506001600160a01b0381165f90815260086020908152604080832033845290915290205460ff16155b15610664576040516282b42960e81b815260040160405180910390fd5b5f8381526007602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610727565b335f8181526006602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b610739610ed2565b601091909155601155565b6004548111610a54575f818152600960205260409020546001600160a01b0384811691161461078657604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0382166107ad57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b038416148015906107e957506001600160a01b0383165f90815260086020908152604080832033845290915290205460ff16155b801561080b57505f818152600760205260409020546001600160a01b03163314155b15610828576040516282b42960e81b815260040160405180910390fd5b610830610efe565b6001600160a01b0384165f9081526005602052604081208054909190610857908490611a7a565b909155506108659050610efe565b6001600160a01b038084165f81815260056020908152604080832080549096019095558582526009815284822080546001600160a01b031990811690941790556007815284822080549093169092559186168252600a905290812080546108ce90600190611a7a565b815481106108de576108de611a8d565b5f9182526020808320909101546001600160a01b0387168352600a82526040808420868552600b9093529092205481549293508392811061092157610921611a8d565b5f9182526020808320909101929092556001600160a01b0386168152600a9091526040902080548061095557610955611aa1565b5f828152602080822083015f19908101839055909201909255838252600b8152604080832054848452818420556001600160a01b038616808452600a835290832080546001818101835582865293852001869055925290546109b79190611a7a565b5f838152600b602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610a3d610efe565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526006602090815260408083203384529091529020545f198114610aad57610a898282611a7a565b6001600160a01b0385165f9081526006602090815260408083203384529091529020555b610ab8848484610f2f565b50505b505050565b610acb838383610744565b6001600160a01b0382163b15801590610b735750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610b42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b669190611ab5565b6001600160e01b03191614155b15610abb57604051633da6393160e01b815260040160405180910390fd5b610b99610ed2565b610ba38282611101565b5050565b610baf610ed2565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b5f818152600960205260409020546001600160a01b031680610c0e5760405163c5723b5160e01b815260040160405180910390fd5b919050565b610c1b610ed2565b610c245f61111a565b565b60015433906001600160a01b03168114610c635760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b610c6c8161111a565b50565b6003805461056790611a2e565b335f8181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610cf3338484610f2f565b9392505050565b610d05858585610744565b6001600160a01b0384163b15801590610d9c5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d4f9033908a90899089908990600401611adc565b6020604051808303815f875af1158015610d6b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8f9190611ab5565b6001600160e01b03191614155b15610ab857604051633da6393160e01b815260040160405180910390fd5b610dc2610ed2565b6015805460ff19166001179055565b60605f600f8054610de190611a2e565b905011610dfc5760405180602001604052805f81525061072b565b600f610e0783611133565b604051602001610e18929190611b2e565b60405160208183030381529060405292915050565b600f805461056790611a2e565b610e42610ed2565b600f610ba38282611c05565b610e56610ed2565b6015805460ff19169055565b610e6a610ed2565b600180546001600160a01b0383166001600160a01b03199091168117909155610e9a5f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b03163314610c245760405163118cdaa760e01b8152336004820152602401610c5a565b5f610f2a7f0000000000000000000000000000000000000000000000000000000000000012600a611da5565b905090565b5f610f386111c3565b60155460ff1615610f86576012548210610f865760405162461bcd60e51b815260206004820152600f60248201526e195e18d95959081d1e081b1a5b5a5d608a1b6044820152606401610c5a565b6001600160a01b0384165f908152600c602052604090205460ff1661103a576001600160a01b0384165f9081526014602052604081208054849290610fcc908490611db3565b90915550506011546001600160a01b0385165f90815260146020526040902054111561103a5760405162461bcd60e51b815260206004820152601b60248201527f6e6f7420616c6c6f77656420616e796d6f726520746f2073656c6c00000000006044820152606401610c5a565b6001600160a01b0383165f908152600c602052604090205460ff166110ee576001600160a01b0383165f9081526013602052604081208054849290611080908490611db3565b90915550506010546001600160a01b0384165f9081526013602052604090205411156110ee5760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420616c6c6f77656420616e796d6f726520746f206275790000000000006044820152606401610c5a565b6110f98484846111e7565b949350505050565b600261110d8382611c05565b506003610abb8282611c05565b600180546001600160a01b0319169055610c6c8161138c565b60605f61113f836113db565b60010190505f8167ffffffffffffffff81111561115e5761115e6117e9565b6040519080825280601f01601f191660200182016040528015611188576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461119257509392505050565b600d5460ff1615610c245760405163d93c066560e01b815260040160405180910390fd5b5f806111f1610efe565b6001600160a01b038087165f818152600560205260408082208054948a168352908220549282529394509192909186919061122c8386611a7a565b90915550506001600160a01b038087165f90815260056020908152604080832080548a019055928a168252600c9052205460ff166112bb576001600160a01b0387165f90815260056020526040812054611287908590611dc6565b6112918585611dc6565b61129b9190611a7a565b90505f5b818110156112b8576112b0896114b2565b60010161129f565b50505b6001600160a01b0386165f908152600c602052604090205460ff16611332575f6112e58483611dc6565b6001600160a01b0388165f90815260056020526040902054611308908690611dc6565b6113129190611a7a565b90505f5b8181101561132f57611327886115d3565b600101611316565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161137791815260200190565b60405180910390a35060019695505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106114195772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611445576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061146357662386f26fc10000830492506010015b6305f5e100831061147b576305f5e100830492506008015b612710831061148f57612710830492506004015b606483106114a1576064830492506002015b600a831061072b5760010192915050565b6001600160a01b0381166114d957604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f908152600a6020526040812080546114fe90600190611a7a565b8154811061150e5761150e611a8d565b905f5260205f2001549050600a5f836001600160a01b03166001600160a01b031681526020019081526020015f2080548061154b5761154b611aa1565b5f828152602080822083015f19908101839055909201909255828252600b815260408083208390556009825280832080546001600160a01b031990811690915560079092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6115db6111c3565b610c6c816001600160a01b03811661160657604051634e46966960e11b815260040160405180910390fd5b60048054600101908190555f818152600960205260409020546001600160a01b0316156116465760405163119b4fd360e11b815260040160405180910390fd5b5f81815260096020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600a8352908320805460018181018355828652938520018590559252905461169d9190611a7a565b5f828152600b602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f5b838110156117015781810151838201526020016116e9565b50505f910152565b602081525f82518060208401526117278160408501602087016116e7565b601f01601f19169190910160400192915050565b5f6020828403121561174b575f80fd5b5035919050565b80356001600160a01b0381168114610c0e575f80fd5b5f8060408385031215611779575f80fd5b61178283611752565b946020939093013593505050565b5f80604083850312156117a1575f80fd5b50508035926020909101359150565b5f805f606084860312156117c2575f80fd5b6117cb84611752565b92506117d960208501611752565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261180c575f80fd5b813567ffffffffffffffff80821115611827576118276117e9565b604051601f8301601f19908116603f0116810190828211818310171561184f5761184f6117e9565b81604052838152866020858801011115611867575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611897575f80fd5b823567ffffffffffffffff808211156118ae575f80fd5b6118ba868387016117fd565b935060208501359150808211156118cf575f80fd5b506118dc858286016117fd565b9150509250929050565b5f80604083850312156118f7575f80fd5b61190083611752565b915060208301358015158114611914575f80fd5b809150509250929050565b5f6020828403121561192f575f80fd5b610cf382611752565b5f805f805f6080868803121561194c575f80fd5b61195586611752565b945061196360208701611752565b935060408601359250606086013567ffffffffffffffff80821115611986575f80fd5b818801915088601f830112611999575f80fd5b8135818111156119a7575f80fd5b8960208285010111156119b8575f80fd5b9699959850939650602001949392505050565b5f80604083850312156119dc575f80fd5b6119e583611752565b91506119f360208401611752565b90509250929050565b5f60208284031215611a0c575f80fd5b813567ffffffffffffffff811115611a22575f80fd5b6110f9848285016117fd565b600181811c90821680611a4257607f821691505b602082108103611a6057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561072b5761072b611a66565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215611ac5575f80fd5b81516001600160e01b031981168114610cf3575f80fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f808454611b3b81611a2e565b60018281168015611b535760018114611b6857611b94565b60ff1984168752821515830287019450611b94565b885f526020805f205f5b85811015611b8b5781548a820152908401908201611b72565b50505082870194505b505050508351611ba88183602088016116e7565b64173539b7b760d91b9101908152600501949350505050565b601f821115610abb57805f5260205f20601f840160051c81016020851015611be65750805b601f840160051c820191505b81811015610ab8575f8155600101611bf2565b815167ffffffffffffffff811115611c1f57611c1f6117e9565b611c3381611c2d8454611a2e565b84611bc1565b602080601f831160018114611c66575f8415611c4f5750858301515b5f19600386901b1c1916600185901b178555611cbd565b5f85815260208120601f198616915b82811015611c9457888601518255948401946001909101908401611c75565b5085821015611cb157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b600181815b80851115611cff57815f1904821115611ce557611ce5611a66565b80851615611cf257918102915b93841c9390800290611cca565b509250929050565b5f82611d155750600161072b565b81611d2157505f61072b565b8160018114611d375760028114611d4157611d5d565b600191505061072b565b60ff841115611d5257611d52611a66565b50506001821b61072b565b5060208310610133831016604e8410600b8410161715611d80575081810a61072b565b611d8a8383611cc5565b805f1904821115611d9d57611d9d611a66565b029392505050565b5f610cf360ff841683611d07565b8082018082111561072b5761072b611a66565b5f82611de057634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212204e3bf2f81c4ec811bcb0e78159f20cc9547e8b049badfd77b9642ee1ab7b211b64736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000019df7bc14bfaae60440b917ffbb14c2d1d7357e4000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003
-----Decoded View---------------
Arg [0] : _owner (address): 0x19df7bC14bFAAe60440b917FFbB14C2D1d7357e4
Arg [1] : _initialSupply (uint256): 300
Arg [2] : _decimal (uint8): 18
Arg [3] : _buylimit (uint256): 3
Arg [4] : _selllimit (uint256): 3
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000019df7bc14bfaae60440b917ffbb14c2d1d7357e4
Arg [1] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Deployed Bytecode Sourcemap
43623:2379:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34704:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35415:46;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;35415:46:0;;;;;;-1:-1:-1;;;;;1019:32:1;;;1001:51;;989:2;974:18;35415:46:0;855:203:1;37246:642:0;;;;;;:::i;:::-;;:::i;:::-;;;1665:14:1;;1658:22;1640:41;;1628:2;1613:18;37246:642:0;1500:187:1;34940:36:0;;;;;;;;1838:25:1;;;1826:2;1811:18;34940:36:0;1692:177:1;43947:24:0;;;;;;;;;44416:145;;;;;;:::i;:::-;;:::i;:::-;;38295:1716;;;;;;:::i;:::-;;:::i;34840:31::-;;;;;;;;2632:4:1;2620:17;;;2602:36;;2590:2;2575:18;34840:31:0;2460:184:1;40307:405:0;;;;;;:::i;:::-;;:::i;35075:21::-;;;;;;43744:24;;;;;;45643:158;;;;;;:::i;:::-;;:::i;36575:111::-;;;;;;:::i;:::-;;:::i;43714:23::-;;;;;;26486:86;26557:7;;;;26486:86;;36758:193;;;;;;:::i;:::-;;:::i;43775:22::-;;;;;;35181:44;;;;;;:::i;:::-;;;;;;;;;;;;;;29859:103;;;:::i;32496:235::-;;;:::i;29184:87::-;29230:7;29257:6;-1:-1:-1;;;;;29257:6:0;29184:87;;34758:20;;;:::i;36026:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;37939:207;;;;;;:::i;:::-;;:::i;40070:160::-;;;;;;:::i;:::-;;:::i;40807:437::-;;;;;;:::i;:::-;;:::i;44692:86::-;;;:::i;45809:190::-;;;;;;:::i;:::-;;:::i;43681:26::-;;;:::i;35295:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;45529:106;;;;;;:::i;:::-;;:::i;43804:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;31584:101;31664:13;;-1:-1:-1;;;;;31664:13:0;31584:101;;35526:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;44786:86;;;:::i;31884:181::-;;;;;;:::i;:::-;;:::i;43859:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;34704:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37246:642::-;37349:4;37384:6;;37370:10;:20;;:38;;;;;37407:1;37394:10;:14;37370:38;37366:491;;;37425:13;37441:20;;;:8;:20;;;;;;-1:-1:-1;;;;;37441:20:0;37482:10;:19;;;;;:59;;-1:-1:-1;;;;;;37506:23:0;;;;;;:16;:23;;;;;;;;37530:10;37506:35;;;;;;;;;;37505:36;37482:59;37478:121;;;37569:14;;-1:-1:-1;;;37569:14:0;;;;;;;;;;;37478:121;37615:23;;;;:11;:23;;;;;;;;;:33;;-1:-1:-1;;;;;;37615:33:0;-1:-1:-1;;;;;37615:33:0;;;;;;;;;37670:36;;1838:25:1;;;37670:36:0;;;;;;1811:18:1;37670:36:0;;;;;;;37410:308;37366:491;;;37749:10;37739:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;37739:30:0;;;;;;;;;;;;:43;;;37804:41;1838:25:1;;;37739:30:0;;37749:10;37804:41;;1811:18:1;37804:41:0;;;;;;;37366:491;-1:-1:-1;37876:4:0;37246:642;;;;;:::o;44416:145::-;29070:13;:11;:13::i;:::-;44500:8:::1;:20:::0;;;;44531:9:::1;:22:::0;44416:145::o;38295:1716::-;38441:6;;38427:10;:20;38423:1581;;38476:20;;;;:8;:20;;;;;;-1:-1:-1;;;;;38468:28:0;;;38476:20;;38468:28;38464:91;;38524:15;;-1:-1:-1;;;38524:15:0;;;;;;;;;;;38464:91;-1:-1:-1;;;;;38575:16:0;;38571:82;;38619:18;;-1:-1:-1;;;38619:18:0;;;;;;;;;;;38571:82;38691:10;-1:-1:-1;;;;;38691:18:0;;;;;;:74;;-1:-1:-1;;;;;;38731:22:0;;;;;;:16;:22;;;;;;;;38754:10;38731:34;;;;;;;;;;38730:35;38691:74;:132;;;;-1:-1:-1;38800:23:0;;;;:11;:23;;;;;;-1:-1:-1;;;;;38800:23:0;38786:10;:37;;38691:132;38669:226;;;38865:14;;-1:-1:-1;;;38865:14:0;;;;;;;;;;;38669:226;38930:10;:8;:10::i;:::-;-1:-1:-1;;;;;38911:15:0;;;;;;:9;:15;;;;;:29;;:15;;;:29;;;;;:::i;:::-;;;;-1:-1:-1;39003:10:0;;-1:-1:-1;39003:8:0;:10::i;:::-;-1:-1:-1;;;;;38986:13:0;;;;;;;:9;:13;;;;;;;;:27;;;;;;;;39045:20;;;:8;:20;;;;;:25;;-1:-1:-1;;;;;;39045:25:0;;;;;;;;39092:11;:23;;;;;39085:30;;;;;;;;39193:12;;;;;:6;:12;;;;;39206:19;;:23;;-1:-1:-1;;39206:23:0;:::i;:::-;39193:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;39245:12:0;;;;:6;:12;;;;;;39258:23;;;:11;:23;;;;;;;39245:37;;39193;;-1:-1:-1;39193:37:0;;39245;;;;;;:::i;:::-;;;;;;;;;;;;:49;;;;-1:-1:-1;;;;;39329:12:0;;;;:6;:12;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;39329:18:0;;;;;;;;;;;;39433:23;;;:11;:23;;;;;;;39408:22;;;;;;:48;-1:-1:-1;;;;;39510:10:0;;;;;:6;:10;;;;;:27;;39329:18;39510:27;;;;;;;;;;;;;;;39620:10;;:17;;:21;;39329:18;39620:21;:::i;:::-;39594:23;;;;:11;:23;;;;;;:47;;;;39663:30;;39606:10;;-1:-1:-1;;;;;39663:30:0;;;;;;;;;;;39733:2;-1:-1:-1;;;;;39713:35:0;39727:4;-1:-1:-1;;;;;39713:35:0;;39737:10;:8;:10::i;:::-;39713:35;;1838:25:1;;;1826:2;1811:18;39713:35:0;;;;;;;38449:1311;38295:1716;;;:::o;38423:1581::-;-1:-1:-1;;;;;39799:15:0;;39781;39799;;;:9;:15;;;;;;;;39815:10;39799:27;;;;;;;;-1:-1:-1;;39847:28:0;;39843:101;;39924:20;39934:10;39924:7;:20;:::i;:::-;-1:-1:-1;;;;;39894:15:0;;;;;;:9;:15;;;;;;;;39910:10;39894:27;;;;;;;:50;39843:101;39961:31;39971:4;39977:2;39981:10;39961:9;:31::i;:::-;;39766:238;38423:1581;38295:1716;;;:::o;40307:405::-;40431:26;40444:4;40450:2;40454;40431:12;:26::i;:::-;-1:-1:-1;;;;;40488:14:0;;;:19;;;;:154;;-1:-1:-1;40524:61:0;;-1:-1:-1;;;40524:61:0;;;40560:10;40524:61;;;7220:34:1;-1:-1:-1;;;;;7290:15:1;;;7270:18;;;7263:43;7322:18;;;7315:34;;;7385:3;7365:18;;;7358:31;-1:-1:-1;7405:19:1;;;7398:30;40602:40:0;;40524:35;;;;40602:40;;7445:19:1;;40524:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;40524:118:0;;;40488:154;40470:235;;;40676:17;;-1:-1:-1;;;40676:17:0;;;;;;;;;;;45643:158;29070:13;:11;:13::i;:::-;45763:30:::1;45778:5;45785:7;45763:14;:30::i;:::-;45643:158:::0;;:::o;36575:111::-;29070:13;:11;:13::i;:::-;-1:-1:-1;;;;;36653:17:0;;;::::1;;::::0;;;:9:::1;:17;::::0;;;;:25;;-1:-1:-1;;36653:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36575:111::o;36758:193::-;36816:13;36850:12;;;:8;:12;;;;;;-1:-1:-1;;;;;36850:12:0;;36875:69;;36922:10;;-1:-1:-1;;;36922:10:0;;;;;;;;;;;36875:69;36758:193;;;:::o;29859:103::-;29070:13;:11;:13::i;:::-;29924:30:::1;29951:1;29924:18;:30::i;:::-;29859:103::o:0;32496:235::-;31664:13;;24345:10;;-1:-1:-1;;;;;31664:13:0;32593:24;;32589:98;;32641:34;;-1:-1:-1;;;32641:34:0;;-1:-1:-1;;;;;1019:32:1;;32641:34:0;;;1001:51:1;974:18;;32641:34:0;;;;;;;;32589:98;32697:26;32716:6;32697:18;:26::i;:::-;32538:193;32496:235::o;34758:20::-;;;;;;;:::i;37939:207::-;38042:10;38025:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;38025:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;38025:49:0;;;;;;;;;;38092:46;;1640:41:1;;;38025:38:0;;38042:10;38092:46;;1613:18:1;38092:46:0;;;;;;;37939:207;;:::o;40070:160::-;40165:4;40189:33;40199:10;40211:2;40215:6;40189:9;:33::i;:::-;40182:40;40070:160;-1:-1:-1;;;40070:160:0:o;40807:437::-;40961:26;40974:4;40980:2;40984;40961:12;:26::i;:::-;-1:-1:-1;;;;;41018:14:0;;;:19;;;;:156;;-1:-1:-1;41054:63:0;;-1:-1:-1;;;41054:63:0;;;41134:40;-1:-1:-1;;;;;41054:35:0;;;41134:40;;41054:63;;41090:10;;41102:4;;41108:2;;41112:4;;;;41054:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;41054:120:0;;;41018:156;41000:237;;;41208:17;;-1:-1:-1;;;41208:17:0;;;;;;;;;;;44692:86;29070:13;:11;:13::i;:::-;44751:12:::1;:19:::0;;-1:-1:-1;;44751:19:0::1;44766:4;44751:19;::::0;;44692:86::o;45809:190::-;45869:13;45931:1;45908:12;45902:26;;;;;:::i;:::-;;;:30;:89;;;;;;;;;;;;;;;;;45949:12;45963:13;:2;:11;:13::i;:::-;45935:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45895:96;45809:190;-1:-1:-1;;45809:190:0:o;43681:26::-;;;;;;;:::i;45529:106::-;29070:13;:11;:13::i;:::-;45603:12:::1;:24;45618:9:::0;45603:12;:24:::1;:::i;44786:86::-:0;29070:13;:11;:13::i;:::-;44844:12:::1;:20:::0;;-1:-1:-1;;44844:20:0::1;::::0;;44786:86::o;31884:181::-;29070:13;:11;:13::i;:::-;31974::::1;:24:::0;;-1:-1:-1;;;;;31974:24:0;::::1;-1:-1:-1::0;;;;;;31974:24:0;;::::1;::::0;::::1;::::0;;;32039:7:::1;29230::::0;29257:6;-1:-1:-1;;;;;29257:6:0;;29184:87;32039:7:::1;-1:-1:-1::0;;;;;32014:43:0::1;;;;;;;;;;;31884:181:::0;:::o;29349:166::-;29230:7;29257:6;-1:-1:-1;;;;;29257:6:0;24345:10;29409:23;29405:103;;29456:40;;-1:-1:-1;;;29456:40:0;;24345:10;29456:40;;;1001:51:1;974:18;;29456:40:0;855:203:1;42452:92:0;42495:7;42522:14;42528:8;42522:2;:14;:::i;:::-;42515:21;;42452:92;:::o;44880:641::-;45024:4;26091:19;:17;:19::i;:::-;45043:12:::1;::::0;::::1;;45040:87;;;45088:7;;45079:6;:16;45071:44;;;::::0;-1:-1:-1;;;45071:44:0;;13368:2:1;45071:44:0::1;::::0;::::1;13350:21:1::0;13407:2;13387:18;;;13380:30;-1:-1:-1;;;13426:18:1;;;13419:45;13481:18;;45071:44:0::1;13166:339:1::0;45071:44:0::1;-1:-1:-1::0;;;;;45141:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;::::1;;45137:163;;-1:-1:-1::0;;;;;45172:19:0;::::1;;::::0;;;:13:::1;:19;::::0;;;;:29;;45195:6;;45172:19;:29:::1;::::0;45195:6;;45172:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;45247:9:0::1;::::0;-1:-1:-1;;;;;45224:19:0;::::1;;::::0;;;:13:::1;:19;::::0;;;;;:32:::1;;45216:72;;;::::0;-1:-1:-1;;;45216:72:0;;13842:2:1;45216:72:0::1;::::0;::::1;13824:21:1::0;13881:2;13861:18;;;13854:30;13920:29;13900:18;;;13893:57;13967:18;;45216:72:0::1;13640:351:1::0;45216:72:0::1;-1:-1:-1::0;;;;;45314:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;;::::1;;45310:153;;-1:-1:-1::0;;;;;45343:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;:26;;45363:6;;45343:16;:26:::1;::::0;45363:6;;45343:26:::1;:::i;:::-;::::0;;;-1:-1:-1;;45412:8:0::1;::::0;-1:-1:-1;;;;;45392:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;;:28:::1;;45384:67;;;::::0;-1:-1:-1;;;45384:67:0;;14198:2:1;45384:67:0::1;::::0;::::1;14180:21:1::0;14237:2;14217:18;;;14210:30;14276:28;14256:18;;;14249:56;14322:18;;45384:67:0::1;13996:350:1::0;45384:67:0::1;45480:33;45496:4;45502:2;45506:6;45480:15;:33::i;:::-;45473:40:::0;44880:641;-1:-1:-1;;;;44880:641:0:o;43415:160::-;43528:4;:12;43535:5;43528:4;:12;:::i;:::-;-1:-1:-1;43551:6:0;:16;43560:7;43551:6;:16;:::i;32255:156::-;32345:13;32338:20;;-1:-1:-1;;;;;;32338:20:0;;;32369:34;32394:8;32369:24;:34::i;21035:718::-;21091:13;21142:14;21159:17;21170:5;21159:10;:17::i;:::-;21179:1;21159:21;21142:38;;21195:20;21229:6;21218:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21218:18:0;-1:-1:-1;21195:41:0;-1:-1:-1;21360:28:0;;;21376:2;21360:28;21417:290;-1:-1:-1;;21449:5:0;-1:-1:-1;;;21586:2:0;21575:14;;21570:32;21449:5;21557:46;21649:2;21640:11;;;-1:-1:-1;21670:21:0;21417:290;21670:21;-1:-1:-1;21728:6:0;21035:718;-1:-1:-1;;;21035:718:0:o;26645:132::-;26557:7;;;;26707:63;;;26743:15;;-1:-1:-1;;;26743:15:0;;;;;;;;;;;41312:1101;41433:4;41450:12;41465:10;:8;:10::i;:::-;-1:-1:-1;;;;;41516:15:0;;;41486:27;41516:15;;;:9;:15;;;;;;;;41574:13;;;;;;;;;41600:15;;;41450:25;;-1:-1:-1;41516:15:0;;41574:13;;41619:6;;41516:15;41600:25;41619:6;41516:15;41600:25;:::i;:::-;;;;-1:-1:-1;;;;;;;41663:13:0;;;;;;;:9;:13;;;;;;;;:23;;;;;;41771:15;;;;;:9;:15;;;;;;41766:251;;-1:-1:-1;;;;;41877:15:0;;41803:22;41877:15;;;:9;:15;;;;;;:22;;41895:4;;41877:22;:::i;:::-;41829:26;41851:4;41829:19;:26;:::i;:::-;41828:72;;;;:::i;:::-;41803:97;;41920:9;41915:91;41939:14;41935:1;:18;41915:91;;;41979:11;41985:4;41979:5;:11::i;:::-;41955:3;;41915:91;;;;41788:229;41766:251;-1:-1:-1;;;;;42093:13:0;;;;;;:9;:13;;;;;;;;42088:247;;42123:22;42191:28;42215:4;42191:21;:28;:::i;:::-;-1:-1:-1;;;;;42149:13:0;;;;;;:9;:13;;;;;;:20;;42165:4;;42149:20;:::i;:::-;42148:72;;;;:::i;:::-;42123:97;;42240:9;42235:89;42259:14;42255:1;:18;42235:89;;;42299:9;42305:2;42299:5;:9::i;:::-;42275:3;;42235:89;;;;42108:227;42088:247;42372:2;-1:-1:-1;;;;;42352:31:0;42366:4;-1:-1:-1;;;;;42352:31:0;;42376:6;42352:31;;;;1838:25:1;;1826:2;1811:18;;1692:177;42352:31:0;;;;;;;;-1:-1:-1;42401:4:0;;41312:1101;-1:-1:-1;;;;;;41312:1101:0:o;30497:191::-;30571:16;30590:6;;-1:-1:-1;;;;;30607:17:0;;;-1:-1:-1;;;;;;30607:17:0;;;;;;30640:40;;30590:6;;;;;;;30640:40;;30571:16;30640:40;30560:128;30497:191;:::o;17439:948::-;17492:7;;-1:-1:-1;;;17570:17:0;;17566:106;;-1:-1:-1;;;17608:17:0;;;-1:-1:-1;17654:2:0;17644:12;17566:106;17699:8;17690:5;:17;17686:106;;17737:8;17728:17;;;-1:-1:-1;17774:2:0;17764:12;17686:106;17819:8;17810:5;:17;17806:106;;17857:8;17848:17;;;-1:-1:-1;17894:2:0;17884:12;17806:106;17939:7;17930:5;:16;17926:103;;17976:7;17967:16;;;-1:-1:-1;18012:1:0;18002:11;17926:103;18056:7;18047:5;:16;18043:103;;18093:7;18084:16;;;-1:-1:-1;18129:1:0;18119:11;18043:103;18173:7;18164:5;:16;18160:103;;18210:7;18201:16;;;-1:-1:-1;18246:1:0;18236:11;18160:103;18290:7;18281:5;:16;18277:68;;18328:1;18318:11;18373:6;17439:948;-1:-1:-1;;17439:948:0:o;43034:373::-;-1:-1:-1;;;;;43095:18:0;;43091:73;;43137:15;;-1:-1:-1;;;43137:15:0;;;;;;;;;;;43091:73;-1:-1:-1;;;;;43189:12:0;;43176:10;43189:12;;;:6;:12;;;;;43202:19;;:23;;43224:1;;43202:23;:::i;:::-;43189:37;;;;;;;;:::i;:::-;;;;;;;;;43176:50;;43237:6;:12;43244:4;-1:-1:-1;;;;;43237:12:0;-1:-1:-1;;;;;43237:12:0;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;43237:18:0;;;;;;;;;;;;43273:15;;;:11;:15;;;;;;43266:22;;;43306:8;:12;;;;;43299:19;;-1:-1:-1;;;;;;43299:19:0;;;;;;43336:11;:15;;;;;;43329:22;;;;;;;;43369:30;43285:2;;43237:18;-1:-1:-1;;;;;43369:30:0;;;;;43237:18;;43369:30;43080:327;43034:373;:::o;44569:115::-;26091:19;:17;:19::i;:::-;44661:15:::1;44673:2;-1:-1:-1::0;;;;;42611:16:0;;42607:74;;42651:18;;-1:-1:-1;;;42651:18:0;;;;;;;;;;;42607:74;42718:6;:8;;;;;;;;:6;42786:12;;;:8;:12;;;;;;-1:-1:-1;;;;;42786:12:0;:26;42782:81;;42836:15;;-1:-1:-1;;;42836:15:0;;;;;;;;;;;42782:81;42875:12;;;;:8;:12;;;;;;;;:17;;-1:-1:-1;;;;;;42875:17:0;-1:-1:-1;;;;;42875:17:0;;;;;;;;42903:10;;;:6;:10;;;;;:19;;-1:-1:-1;42903:19:0;;;;;;;;;;;;;;;42951:10;;:17;;:21;;-1:-1:-1;42951:21:0;:::i;:::-;42933:15;;;;:11;:15;;;;;;:39;;;;42990:28;;42945:2;;-1:-1:-1;;;;;42990:28:0;;;;;42933:15;;42990:28;42596:430;42552:474;:::o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:180::-;729:6;782:2;770:9;761:7;757:23;753:32;750:52;;;798:1;795;788:12;750:52;-1:-1:-1;821:23:1;;670:180;-1:-1:-1;670:180:1:o;1063:173::-;1131:20;;-1:-1:-1;;;;;1180:31:1;;1170:42;;1160:70;;1226:1;1223;1216:12;1241:254;1309:6;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;1485:2;1470:18;;;;1457:32;;-1:-1:-1;;;1241:254:1:o;1874:248::-;1942:6;1950;2003:2;1991:9;1982:7;1978:23;1974:32;1971:52;;;2019:1;2016;2009:12;1971:52;-1:-1:-1;;2042:23:1;;;2112:2;2097:18;;;2084:32;;-1:-1:-1;1874:248:1:o;2127:328::-;2204:6;2212;2220;2273:2;2261:9;2252:7;2248:23;2244:32;2241:52;;;2289:1;2286;2279:12;2241:52;2312:29;2331:9;2312:29;:::i;:::-;2302:39;;2360:38;2394:2;2383:9;2379:18;2360:38;:::i;:::-;2350:48;;2445:2;2434:9;2430:18;2417:32;2407:42;;2127:328;;;;;:::o;2649:127::-;2710:10;2705:3;2701:20;2698:1;2691:31;2741:4;2738:1;2731:15;2765:4;2762:1;2755:15;2781:719;2824:5;2877:3;2870:4;2862:6;2858:17;2854:27;2844:55;;2895:1;2892;2885:12;2844:55;2931:6;2918:20;2957:18;2994:2;2990;2987:10;2984:36;;;3000:18;;:::i;:::-;3075:2;3069:9;3043:2;3129:13;;-1:-1:-1;;3125:22:1;;;3149:2;3121:31;3117:40;3105:53;;;3173:18;;;3193:22;;;3170:46;3167:72;;;3219:18;;:::i;:::-;3259:10;3255:2;3248:22;3294:2;3286:6;3279:18;3340:3;3333:4;3328:2;3320:6;3316:15;3312:26;3309:35;3306:55;;;3357:1;3354;3347:12;3306:55;3421:2;3414:4;3406:6;3402:17;3395:4;3387:6;3383:17;3370:54;3468:1;3461:4;3456:2;3448:6;3444:15;3440:26;3433:37;3488:6;3479:15;;;;;;2781:719;;;;:::o;3505:543::-;3593:6;3601;3654:2;3642:9;3633:7;3629:23;3625:32;3622:52;;;3670:1;3667;3660:12;3622:52;3710:9;3697:23;3739:18;3780:2;3772:6;3769:14;3766:34;;;3796:1;3793;3786:12;3766:34;3819:50;3861:7;3852:6;3841:9;3837:22;3819:50;:::i;:::-;3809:60;;3922:2;3911:9;3907:18;3894:32;3878:48;;3951:2;3941:8;3938:16;3935:36;;;3967:1;3964;3957:12;3935:36;;3990:52;4034:7;4023:8;4012:9;4008:24;3990:52;:::i;:::-;3980:62;;;3505:543;;;;;:::o;4053:347::-;4118:6;4126;4179:2;4167:9;4158:7;4154:23;4150:32;4147:52;;;4195:1;4192;4185:12;4147:52;4218:29;4237:9;4218:29;:::i;:::-;4208:39;;4297:2;4286:9;4282:18;4269:32;4344:5;4337:13;4330:21;4323:5;4320:32;4310:60;;4366:1;4363;4356:12;4310:60;4389:5;4379:15;;;4053:347;;;;;:::o;4405:186::-;4464:6;4517:2;4505:9;4496:7;4492:23;4488:32;4485:52;;;4533:1;4530;4523:12;4485:52;4556:29;4575:9;4556:29;:::i;4596:808::-;4693:6;4701;4709;4717;4725;4778:3;4766:9;4757:7;4753:23;4749:33;4746:53;;;4795:1;4792;4785:12;4746:53;4818:29;4837:9;4818:29;:::i;:::-;4808:39;;4866:38;4900:2;4889:9;4885:18;4866:38;:::i;:::-;4856:48;;4951:2;4940:9;4936:18;4923:32;4913:42;;5006:2;4995:9;4991:18;4978:32;5029:18;5070:2;5062:6;5059:14;5056:34;;;5086:1;5083;5076:12;5056:34;5124:6;5113:9;5109:22;5099:32;;5169:7;5162:4;5158:2;5154:13;5150:27;5140:55;;5191:1;5188;5181:12;5140:55;5231:2;5218:16;5257:2;5249:6;5246:14;5243:34;;;5273:1;5270;5263:12;5243:34;5318:7;5313:2;5304:6;5300:2;5296:15;5292:24;5289:37;5286:57;;;5339:1;5336;5329:12;5286:57;4596:808;;;;-1:-1:-1;4596:808:1;;-1:-1:-1;5370:2:1;5362:11;;5392:6;4596:808;-1:-1:-1;;;4596:808:1:o;5409:260::-;5477:6;5485;5538:2;5526:9;5517:7;5513:23;5509:32;5506:52;;;5554:1;5551;5544:12;5506:52;5577:29;5596:9;5577:29;:::i;:::-;5567:39;;5625:38;5659:2;5648:9;5644:18;5625:38;:::i;:::-;5615:48;;5409:260;;;;;:::o;5674:322::-;5743:6;5796:2;5784:9;5775:7;5771:23;5767:32;5764:52;;;5812:1;5809;5802:12;5764:52;5852:9;5839:23;5885:18;5877:6;5874:30;5871:50;;;5917:1;5914;5907:12;5871:50;5940;5982:7;5973:6;5962:9;5958:22;5940:50;:::i;6001:380::-;6080:1;6076:12;;;;6123;;;6144:61;;6198:4;6190:6;6186:17;6176:27;;6144:61;6251:2;6243:6;6240:14;6220:18;6217:38;6214:161;;6297:10;6292:3;6288:20;6285:1;6278:31;6332:4;6329:1;6322:15;6360:4;6357:1;6350:15;6214:161;;6001:380;;;:::o;6386:127::-;6447:10;6442:3;6438:20;6435:1;6428:31;6478:4;6475:1;6468:15;6502:4;6499:1;6492:15;6518:128;6585:9;;;6606:11;;;6603:37;;;6620:18;;:::i;6651:127::-;6712:10;6707:3;6703:20;6700:1;6693:31;6743:4;6740:1;6733:15;6767:4;6764:1;6757:15;6783:127;6844:10;6839:3;6835:20;6832:1;6825:31;6875:4;6872:1;6865:15;6899:4;6896:1;6889:15;7475:290;7544:6;7597:2;7585:9;7576:7;7572:23;7568:32;7565:52;;;7613:1;7610;7603:12;7565:52;7639:16;;-1:-1:-1;;;;;;7684:32:1;;7674:43;;7664:71;;7731:1;7728;7721:12;7770:662;-1:-1:-1;;;;;8049:15:1;;;8031:34;;8101:15;;8096:2;8081:18;;8074:43;8148:2;8133:18;;8126:34;;;8196:3;8191:2;8176:18;;8169:31;;;8216:19;;8209:35;;;7974:4;8237:6;8287;8011:3;8266:19;;8253:49;8352:1;8346:3;8337:6;8326:9;8322:22;8318:32;8311:43;8422:3;8415:2;8411:7;8406:2;8398:6;8394:15;8390:29;8379:9;8375:45;8371:55;8363:63;;7770:662;;;;;;;;:::o;8563:1177::-;8829:3;8858:1;8891:6;8885:13;8921:36;8947:9;8921:36;:::i;:::-;8976:1;8993:17;;;9019:133;;;;9166:1;9161:358;;;;8986:533;;9019:133;-1:-1:-1;;9052:24:1;;9040:37;;9125:14;;9118:22;9106:35;;9097:45;;;-1:-1:-1;9019:133:1;;9161:358;9192:6;9189:1;9182:17;9222:4;9267;9264:1;9254:18;9294:1;9308:165;9322:6;9319:1;9316:13;9308:165;;;9400:14;;9387:11;;;9380:35;9443:16;;;;9337:10;;9308:165;;;9312:3;;;9502:6;9497:3;9493:16;9486:23;;8986:533;;;;;9550:6;9544:13;9566:68;9625:8;9620:3;9613:4;9605:6;9601:17;9566:68;:::i;:::-;-1:-1:-1;;;9656:18:1;;9683:22;;;9732:1;9721:13;;8563:1177;-1:-1:-1;;;;8563:1177:1:o;9745:518::-;9847:2;9842:3;9839:11;9836:421;;;9883:5;9880:1;9873:16;9927:4;9924:1;9914:18;9997:2;9985:10;9981:19;9978:1;9974:27;9968:4;9964:38;10033:4;10021:10;10018:20;10015:47;;;-1:-1:-1;10056:4:1;10015:47;10111:2;10106:3;10102:12;10099:1;10095:20;10089:4;10085:31;10075:41;;10166:81;10184:2;10177:5;10174:13;10166:81;;;10243:1;10229:16;;10210:1;10199:13;10166:81;;10439:1345;10565:3;10559:10;10592:18;10584:6;10581:30;10578:56;;;10614:18;;:::i;:::-;10643:97;10733:6;10693:38;10725:4;10719:11;10693:38;:::i;:::-;10687:4;10643:97;:::i;:::-;10795:4;;10852:2;10841:14;;10869:1;10864:663;;;;11571:1;11588:6;11585:89;;;-1:-1:-1;11640:19:1;;;11634:26;11585:89;-1:-1:-1;;10396:1:1;10392:11;;;10388:24;10384:29;10374:40;10420:1;10416:11;;;10371:57;11687:81;;10834:944;;10864:663;8510:1;8503:14;;;8547:4;8534:18;;-1:-1:-1;;10900:20:1;;;11018:236;11032:7;11029:1;11026:14;11018:236;;;11121:19;;;11115:26;11100:42;;11213:27;;;;11181:1;11169:14;;;;11048:19;;11018:236;;;11022:3;11282:6;11273:7;11270:19;11267:201;;;11343:19;;;11337:26;-1:-1:-1;;11426:1:1;11422:14;;;11438:3;11418:24;11414:37;11410:42;11395:58;11380:74;;11267:201;;;11514:1;11505:6;11502:1;11498:14;11494:22;11488:4;11481:36;10834:944;;;;;10439:1345;;:::o;11789:416::-;11878:1;11915:5;11878:1;11929:270;11950:7;11940:8;11937:21;11929:270;;;12009:4;12005:1;12001:6;11997:17;11991:4;11988:27;11985:53;;;12018:18;;:::i;:::-;12068:7;12058:8;12054:22;12051:55;;;12088:16;;;;12051:55;12167:22;;;;12127:15;;;;11929:270;;;11933:3;11789:416;;;;;:::o;12210:806::-;12259:5;12289:8;12279:80;;-1:-1:-1;12330:1:1;12344:5;;12279:80;12378:4;12368:76;;-1:-1:-1;12415:1:1;12429:5;;12368:76;12460:4;12478:1;12473:59;;;;12546:1;12541:130;;;;12453:218;;12473:59;12503:1;12494:10;;12517:5;;;12541:130;12578:3;12568:8;12565:17;12562:43;;;12585:18;;:::i;:::-;-1:-1:-1;;12641:1:1;12627:16;;12656:5;;12453:218;;12755:2;12745:8;12742:16;12736:3;12730:4;12727:13;12723:36;12717:2;12707:8;12704:16;12699:2;12693:4;12690:12;12686:35;12683:77;12680:159;;;-1:-1:-1;12792:19:1;;;12824:5;;12680:159;12871:34;12896:8;12890:4;12871:34;:::i;:::-;12941:6;12937:1;12933:6;12929:19;12920:7;12917:32;12914:58;;;12952:18;;:::i;:::-;12990:20;;12210:806;-1:-1:-1;;;12210:806:1:o;13021:140::-;13079:5;13108:47;13149:4;13139:8;13135:19;13129:4;13108:47;:::i;13510:125::-;13575:9;;;13596:10;;;13593:36;;;13609:18;;:::i;14483:217::-;14523:1;14549;14539:132;;14593:10;14588:3;14584:20;14581:1;14574:31;14628:4;14625:1;14618:15;14656:4;14653:1;14646:15;14539:132;-1:-1:-1;14685:9:1;;14483:217::o
Swarm Source
ipfs://4e3bf2f81c4ec811bcb0e78159f20cc9547e8b049badfd77b9642ee1ab7b211b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.