Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
10,000 DEFROGS
Holders
1,340
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5.000000000000000002 DEFROGSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
DeFrogs
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-02-06 */ //SPDX-License-Identifier: UNLICENSED /* The Official DeFrogs Contract - ERC404 ██████╗ ███████╗███████╗██████╗ ██████╗ ██████╗ ███████╗ ██╔══██╗██╔════╝██╔════╝██╔══██╗██╔═══██╗██╔════╝ ██╔════╝ ██║ ██║█████╗ █████╗ ██████╔╝██║ ██║██║ ███╗███████╗ ██║ ██║██╔══╝ ██╔══╝ ██╔══██╗██║ ██║██║ ██║╚════██║ ██████╔╝███████╗██║ ██║ ██║╚██████╔╝╚██████╔╝███████║ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝ */ 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/Defrogs.sol contract DeFrogs 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("DeFrogs", "DEFROGS", _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
60c060405234801562000010575f80fd5b506040516200236338038062002363833981016040819052620000339162000212565b60405180604001604052806007815260200166446546726f677360c81b81525060405180604001604052806007815260200166444546524f475360c81b815250848688805f6001600160a01b0316816001600160a01b031603620000b057604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000bb81620001a5565b506002620000ca868262000313565b506003620000d9858262000313565b5060ff83166080819052620000f090600a620004ee565b620000fc908362000505565b60a0525050600d805460ff1916905550506001600e55506200012083600a620004ee565b6200012c908562000505565b6001600160a01b0386165f908152600560205260409020556200015183600a620004ee565b6200015d908362000505565b6010556200016d83600a620004ee565b62000179908262000505565b6011556200018983600a620004ee565b6200019690600a62000505565b601255506200051f9350505050565b600180546001600160a01b0319169055620001c081620001c3565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f805f805f60a0868803121562000227575f80fd5b85516001600160a01b03811681146200023e575f80fd5b60208701516040880151919650945060ff811681146200025c575f80fd5b6060870151608090970151959894975095949392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200029e57607f821691505b602082108103620002bd57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200030e57805f5260205f20601f840160051c81016020851015620002ea5750805b601f840160051c820191505b818110156200030b575f8155600101620002f6565b50505b505050565b81516001600160401b038111156200032f576200032f62000275565b620003478162000340845462000289565b84620002c3565b602080601f8311600181146200037d575f8415620003655750858301515b5f19600386901b1c1916600185901b178555620003d7565b5f85815260208120601f198616915b82811015620003ad578886015182559484019460019091019084016200038c565b5085821015620003cb57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200043357815f1904821115620004175762000417620003df565b808516156200042557918102915b93841c9390800290620003f8565b509250929050565b5f826200044b57506001620004e8565b816200045957505f620004e8565b81600181146200047257600281146200047d576200049d565b6001915050620004e8565b60ff841115620004915762000491620003df565b50506001821b620004e8565b5060208310610133831016604e8410600b8410161715620004c2575081810a620004e8565b620004ce8383620003f3565b805f1904821115620004e457620004e4620003df565b0290505b92915050565b5f620004fe60ff8416836200043b565b9392505050565b8082028115828204841417620004e857620004e8620003df565b60805160a051611e1b620005485f395f6102a801525f81816103120152610f040152611e1b5ff3fe608060405234801561000f575f80fd5b506004361061021e575f3560e01c8063715018a61161012a578063c87b56dd116100b4578063e30c397811610079578063e30c3978146104e2578063e985e9c5146104f3578063f0306ea414610520578063f2fde38b14610528578063f349b1731461053b575f80fd5b8063c87b56dd1461046b578063d547cfb71461047e578063dd62ed3e14610486578063e0df5b6f146104b0578063e2d6f33a146104c3575f80fd5b80639b19251a116100fa5780639b19251a14610408578063a22cb4651461042a578063a9059cbb1461043d578063b88d4fde14610450578063c6a6035a14610463575f80fd5b8063715018a6146103e057806379ba5097146103e85780638da5cb5b146103f057806395d89b4114610400575f80fd5b80634f02c420116101ab578063589210d91161017b578063589210d9146103915780635c975abb1461039a5780636352211e146103a55780636caae832146103b857806370a08231146103c1575f80fd5b80634f02c420146103595780634f91e48c14610362578063504334c21461036b57806353d6fd591461037e575f80fd5b80631e70b6df116101f15780631e70b6df146102d8578063207add91146102e557806323b872dd146102fa578063313ce5671461030d57806342842e0e14610346575f80fd5b806306fdde0314610222578063081812fc14610240578063095ea7b31461028057806318160ddd146102a3575b5f80fd5b61022a61055a565b6040516102379190611709565b60405180910390f35b61026861024e36600461173b565b60076020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610237565b61029361028e366004611768565b6105e6565b6040519015158152602001610237565b6102ca7f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610237565b6015546102939060ff1681565b6102f86102f3366004611790565b610731565b005b6102f86103083660046117b0565b610744565b6103347f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610237565b6102f86103543660046117b0565b610ac0565b6102ca60045481565b6102ca60115481565b6102f8610379366004611886565b610b91565b6102f861038c3660046118e6565b610ba7565b6102ca60105481565b600d5460ff16610293565b6102686103b336600461173b565b610bd9565b6102ca60125481565b6102ca6103cf36600461191f565b60056020525f908152604090205481565b6102f8610c13565b6102f8610c26565b5f546001600160a01b0316610268565b61022a610c6f565b61029361041636600461191f565b600c6020525f908152604090205460ff1681565b6102f86104383660046118e6565b610c7c565b61029361044b366004611768565b610ce7565b6102f861045e366004611938565b610cfa565b6102f8610dba565b61022a61047936600461173b565b610dd1565b61022a610e2d565b6102ca6104943660046119cb565b600660209081525f928352604080842090915290825290205481565b6102f86104be3660046119fc565b610e3a565b6102ca6104d136600461191f565b60136020525f908152604090205481565b6001546001600160a01b0316610268565b6102936105013660046119cb565b600860209081525f928352604080842090915290825290205460ff1681565b6102f8610e4e565b6102f861053636600461191f565b610e62565b6102ca61054936600461191f565b60146020525f908152604090205481565b6002805461056790611a2e565b80601f016020809104026020016040519081016040528092919081815260200182805461059390611a2e565b80156105de5780601f106105b5576101008083540402835291602001916105de565b820191905f5260205f20905b8154815290600101906020018083116105c157829003601f168201915b505050505081565b5f60045482111580156105f857505f82115b156106cc575f828152600960205260409020546001600160a01b031633811480159061064757506001600160a01b0381165f90815260086020908152604080832033845290915290205460ff16155b15610664576040516282b42960e81b815260040160405180910390fd5b5f8381526007602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610727565b335f8181526006602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b610739610ed2565b601091909155601155565b6004548111610a54575f818152600960205260409020546001600160a01b0384811691161461078657604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0382166107ad57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b038416148015906107e957506001600160a01b0383165f90815260086020908152604080832033845290915290205460ff16155b801561080b57505f818152600760205260409020546001600160a01b03163314155b15610828576040516282b42960e81b815260040160405180910390fd5b610830610efe565b6001600160a01b0384165f9081526005602052604081208054909190610857908490611a7a565b909155506108659050610efe565b6001600160a01b038084165f81815260056020908152604080832080549096019095558582526009815284822080546001600160a01b031990811690941790556007815284822080549093169092559186168252600a905290812080546108ce90600190611a7a565b815481106108de576108de611a8d565b5f9182526020808320909101546001600160a01b0387168352600a82526040808420868552600b9093529092205481549293508392811061092157610921611a8d565b5f9182526020808320909101929092556001600160a01b0386168152600a9091526040902080548061095557610955611aa1565b5f828152602080822083015f19908101839055909201909255838252600b8152604080832054848452818420556001600160a01b038616808452600a835290832080546001818101835582865293852001869055925290546109b79190611a7a565b5f838152600b602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610a3d610efe565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526006602090815260408083203384529091529020545f198114610aad57610a898282611a7a565b6001600160a01b0385165f9081526006602090815260408083203384529091529020555b610ab8848484610f2f565b50505b505050565b610acb838383610744565b6001600160a01b0382163b15801590610b735750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610b42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b669190611ab5565b6001600160e01b03191614155b15610abb57604051633da6393160e01b815260040160405180910390fd5b610b99610ed2565b610ba38282611101565b5050565b610baf610ed2565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b5f818152600960205260409020546001600160a01b031680610c0e5760405163c5723b5160e01b815260040160405180910390fd5b919050565b610c1b610ed2565b610c245f61111a565b565b60015433906001600160a01b03168114610c635760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b610c6c8161111a565b50565b6003805461056790611a2e565b335f8181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610cf3338484610f2f565b9392505050565b610d05858585610744565b6001600160a01b0384163b15801590610d9c5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d4f9033908a90899089908990600401611adc565b6020604051808303815f875af1158015610d6b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8f9190611ab5565b6001600160e01b03191614155b15610ab857604051633da6393160e01b815260040160405180910390fd5b610dc2610ed2565b6015805460ff19166001179055565b60605f600f8054610de190611a2e565b905011610dfc5760405180602001604052805f81525061072b565b600f610e0783611133565b604051602001610e18929190611b2e565b60405160208183030381529060405292915050565b600f805461056790611a2e565b610e42610ed2565b600f610ba38282611c05565b610e56610ed2565b6015805460ff19169055565b610e6a610ed2565b600180546001600160a01b0383166001600160a01b03199091168117909155610e9a5f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b03163314610c245760405163118cdaa760e01b8152336004820152602401610c5a565b5f610f2a7f0000000000000000000000000000000000000000000000000000000000000000600a611da5565b905090565b5f610f386111c3565b60155460ff1615610f86576012548210610f865760405162461bcd60e51b815260206004820152600f60248201526e195e18d95959081d1e081b1a5b5a5d608a1b6044820152606401610c5a565b6001600160a01b0384165f908152600c602052604090205460ff1661103a576001600160a01b0384165f9081526014602052604081208054849290610fcc908490611db3565b90915550506011546001600160a01b0385165f90815260146020526040902054111561103a5760405162461bcd60e51b815260206004820152601b60248201527f6e6f7420616c6c6f77656420616e796d6f726520746f2073656c6c00000000006044820152606401610c5a565b6001600160a01b0383165f908152600c602052604090205460ff166110ee576001600160a01b0383165f9081526013602052604081208054849290611080908490611db3565b90915550506010546001600160a01b0384165f9081526013602052604090205411156110ee5760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420616c6c6f77656420616e796d6f726520746f206275790000000000006044820152606401610c5a565b6110f98484846111e7565b949350505050565b600261110d8382611c05565b506003610abb8282611c05565b600180546001600160a01b0319169055610c6c8161138c565b60605f61113f836113db565b60010190505f8167ffffffffffffffff81111561115e5761115e6117e9565b6040519080825280601f01601f191660200182016040528015611188576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461119257509392505050565b600d5460ff1615610c245760405163d93c066560e01b815260040160405180910390fd5b5f806111f1610efe565b6001600160a01b038087165f818152600560205260408082208054948a168352908220549282529394509192909186919061122c8386611a7a565b90915550506001600160a01b038087165f90815260056020908152604080832080548a019055928a168252600c9052205460ff166112bb576001600160a01b0387165f90815260056020526040812054611287908590611dc6565b6112918585611dc6565b61129b9190611a7a565b90505f5b818110156112b8576112b0896114b2565b60010161129f565b50505b6001600160a01b0386165f908152600c602052604090205460ff16611332575f6112e58483611dc6565b6001600160a01b0388165f90815260056020526040902054611308908690611dc6565b6113129190611a7a565b90505f5b8181101561132f57611327886115d3565b600101611316565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161137791815260200190565b60405180910390a35060019695505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106114195772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611445576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061146357662386f26fc10000830492506010015b6305f5e100831061147b576305f5e100830492506008015b612710831061148f57612710830492506004015b606483106114a1576064830492506002015b600a831061072b5760010192915050565b6001600160a01b0381166114d957604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f908152600a6020526040812080546114fe90600190611a7a565b8154811061150e5761150e611a8d565b905f5260205f2001549050600a5f836001600160a01b03166001600160a01b031681526020019081526020015f2080548061154b5761154b611aa1565b5f828152602080822083015f19908101839055909201909255828252600b815260408083208390556009825280832080546001600160a01b031990811690915560079092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6115db6111c3565b610c6c816001600160a01b03811661160657604051634e46966960e11b815260040160405180910390fd5b60048054600101908190555f818152600960205260409020546001600160a01b0316156116465760405163119b4fd360e11b815260040160405180910390fd5b5f81815260096020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600a8352908320805460018181018355828652938520018590559252905461169d9190611a7a565b5f828152600b602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f5b838110156117015781810151838201526020016116e9565b50505f910152565b602081525f82518060208401526117278160408501602087016116e7565b601f01601f19169190910160400192915050565b5f6020828403121561174b575f80fd5b5035919050565b80356001600160a01b0381168114610c0e575f80fd5b5f8060408385031215611779575f80fd5b61178283611752565b946020939093013593505050565b5f80604083850312156117a1575f80fd5b50508035926020909101359150565b5f805f606084860312156117c2575f80fd5b6117cb84611752565b92506117d960208501611752565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261180c575f80fd5b813567ffffffffffffffff80821115611827576118276117e9565b604051601f8301601f19908116603f0116810190828211818310171561184f5761184f6117e9565b81604052838152866020858801011115611867575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611897575f80fd5b823567ffffffffffffffff808211156118ae575f80fd5b6118ba868387016117fd565b935060208501359150808211156118cf575f80fd5b506118dc858286016117fd565b9150509250929050565b5f80604083850312156118f7575f80fd5b61190083611752565b915060208301358015158114611914575f80fd5b809150509250929050565b5f6020828403121561192f575f80fd5b610cf382611752565b5f805f805f6080868803121561194c575f80fd5b61195586611752565b945061196360208701611752565b935060408601359250606086013567ffffffffffffffff80821115611986575f80fd5b818801915088601f830112611999575f80fd5b8135818111156119a7575f80fd5b8960208285010111156119b8575f80fd5b9699959850939650602001949392505050565b5f80604083850312156119dc575f80fd5b6119e583611752565b91506119f360208401611752565b90509250929050565b5f60208284031215611a0c575f80fd5b813567ffffffffffffffff811115611a22575f80fd5b6110f9848285016117fd565b600181811c90821680611a4257607f821691505b602082108103611a6057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561072b5761072b611a66565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215611ac5575f80fd5b81516001600160e01b031981168114610cf3575f80fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f808454611b3b81611a2e565b60018281168015611b535760018114611b6857611b94565b60ff1984168752821515830287019450611b94565b885f526020805f205f5b85811015611b8b5781548a820152908401908201611b72565b50505082870194505b505050508351611ba88183602088016116e7565b64173539b7b760d91b9101908152600501949350505050565b601f821115610abb57805f5260205f20601f840160051c81016020851015611be65750805b601f840160051c820191505b81811015610ab8575f8155600101611bf2565b815167ffffffffffffffff811115611c1f57611c1f6117e9565b611c3381611c2d8454611a2e565b84611bc1565b602080601f831160018114611c66575f8415611c4f5750858301515b5f19600386901b1c1916600185901b178555611cbd565b5f85815260208120601f198616915b82811015611c9457888601518255948401946001909101908401611c75565b5085821015611cb157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b600181815b80851115611cff57815f1904821115611ce557611ce5611a66565b80851615611cf257918102915b93841c9390800290611cca565b509250929050565b5f82611d155750600161072b565b81611d2157505f61072b565b8160018114611d375760028114611d4157611d5d565b600191505061072b565b60ff841115611d5257611d52611a66565b50506001821b61072b565b5060208310610133831016604e8410600b8410161715611d80575081810a61072b565b611d8a8383611cc5565b805f1904821115611d9d57611d9d611a66565b029392505050565b5f610cf360ff841683611d07565b8082018082111561072b5761072b611a66565b5f82611de057634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122004cc7641a3ea63305c725dcccd930a0137a73430e19b46bd64168922a5763b1e64736f6c63430008180033000000000000000000000000cac026da5ee667bc2074d26d7b9aedb3caea2f6b0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061021e575f3560e01c8063715018a61161012a578063c87b56dd116100b4578063e30c397811610079578063e30c3978146104e2578063e985e9c5146104f3578063f0306ea414610520578063f2fde38b14610528578063f349b1731461053b575f80fd5b8063c87b56dd1461046b578063d547cfb71461047e578063dd62ed3e14610486578063e0df5b6f146104b0578063e2d6f33a146104c3575f80fd5b80639b19251a116100fa5780639b19251a14610408578063a22cb4651461042a578063a9059cbb1461043d578063b88d4fde14610450578063c6a6035a14610463575f80fd5b8063715018a6146103e057806379ba5097146103e85780638da5cb5b146103f057806395d89b4114610400575f80fd5b80634f02c420116101ab578063589210d91161017b578063589210d9146103915780635c975abb1461039a5780636352211e146103a55780636caae832146103b857806370a08231146103c1575f80fd5b80634f02c420146103595780634f91e48c14610362578063504334c21461036b57806353d6fd591461037e575f80fd5b80631e70b6df116101f15780631e70b6df146102d8578063207add91146102e557806323b872dd146102fa578063313ce5671461030d57806342842e0e14610346575f80fd5b806306fdde0314610222578063081812fc14610240578063095ea7b31461028057806318160ddd146102a3575b5f80fd5b61022a61055a565b6040516102379190611709565b60405180910390f35b61026861024e36600461173b565b60076020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610237565b61029361028e366004611768565b6105e6565b6040519015158152602001610237565b6102ca7f00000000000000000000000000000000000000000000021e19e0c9bab240000081565b604051908152602001610237565b6015546102939060ff1681565b6102f86102f3366004611790565b610731565b005b6102f86103083660046117b0565b610744565b6103347f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610237565b6102f86103543660046117b0565b610ac0565b6102ca60045481565b6102ca60115481565b6102f8610379366004611886565b610b91565b6102f861038c3660046118e6565b610ba7565b6102ca60105481565b600d5460ff16610293565b6102686103b336600461173b565b610bd9565b6102ca60125481565b6102ca6103cf36600461191f565b60056020525f908152604090205481565b6102f8610c13565b6102f8610c26565b5f546001600160a01b0316610268565b61022a610c6f565b61029361041636600461191f565b600c6020525f908152604090205460ff1681565b6102f86104383660046118e6565b610c7c565b61029361044b366004611768565b610ce7565b6102f861045e366004611938565b610cfa565b6102f8610dba565b61022a61047936600461173b565b610dd1565b61022a610e2d565b6102ca6104943660046119cb565b600660209081525f928352604080842090915290825290205481565b6102f86104be3660046119fc565b610e3a565b6102ca6104d136600461191f565b60136020525f908152604090205481565b6001546001600160a01b0316610268565b6102936105013660046119cb565b600860209081525f928352604080842090915290825290205460ff1681565b6102f8610e4e565b6102f861053636600461191f565b610e62565b6102ca61054936600461191f565b60146020525f908152604090205481565b6002805461056790611a2e565b80601f016020809104026020016040519081016040528092919081815260200182805461059390611a2e565b80156105de5780601f106105b5576101008083540402835291602001916105de565b820191905f5260205f20905b8154815290600101906020018083116105c157829003601f168201915b505050505081565b5f60045482111580156105f857505f82115b156106cc575f828152600960205260409020546001600160a01b031633811480159061064757506001600160a01b0381165f90815260086020908152604080832033845290915290205460ff16155b15610664576040516282b42960e81b815260040160405180910390fd5b5f8381526007602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610727565b335f8181526006602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b610739610ed2565b601091909155601155565b6004548111610a54575f818152600960205260409020546001600160a01b0384811691161461078657604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0382166107ad57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b038416148015906107e957506001600160a01b0383165f90815260086020908152604080832033845290915290205460ff16155b801561080b57505f818152600760205260409020546001600160a01b03163314155b15610828576040516282b42960e81b815260040160405180910390fd5b610830610efe565b6001600160a01b0384165f9081526005602052604081208054909190610857908490611a7a565b909155506108659050610efe565b6001600160a01b038084165f81815260056020908152604080832080549096019095558582526009815284822080546001600160a01b031990811690941790556007815284822080549093169092559186168252600a905290812080546108ce90600190611a7a565b815481106108de576108de611a8d565b5f9182526020808320909101546001600160a01b0387168352600a82526040808420868552600b9093529092205481549293508392811061092157610921611a8d565b5f9182526020808320909101929092556001600160a01b0386168152600a9091526040902080548061095557610955611aa1565b5f828152602080822083015f19908101839055909201909255838252600b8152604080832054848452818420556001600160a01b038616808452600a835290832080546001818101835582865293852001869055925290546109b79190611a7a565b5f838152600b602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610a3d610efe565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526006602090815260408083203384529091529020545f198114610aad57610a898282611a7a565b6001600160a01b0385165f9081526006602090815260408083203384529091529020555b610ab8848484610f2f565b50505b505050565b610acb838383610744565b6001600160a01b0382163b15801590610b735750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610b42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b669190611ab5565b6001600160e01b03191614155b15610abb57604051633da6393160e01b815260040160405180910390fd5b610b99610ed2565b610ba38282611101565b5050565b610baf610ed2565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b5f818152600960205260409020546001600160a01b031680610c0e5760405163c5723b5160e01b815260040160405180910390fd5b919050565b610c1b610ed2565b610c245f61111a565b565b60015433906001600160a01b03168114610c635760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b610c6c8161111a565b50565b6003805461056790611a2e565b335f8181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610cf3338484610f2f565b9392505050565b610d05858585610744565b6001600160a01b0384163b15801590610d9c5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d4f9033908a90899089908990600401611adc565b6020604051808303815f875af1158015610d6b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8f9190611ab5565b6001600160e01b03191614155b15610ab857604051633da6393160e01b815260040160405180910390fd5b610dc2610ed2565b6015805460ff19166001179055565b60605f600f8054610de190611a2e565b905011610dfc5760405180602001604052805f81525061072b565b600f610e0783611133565b604051602001610e18929190611b2e565b60405160208183030381529060405292915050565b600f805461056790611a2e565b610e42610ed2565b600f610ba38282611c05565b610e56610ed2565b6015805460ff19169055565b610e6a610ed2565b600180546001600160a01b0383166001600160a01b03199091168117909155610e9a5f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b03163314610c245760405163118cdaa760e01b8152336004820152602401610c5a565b5f610f2a7f0000000000000000000000000000000000000000000000000000000000000012600a611da5565b905090565b5f610f386111c3565b60155460ff1615610f86576012548210610f865760405162461bcd60e51b815260206004820152600f60248201526e195e18d95959081d1e081b1a5b5a5d608a1b6044820152606401610c5a565b6001600160a01b0384165f908152600c602052604090205460ff1661103a576001600160a01b0384165f9081526014602052604081208054849290610fcc908490611db3565b90915550506011546001600160a01b0385165f90815260146020526040902054111561103a5760405162461bcd60e51b815260206004820152601b60248201527f6e6f7420616c6c6f77656420616e796d6f726520746f2073656c6c00000000006044820152606401610c5a565b6001600160a01b0383165f908152600c602052604090205460ff166110ee576001600160a01b0383165f9081526013602052604081208054849290611080908490611db3565b90915550506010546001600160a01b0384165f9081526013602052604090205411156110ee5760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420616c6c6f77656420616e796d6f726520746f206275790000000000006044820152606401610c5a565b6110f98484846111e7565b949350505050565b600261110d8382611c05565b506003610abb8282611c05565b600180546001600160a01b0319169055610c6c8161138c565b60605f61113f836113db565b60010190505f8167ffffffffffffffff81111561115e5761115e6117e9565b6040519080825280601f01601f191660200182016040528015611188576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461119257509392505050565b600d5460ff1615610c245760405163d93c066560e01b815260040160405180910390fd5b5f806111f1610efe565b6001600160a01b038087165f818152600560205260408082208054948a168352908220549282529394509192909186919061122c8386611a7a565b90915550506001600160a01b038087165f90815260056020908152604080832080548a019055928a168252600c9052205460ff166112bb576001600160a01b0387165f90815260056020526040812054611287908590611dc6565b6112918585611dc6565b61129b9190611a7a565b90505f5b818110156112b8576112b0896114b2565b60010161129f565b50505b6001600160a01b0386165f908152600c602052604090205460ff16611332575f6112e58483611dc6565b6001600160a01b0388165f90815260056020526040902054611308908690611dc6565b6113129190611a7a565b90505f5b8181101561132f57611327886115d3565b600101611316565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161137791815260200190565b60405180910390a35060019695505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106114195772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611445576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061146357662386f26fc10000830492506010015b6305f5e100831061147b576305f5e100830492506008015b612710831061148f57612710830492506004015b606483106114a1576064830492506002015b600a831061072b5760010192915050565b6001600160a01b0381166114d957604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f908152600a6020526040812080546114fe90600190611a7a565b8154811061150e5761150e611a8d565b905f5260205f2001549050600a5f836001600160a01b03166001600160a01b031681526020019081526020015f2080548061154b5761154b611aa1565b5f828152602080822083015f19908101839055909201909255828252600b815260408083208390556009825280832080546001600160a01b031990811690915560079092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6115db6111c3565b610c6c816001600160a01b03811661160657604051634e46966960e11b815260040160405180910390fd5b60048054600101908190555f818152600960205260409020546001600160a01b0316156116465760405163119b4fd360e11b815260040160405180910390fd5b5f81815260096020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600a8352908320805460018181018355828652938520018590559252905461169d9190611a7a565b5f828152600b602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f5b838110156117015781810151838201526020016116e9565b50505f910152565b602081525f82518060208401526117278160408501602087016116e7565b601f01601f19169190910160400192915050565b5f6020828403121561174b575f80fd5b5035919050565b80356001600160a01b0381168114610c0e575f80fd5b5f8060408385031215611779575f80fd5b61178283611752565b946020939093013593505050565b5f80604083850312156117a1575f80fd5b50508035926020909101359150565b5f805f606084860312156117c2575f80fd5b6117cb84611752565b92506117d960208501611752565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261180c575f80fd5b813567ffffffffffffffff80821115611827576118276117e9565b604051601f8301601f19908116603f0116810190828211818310171561184f5761184f6117e9565b81604052838152866020858801011115611867575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611897575f80fd5b823567ffffffffffffffff808211156118ae575f80fd5b6118ba868387016117fd565b935060208501359150808211156118cf575f80fd5b506118dc858286016117fd565b9150509250929050565b5f80604083850312156118f7575f80fd5b61190083611752565b915060208301358015158114611914575f80fd5b809150509250929050565b5f6020828403121561192f575f80fd5b610cf382611752565b5f805f805f6080868803121561194c575f80fd5b61195586611752565b945061196360208701611752565b935060408601359250606086013567ffffffffffffffff80821115611986575f80fd5b818801915088601f830112611999575f80fd5b8135818111156119a7575f80fd5b8960208285010111156119b8575f80fd5b9699959850939650602001949392505050565b5f80604083850312156119dc575f80fd5b6119e583611752565b91506119f360208401611752565b90509250929050565b5f60208284031215611a0c575f80fd5b813567ffffffffffffffff811115611a22575f80fd5b6110f9848285016117fd565b600181811c90821680611a4257607f821691505b602082108103611a6057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561072b5761072b611a66565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215611ac5575f80fd5b81516001600160e01b031981168114610cf3575f80fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f808454611b3b81611a2e565b60018281168015611b535760018114611b6857611b94565b60ff1984168752821515830287019450611b94565b885f526020805f205f5b85811015611b8b5781548a820152908401908201611b72565b50505082870194505b505050508351611ba88183602088016116e7565b64173539b7b760d91b9101908152600501949350505050565b601f821115610abb57805f5260205f20601f840160051c81016020851015611be65750805b601f840160051c820191505b81811015610ab8575f8155600101611bf2565b815167ffffffffffffffff811115611c1f57611c1f6117e9565b611c3381611c2d8454611a2e565b84611bc1565b602080601f831160018114611c66575f8415611c4f5750858301515b5f19600386901b1c1916600185901b178555611cbd565b5f85815260208120601f198616915b82811015611c9457888601518255948401946001909101908401611c75565b5085821015611cb157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b600181815b80851115611cff57815f1904821115611ce557611ce5611a66565b80851615611cf257918102915b93841c9390800290611cca565b509250929050565b5f82611d155750600161072b565b81611d2157505f61072b565b8160018114611d375760028114611d4157611d5d565b600191505061072b565b60ff841115611d5257611d52611a66565b50506001821b61072b565b5060208310610133831016604e8410600b8410161715611d80575081810a61072b565b611d8a8383611cc5565b805f1904821115611d9d57611d9d611a66565b029392505050565b5f610cf360ff841683611d07565b8082018082111561072b5761072b611a66565b5f82611de057634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122004cc7641a3ea63305c725dcccd930a0137a73430e19b46bd64168922a5763b1e64736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cac026da5ee667bc2074d26d7b9aedb3caea2f6b0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : _owner (address): 0xcaC026DA5EE667Bc2074d26D7b9AEdb3cAea2f6B
Arg [1] : _initialSupply (uint256): 10000
Arg [2] : _decimal (uint8): 18
Arg [3] : _buylimit (uint256): 100
Arg [4] : _selllimit (uint256): 100
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000cac026da5ee667bc2074d26d7b9aedb3caea2f6b
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode Sourcemap
44515:2384:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35593:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36304:46;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;36304:46:0;;;;;;-1:-1:-1;;;;;1019:32:1;;;1001:51;;989:2;974:18;36304:46:0;855:203:1;38135:642:0;;;;;;:::i;:::-;;:::i;:::-;;;1665:14:1;;1658:22;1640:41;;1628:2;1613:18;38135:642:0;1500:187:1;35829:36:0;;;;;;;;1838:25:1;;;1826:2;1811:18;35829:36:0;1692:177:1;44842:24:0;;;;;;;;;45313:145;;;;;;:::i;:::-;;:::i;:::-;;39184:1716;;;;;;:::i;:::-;;:::i;35729:31::-;;;;;;;;2632:4:1;2620:17;;;2602:36;;2590:2;2575:18;35729:31:0;2460:184:1;41196:405:0;;;;;;:::i;:::-;;:::i;35964:21::-;;;;;;44639:24;;;;;;46540:158;;;;;;:::i;:::-;;:::i;37464:111::-;;;;;;:::i;:::-;;:::i;44609:23::-;;;;;;27375:86;27446:7;;;;27375:86;;37647:193;;;;;;:::i;:::-;;:::i;44670:22::-;;;;;;36070:44;;;;;;:::i;:::-;;;;;;;;;;;;;;30748:103;;;:::i;33385:235::-;;;:::i;30073:87::-;30119:7;30146:6;-1:-1:-1;;;;;30146:6:0;30073:87;;35647:20;;;:::i;36915:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38828:207;;;;;;:::i;:::-;;:::i;40959:160::-;;;;;;:::i;:::-;;:::i;41696:437::-;;;;;;:::i;:::-;;:::i;45589:86::-;;;:::i;46706:190::-;;;;;;:::i;:::-;;:::i;44576:26::-;;;:::i;36184:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;46426:106;;;;;;:::i;:::-;;:::i;44699:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;32473:101;32553:13;;-1:-1:-1;;;;;32553:13:0;32473:101;;36415:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;45683:86;;;:::i;32773:181::-;;;;;;:::i;:::-;;:::i;44754:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;35593:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38135:642::-;38238:4;38273:6;;38259:10;:20;;:38;;;;;38296:1;38283:10;:14;38259:38;38255:491;;;38314:13;38330:20;;;:8;:20;;;;;;-1:-1:-1;;;;;38330:20:0;38371:10;:19;;;;;:59;;-1:-1:-1;;;;;;38395:23:0;;;;;;:16;:23;;;;;;;;38419:10;38395:35;;;;;;;;;;38394:36;38371:59;38367:121;;;38458:14;;-1:-1:-1;;;38458:14:0;;;;;;;;;;;38367:121;38504:23;;;;:11;:23;;;;;;;;;:33;;-1:-1:-1;;;;;;38504:33:0;-1:-1:-1;;;;;38504:33:0;;;;;;;;;38559:36;;1838:25:1;;;38559:36:0;;;;;;1811:18:1;38559:36:0;;;;;;;38299:308;38255:491;;;38638:10;38628:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;38628:30:0;;;;;;;;;;;;:43;;;38693:41;1838:25:1;;;38628:30:0;;38638:10;38693:41;;1811:18:1;38693:41:0;;;;;;;38255:491;-1:-1:-1;38765:4:0;38135:642;;;;;:::o;45313:145::-;29959:13;:11;:13::i;:::-;45397:8:::1;:20:::0;;;;45428:9:::1;:22:::0;45313:145::o;39184:1716::-;39330:6;;39316:10;:20;39312:1581;;39365:20;;;;:8;:20;;;;;;-1:-1:-1;;;;;39357:28:0;;;39365:20;;39357:28;39353:91;;39413:15;;-1:-1:-1;;;39413:15:0;;;;;;;;;;;39353:91;-1:-1:-1;;;;;39464:16:0;;39460:82;;39508:18;;-1:-1:-1;;;39508:18:0;;;;;;;;;;;39460:82;39580:10;-1:-1:-1;;;;;39580:18:0;;;;;;:74;;-1:-1:-1;;;;;;39620:22:0;;;;;;:16;:22;;;;;;;;39643:10;39620:34;;;;;;;;;;39619:35;39580:74;:132;;;;-1:-1:-1;39689:23:0;;;;:11;:23;;;;;;-1:-1:-1;;;;;39689:23:0;39675:10;:37;;39580:132;39558:226;;;39754:14;;-1:-1:-1;;;39754:14:0;;;;;;;;;;;39558:226;39819:10;:8;:10::i;:::-;-1:-1:-1;;;;;39800:15:0;;;;;;:9;:15;;;;;:29;;:15;;;:29;;;;;:::i;:::-;;;;-1:-1:-1;39892:10:0;;-1:-1:-1;39892:8:0;:10::i;:::-;-1:-1:-1;;;;;39875:13:0;;;;;;;:9;:13;;;;;;;;:27;;;;;;;;39934:20;;;:8;:20;;;;;:25;;-1:-1:-1;;;;;;39934:25:0;;;;;;;;39981:11;:23;;;;;39974:30;;;;;;;;40082:12;;;;;:6;:12;;;;;40095:19;;:23;;-1:-1:-1;;40095:23:0;:::i;:::-;40082:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;40134:12:0;;;;:6;:12;;;;;;40147:23;;;:11;:23;;;;;;;40134:37;;40082;;-1:-1:-1;40082:37:0;;40134;;;;;;:::i;:::-;;;;;;;;;;;;:49;;;;-1:-1:-1;;;;;40218:12:0;;;;:6;:12;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;40218:18:0;;;;;;;;;;;;40322:23;;;:11;:23;;;;;;;40297:22;;;;;;:48;-1:-1:-1;;;;;40399:10:0;;;;;:6;:10;;;;;:27;;40218:18;40399:27;;;;;;;;;;;;;;;40509:10;;:17;;:21;;40218:18;40509:21;:::i;:::-;40483:23;;;;:11;:23;;;;;;:47;;;;40552:30;;40495:10;;-1:-1:-1;;;;;40552:30:0;;;;;;;;;;;40622:2;-1:-1:-1;;;;;40602:35:0;40616:4;-1:-1:-1;;;;;40602:35:0;;40626:10;:8;:10::i;:::-;40602:35;;1838:25:1;;;1826:2;1811:18;40602:35:0;;;;;;;39338:1311;39184:1716;;;:::o;39312:1581::-;-1:-1:-1;;;;;40688:15:0;;40670;40688;;;:9;:15;;;;;;;;40704:10;40688:27;;;;;;;;-1:-1:-1;;40736:28:0;;40732:101;;40813:20;40823:10;40813:7;:20;:::i;:::-;-1:-1:-1;;;;;40783:15:0;;;;;;:9;:15;;;;;;;;40799:10;40783:27;;;;;;;:50;40732:101;40850:31;40860:4;40866:2;40870:10;40850:9;:31::i;:::-;;40655:238;39312:1581;39184:1716;;;:::o;41196:405::-;41320:26;41333:4;41339:2;41343;41320:12;:26::i;:::-;-1:-1:-1;;;;;41377:14:0;;;:19;;;;:154;;-1:-1:-1;41413:61:0;;-1:-1:-1;;;41413:61:0;;;41449:10;41413: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;41491:40:0;;41413:35;;;;41491:40;;7445:19:1;;41413:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;41413:118:0;;;41377:154;41359:235;;;41565:17;;-1:-1:-1;;;41565:17:0;;;;;;;;;;;46540:158;29959:13;:11;:13::i;:::-;46660:30:::1;46675:5;46682:7;46660:14;:30::i;:::-;46540:158:::0;;:::o;37464:111::-;29959:13;:11;:13::i;:::-;-1:-1:-1;;;;;37542:17:0;;;::::1;;::::0;;;:9:::1;:17;::::0;;;;:25;;-1:-1:-1;;37542:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37464:111::o;37647:193::-;37705:13;37739:12;;;:8;:12;;;;;;-1:-1:-1;;;;;37739:12:0;;37764:69;;37811:10;;-1:-1:-1;;;37811:10:0;;;;;;;;;;;37764:69;37647:193;;;:::o;30748:103::-;29959:13;:11;:13::i;:::-;30813:30:::1;30840:1;30813:18;:30::i;:::-;30748:103::o:0;33385:235::-;32553:13;;25234:10;;-1:-1:-1;;;;;32553:13:0;33482:24;;33478:98;;33530:34;;-1:-1:-1;;;33530:34:0;;-1:-1:-1;;;;;1019:32:1;;33530:34:0;;;1001:51:1;974:18;;33530:34:0;;;;;;;;33478:98;33586:26;33605:6;33586:18;:26::i;:::-;33427:193;33385:235::o;35647:20::-;;;;;;;:::i;38828:207::-;38931:10;38914:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;38914:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;38914:49:0;;;;;;;;;;38981:46;;1640:41:1;;;38914:38:0;;38931:10;38981:46;;1613:18:1;38981:46:0;;;;;;;38828:207;;:::o;40959:160::-;41054:4;41078:33;41088:10;41100:2;41104:6;41078:9;:33::i;:::-;41071:40;40959:160;-1:-1:-1;;;40959:160:0:o;41696:437::-;41850:26;41863:4;41869:2;41873;41850:12;:26::i;:::-;-1:-1:-1;;;;;41907:14:0;;;:19;;;;:156;;-1:-1:-1;41943:63:0;;-1:-1:-1;;;41943:63:0;;;42023:40;-1:-1:-1;;;;;41943:35:0;;;42023:40;;41943:63;;41979:10;;41991:4;;41997:2;;42001:4;;;;41943:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;41943:120:0;;;41907:156;41889:237;;;42097:17;;-1:-1:-1;;;42097:17:0;;;;;;;;;;;45589:86;29959:13;:11;:13::i;:::-;45648:12:::1;:19:::0;;-1:-1:-1;;45648:19:0::1;45663:4;45648:19;::::0;;45589:86::o;46706:190::-;46766:13;46828:1;46805:12;46799:26;;;;;:::i;:::-;;;:30;:89;;;;;;;;;;;;;;;;;46846:12;46860:13;:2;:11;:13::i;:::-;46832:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46792:96;46706:190;-1:-1:-1;;46706:190:0:o;44576:26::-;;;;;;;:::i;46426:106::-;29959:13;:11;:13::i;:::-;46500:12:::1;:24;46515:9:::0;46500:12;:24:::1;:::i;45683:86::-:0;29959:13;:11;:13::i;:::-;45741:12:::1;:20:::0;;-1:-1:-1;;45741:20:0::1;::::0;;45683:86::o;32773:181::-;29959:13;:11;:13::i;:::-;32863::::1;:24:::0;;-1:-1:-1;;;;;32863:24:0;::::1;-1:-1:-1::0;;;;;;32863:24:0;;::::1;::::0;::::1;::::0;;;32928:7:::1;30119::::0;30146:6;-1:-1:-1;;;;;30146:6:0;;30073:87;32928:7:::1;-1:-1:-1::0;;;;;32903:43:0::1;;;;;;;;;;;32773:181:::0;:::o;30238:166::-;30119:7;30146:6;-1:-1:-1;;;;;30146:6:0;25234:10;30298:23;30294:103;;30345:40;;-1:-1:-1;;;30345:40:0;;25234:10;30345:40;;;1001:51:1;974:18;;30345:40:0;855:203:1;43341:92:0;43384:7;43411:14;43417:8;43411:2;:14;:::i;:::-;43404:21;;43341:92;:::o;45777:641::-;45921:4;26980:19;:17;:19::i;:::-;45940:12:::1;::::0;::::1;;45937:87;;;45985:7;;45976:6;:16;45968:44;;;::::0;-1:-1:-1;;;45968:44:0;;13368:2:1;45968: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;;45968:44:0::1;13166:339:1::0;45968:44:0::1;-1:-1:-1::0;;;;;46038:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;::::1;;46034:163;;-1:-1:-1::0;;;;;46069:19:0;::::1;;::::0;;;:13:::1;:19;::::0;;;;:29;;46092:6;;46069:19;:29:::1;::::0;46092:6;;46069:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;46144:9:0::1;::::0;-1:-1:-1;;;;;46121:19:0;::::1;;::::0;;;:13:::1;:19;::::0;;;;;:32:::1;;46113:72;;;::::0;-1:-1:-1;;;46113:72:0;;13842:2:1;46113:72:0::1;::::0;::::1;13824:21:1::0;13881:2;13861:18;;;13854:30;13920:29;13900:18;;;13893:57;13967:18;;46113:72:0::1;13640:351:1::0;46113:72:0::1;-1:-1:-1::0;;;;;46211:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;;::::1;;46207:153;;-1:-1:-1::0;;;;;46240:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;:26;;46260:6;;46240:16;:26:::1;::::0;46260:6;;46240:26:::1;:::i;:::-;::::0;;;-1:-1:-1;;46309:8:0::1;::::0;-1:-1:-1;;;;;46289:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;;:28:::1;;46281:67;;;::::0;-1:-1:-1;;;46281:67:0;;14198:2:1;46281:67:0::1;::::0;::::1;14180:21:1::0;14237:2;14217:18;;;14210:30;14276:28;14256:18;;;14249:56;14322:18;;46281:67:0::1;13996:350:1::0;46281:67:0::1;46377:33;46393:4;46399:2;46403:6;46377:15;:33::i;:::-;46370:40:::0;45777:641;-1:-1:-1;;;;45777:641:0:o;44304:160::-;44417:4;:12;44424:5;44417:4;:12;:::i;:::-;-1:-1:-1;44440:6:0;:16;44449:7;44440:6;:16;:::i;33144:156::-;33234:13;33227:20;;-1:-1:-1;;;;;;33227:20:0;;;33258:34;33283:8;33258:24;:34::i;21924:718::-;21980:13;22031:14;22048:17;22059:5;22048:10;:17::i;:::-;22068:1;22048:21;22031:38;;22084:20;22118:6;22107:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22107:18:0;-1:-1:-1;22084:41:0;-1:-1:-1;22249:28:0;;;22265:2;22249:28;22306:290;-1:-1:-1;;22338:5:0;-1:-1:-1;;;22475:2:0;22464:14;;22459:32;22338:5;22446:46;22538:2;22529:11;;;-1:-1:-1;22559:21:0;22306:290;22559:21;-1:-1:-1;22617:6:0;21924:718;-1:-1:-1;;;21924:718:0:o;27534:132::-;27446:7;;;;27596:63;;;27632:15;;-1:-1:-1;;;27632:15:0;;;;;;;;;;;42201:1101;42322:4;42339:12;42354:10;:8;:10::i;:::-;-1:-1:-1;;;;;42405:15:0;;;42375:27;42405:15;;;:9;:15;;;;;;;;42463:13;;;;;;;;;42489:15;;;42339:25;;-1:-1:-1;42405:15:0;;42463:13;;42508:6;;42405:15;42489:25;42508:6;42405:15;42489:25;:::i;:::-;;;;-1:-1:-1;;;;;;;42552:13:0;;;;;;;:9;:13;;;;;;;;:23;;;;;;42660:15;;;;;:9;:15;;;;;;42655:251;;-1:-1:-1;;;;;42766:15:0;;42692:22;42766:15;;;:9;:15;;;;;;:22;;42784:4;;42766:22;:::i;:::-;42718:26;42740:4;42718:19;:26;:::i;:::-;42717:72;;;;:::i;:::-;42692:97;;42809:9;42804:91;42828:14;42824:1;:18;42804:91;;;42868:11;42874:4;42868:5;:11::i;:::-;42844:3;;42804:91;;;;42677:229;42655:251;-1:-1:-1;;;;;42982:13:0;;;;;;:9;:13;;;;;;;;42977:247;;43012:22;43080:28;43104:4;43080:21;:28;:::i;:::-;-1:-1:-1;;;;;43038:13:0;;;;;;:9;:13;;;;;;:20;;43054:4;;43038:20;:::i;:::-;43037:72;;;;:::i;:::-;43012:97;;43129:9;43124:89;43148:14;43144:1;:18;43124:89;;;43188:9;43194:2;43188:5;:9::i;:::-;43164:3;;43124:89;;;;42997:227;42977:247;43261:2;-1:-1:-1;;;;;43241:31:0;43255:4;-1:-1:-1;;;;;43241:31:0;;43265:6;43241:31;;;;1838:25:1;;1826:2;1811:18;;1692:177;43241:31:0;;;;;;;;-1:-1:-1;43290:4:0;;42201:1101;-1:-1:-1;;;;;;42201:1101:0:o;31386:191::-;31460:16;31479:6;;-1:-1:-1;;;;;31496:17:0;;;-1:-1:-1;;;;;;31496:17:0;;;;;;31529:40;;31479:6;;;;;;;31529:40;;31460:16;31529:40;31449:128;31386:191;:::o;18328:948::-;18381:7;;-1:-1:-1;;;18459:17:0;;18455:106;;-1:-1:-1;;;18497:17:0;;;-1:-1:-1;18543:2:0;18533:12;18455:106;18588:8;18579:5;:17;18575:106;;18626:8;18617:17;;;-1:-1:-1;18663:2:0;18653:12;18575:106;18708:8;18699:5;:17;18695:106;;18746:8;18737:17;;;-1:-1:-1;18783:2:0;18773:12;18695:106;18828:7;18819:5;:16;18815:103;;18865:7;18856:16;;;-1:-1:-1;18901:1:0;18891:11;18815:103;18945:7;18936:5;:16;18932:103;;18982:7;18973:16;;;-1:-1:-1;19018:1:0;19008:11;18932:103;19062:7;19053:5;:16;19049:103;;19099:7;19090:16;;;-1:-1:-1;19135:1:0;19125:11;19049:103;19179:7;19170:5;:16;19166:68;;19217:1;19207:11;19262:6;18328:948;-1:-1:-1;;18328:948:0:o;43923:373::-;-1:-1:-1;;;;;43984:18:0;;43980:73;;44026:15;;-1:-1:-1;;;44026:15:0;;;;;;;;;;;43980:73;-1:-1:-1;;;;;44078:12:0;;44065:10;44078:12;;;:6;:12;;;;;44091:19;;:23;;44113:1;;44091:23;:::i;:::-;44078:37;;;;;;;;:::i;:::-;;;;;;;;;44065:50;;44126:6;:12;44133:4;-1:-1:-1;;;;;44126:12:0;-1:-1:-1;;;;;44126:12:0;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;44126:18:0;;;;;;;;;;;;44162:15;;;:11;:15;;;;;;44155:22;;;44195:8;:12;;;;;44188:19;;-1:-1:-1;;;;;;44188:19:0;;;;;;44225:11;:15;;;;;;44218:22;;;;;;;;44258:30;44174:2;;44126:18;-1:-1:-1;;;;;44258:30:0;;;;;44126:18;;44258:30;43969:327;43923:373;:::o;45466:115::-;26980:19;:17;:19::i;:::-;45558:15:::1;45570:2;-1:-1:-1::0;;;;;43500:16:0;;43496:74;;43540:18;;-1:-1:-1;;;43540:18:0;;;;;;;;;;;43496:74;43607:6;:8;;;;;;;;:6;43675:12;;;:8;:12;;;;;;-1:-1:-1;;;;;43675:12:0;:26;43671:81;;43725:15;;-1:-1:-1;;;43725:15:0;;;;;;;;;;;43671:81;43764:12;;;;:8;:12;;;;;;;;:17;;-1:-1:-1;;;;;;43764:17:0;-1:-1:-1;;;;;43764:17:0;;;;;;;;43792:10;;;:6;:10;;;;;:19;;-1:-1:-1;43792:19:0;;;;;;;;;;;;;;;43840:10;;:17;;:21;;-1:-1:-1;43840:21:0;:::i;:::-;43822:15;;;;:11;:15;;;;;;:39;;;;43879:28;;43834:2;;-1:-1:-1;;;;;43879:28:0;;;;;43822:15;;43879:28;43485:430;43441: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://04cc7641a3ea63305c725dcccd930a0137a73430e19b46bd64168922a5763b1e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.